|
Początki
Idea wieloprocesorowych maszyn i ich programowania nie są bardzo nowe. Już na początku lat 50-tych zbudowano na Uniwersytecie Illinois w Urbana Champaign szybki komputer zwany Illiac, oparty na architekturze von Neumanna. Był to pierwszy superkomputer używany do rozwiązywania problemów naukowych. Maszyna ważyła około 5 ton i zawierała 2800 lamp. Pamięć główna liczyła 5 kilobajtów, a bęben 64K.
Następna konstrukcja tej maszyny w roku 1960, o nazwie Illiac IV, była już maszyną wieloprocesorową z maksymalną liczbą procesorów 256. Była to najszybsza maszyna świata, używana do obliczeń aerodynamicznych.
Illiac IV zapoczątkował erę maszyn wektorowych, które były reprezentowane przez CDC 6600, CDC 7600 i później CRAY 1.
Przełomowym wynalazkiem, który dał początek maszynom wektorowym był specjalny procesor typu pipeline imitujący przemysłowy system taśmy produkcyjnej. Jest to jedna z metod równoległych obliczeń stosowana w rozwiązaniach sprzętowych współczesnych komputerów. Tak więc, na początku lat 1960 istniały już przemysłowo produkowane superkomputery używane w USA przez duże laboratoria ( NASA, Los Alamos National Laboratories, itp.) oraz przez firmy przemysłowe takie jak: The Boeing Aerospace Company.
Maszyny te były bardzo kosztowne (kilkanaście milionów dolarów) i kilka firm sprzedawało usługę korzystania z nich tym firmom, które miały potrzeby, ale nie mogły pozwolić sobie na zakup własnej maszyny.
W tym też czasie dołączyła się do superkomputerowego wyścigu Japonia. Japońskie firmy Nippon Electric Company, Hitachi i Fujitsu produkowały wektorowe maszyny o porównywalnej prędkości obliczeń do maszyn amerykańskich. Jeden z japońskich superkomputerów wektorowych był do niedawna najszybszą maszyną świata (Earth Simulator).
Okres dojrzewania: 1970-1990
Maszyny wektorowe osiągnęły szczyt w ciągu trzech dekad: 1970-90.
Pod koniec tego czasu były już wieloprocesorowe wersje maszyn wektorowych. Cray X MP posiadał jeden procesor, a na początku lat 90-tych Cray-Y-MP miał już 2, 4 lub 8 procesorow. Każdy z procesorow miał kilka arytmetycznych elementów liczących. Maksymalna szybkość Cray Y-MP wynosiła około 333 MFlops ( MFlops to milion arytmetycznych operacji zmiennoprzecinkowych na sekundę). Następcą Cray Y-MP był Cray C90 oraz szybszy CrayT90.
W okresie lat 1970-1990, równocześnie z rozwojem maszyn wektorowych, powstawały różne architektury komputerowe, z których najważniejsze były: wieloprocesorowe maszyny z rozproszoną pamięcią .Najprostsze maszyny wieloprocesorowe zwane SMP (Shared Memory Processors) napotkały na ograniczenie liczby procesorów, które mogły wykorzystywać wspólną pamięć oraz posiadały tzw. bus - przewód łączący procesory ze wspólną pamięcią. Maszyny te były ograniczone do około 32 procesorów i były dość popularne w przemyśle ze względu na proste programowanie, nie różniące się zbytnio od programowania jednoprocesorowych komputerów.
Aby uniknąć ograniczenia maszyn SMP, powstały równocześnie wieloprocesorowe komputery z pamięcią fizycznie rozproszoną, ale ciągle tylko z jedną przestrzenią adresową. Maszyny te uzyskały nazwę NUMA (NonUniform Memory Access) i pozwoliły na dalsze zwiększenie liczby procesorów współpracujących nad rozwiązaniem dużych problemów.

Schemat maszyn typu SMP i NUMA
Niezależnie od komputerów typu NUMA powstały maszyny z bardzo dużą liczbą prostych procesorów, które tylko mogły wykonać równolegle ten sam ciąg instrukcji. Przykładem była Thinking Machine, która nie uzyskała szerszego zastosowania i opuściła wyścig superkomputerowy.
Wsółczesna rewolucja
Współczesna rewolucja komputerowa nastąpiła w roku 1994, kiedy w NASA Goddard Space Flight Center zbudowano pierwszy na świecie klaster, który osiągnął prędkość 1 GigaFlops (1 miliard operacji zmiennoprzecinkowych na sekundę). Składał się z 16 komputerów połączonych standardową siecią Ethernet. Koszt jego wynosił zaledwie 40000 dolarów, a jego osiągnięcia były porównywalne do superkomputera kosztującego milion dolarów. Ten rewolucyjny eksperyment zmienił świat obliczeń na zawsze. System został nazwany Beowulf i zapoczątkował obecny, gwałtowny i światowy rozwój równoległych obliczeń oraz popularności klastrów, które składają się z setek lub nawet tysięcy procesorów Intela lub innych komercjalnych firm, produkujących procesory.
Rewolucja, która zaczęła się w 1994 roku, opiera się na dwóch fundamentalnych faktach. Jeden to możliwość budowania niedrogich, lecz potężnych komputerów, a drugi to skorzystanie z Prawa Gordon Moore'a, założyciela firmy Intel, które głosi, że szybkość mikroprocesorów będzie wzrastała wykładniczo. Podwojenie szybkości nastąpi co 18 miesięcy.
Rewolucja komputerowa w latach 90-tych włącza również inne fakty, które popchnęły rozwój superkomputerów oraz uczyniły możliwym dostęp naukowcom i przemysłowi do olbrzymich mocy obliczeniowych.
Są to:
(a) bezpłatny system operacyjny Linux.
Linux jest już obecnie najpopularniejszym systemem operacyjnym klastrów.
(b) Olbrzymi postęp w szybkości sieci łączących komputery: Fast Ethernet, Gigabit Ethernet oraz systemy szybsze, ale droższe, np.: InfiniBand.
(c) Powstanie dwóch standardowych systemów do programowania maszyn wieloprocesorowych i wielokomputerowych. Są to OpenMP do programowania maszyn ze wspólną pamięcią (shared memory computers) oraz MPI (Message Passing Interface) do programowania klastrów, w których komputery nie mają wspólnej pamięci i porozumiewają się przez wymianę komunikatów (Message Passing).
(d) Powstanie wielordzeniowych procesorów, które urzeczywistniają równoległe liczenie na najniższym poziomie procesora wykonującego instrukcje maszynowe.
Wszystko to składa się na niepowstrzymany postęp zastosowań wieloprocesorowych i wielokomputerowych maszyn w przemyśle, nauce i biznesie. Niestety powstały też nowe problemy i wyzwania.
Dwa czołowe problemy, przed którymi stoimy obecnie to:
(a) jak zastosować techniki obliczeń równoległych do istniejących obecnie programów sekwencyjnych, skonstruowanych dla maszyn jednoprocesorowych;
(b) jak uczyć istniejących i nowych programistów technik obliczeń równoległych, od konstrukcji algorytmów do wykonania równoległych kodów.
Pierwszy problem dotyczy wszystkich użytkowników w przemyśle, nauce i biznesie.
Drugi to głównie problem dla uniwersytetów i innych ośrodków uczących inżynierii oprogramowania.
Jest rzeczą niemal oczywistą, że programy równoległe są trudniejsze do konstrukcji i wykrycia błędów niż programy sekwencyjne. Problem przekształcenia poprawnego programu jednoprocesorowego na program równoległy zależy od tego, czy równoległa maszyna posiada wspólną pamięć, czy też jest to agregat niezależnych komputerów, jakim jest na przykład każdy klaster.
W wypadku maszyn wieloprocesorowych ze wspólną pamięcią zastosowanie technik obliczeń równoległych polega na użyciu dyrektyw systemu Open MP. A więc zadanie często polega na analizie pętli (iteration loops) w programie i dodaniu dyrektyw dotyczących równoległego wykonania fragmentów programu. Jest to stosunkowo prosta czynność, która pozwala na przystosowanie części programów zawierające większość obliczeń. Open MP pozwala też na równoległe wykonanie segmentów kodu, które są zblokowanymi zbiorami instrukcji, ale nie pętlami.
Inną atrakcyjną właściwością OpenMP jest możliwość stopniowego, cześć po części, zastosowania techniki obliczeń równoległych do programu sekwencyjnego.
Równocześnie z łatwością tego procesu powstaje trudniejszy problem znalezienia i usunięcia błędów. Tutaj Open MP jest trudny, ponieważ programista nie decyduje sam o wielu decyzjach kompilatora. Pomimo tego, przekształcenie jednoprocesorowego programu na równoległy przy użyciu OpenMP jest stosunkowo łatwe i szybkie. Najwięcej czasu zabiera analiza pętli i wykrycie zależności danych lub ustalenie konieczności zastosowania tzw. krytycznego regionu.
Zmiany z programów sekwencyjnych na równoległe dla klastrów to zadanie trudniejsze i wymagające często fundamentalnych transformacji algorytmicznych, a nie tylko zmian kodu. Przed użyciem MPI trzeba przemyśleć i wykryć równoległość algorytmu lub zmienić algorytm na nowy, który zawiera więcej równoległości. Skonstruowanie programu łączącego MPI z C/C++ lub Fortranem składa się ogólnie z kilku kroków.
Pierwszym krokiem jest podział danych lub funkcji kodu, które mogą być policzone równolegle. Następnym krokiem jest analiza wymiany informacji pomiędzy procesami obliczeniowymi. Końcowym krokiem jest ustalenie, które procesy będą liczone przez fizyczne procesory, w danej konfiguracji maszyny. W sumie przekształcenie kodu sekwencyjnego na kod dla klastra jest często zupełną zmianą algorytmu i kolejności obliczeń. W rezultacie kod równoległy często nie przypomina kodu sekwencyjnego rozwiązującego ten sam problem.
Drugi problem dotyczy nauczania technik równoległych obliczeń na uniwersytetach na kursach inżynierii oprogramowania (Software Engineering). Komputery wieloprocesorowe są używane do rozwiązywania złożonych problemów, a takich uczelnie często nie mają. Typowy kurs programowania zawiera kilka lub kilkanaście małych przykładów, które nie odzwierciedlają trudności rozwiązania skomplikowanych zadań tego samego rodzaju. Tak na przykład możemy nauczyć studentów metody Gaussa do rozwiązywania układów równań liniowych i jako ćwiczenie polecić im rozwiązanie układu stu równań przy użyciu kilku procesorów. Takie doświadczenie jest mało użyteczne, kiedy trzeba rozwiązać 100,000 równań, ponieważ zmienia się metoda obliczeń (sparse matrix methods), jak też metoda składowania danych w pamięci. Spotykamy się tu z nowym zjawiskiem obliczeń, które można nazwać czynnikiem Skali Problemu. W dużym skrócie możemy to ująć tak: Złożoność problemu do rozwiązania na komputerze wpływa bardzo istotnie na użytą metodę numeryczna, sposób użycia pamięci komputera oraz na konstrukcję programu. Technika rozwiązania nieskomplikowanego problemu i złożonego są na ogół zupełnie różne i wymagają często zastosowania innych reguł matematyki i programowania. Jest to żelazne prawo Skali Problemu.
Aby nauczyć studentów, jak się rozwiązuje się duże problemy na równoległych komputerach, potrzebny jest nie tylko dostęp do takich maszyn, ale też potrzebne są przykłady realnych, złożonych problemów, które są spotykane w zastosowaniach naukowych, technicznych i biznesu. Dość oczywistym wnioskiem wypływającym z tego wymagania jest konieczność współpracy uniwersytetów z przemysłem i biznesem, gdzie te duże problemy powstają w sposób naturalny. Współpraca ta jest niezbędna dla uczelni i bardzo pomocna dla przemysłu i biznesu, gdzie często nie ma czasu na studiowanie
zaawansowanych metod obliczeniowych i używa się tradycyjnej, mało dokładnej i ograniczającej rozmiar problemu metody, zamiast skutecznych rozwiązań. Tak więc sukces zastosowań równoległych superkomputerów musi opierać się na współpracy pomiędzy uczelniami i światem pozaakademickim w skali krajowej i międzynarodowej.
Czasy, kiedy akademiccy naukowcy pracowali tylko w swoich zacisznych pokojach uniwersytetów i nie wychylali głowy poza uczelnie, już dawno minęły. Obecnie większość wartościowych prac w dziedzinie informatyki i matematyki stosowanej są to prace grup,
które włączają akademików oraz pracowników przemysłu i biznesu. Prace zlecone to też tylko półśrodek. Współpraca musi włączyć profesorów, studentów starszych lat oraz naukowców z przemysłu i biznesu, którzy maja prawdziwe problemy do rozwiązania.
Prośba autora
Autor artykułu prosi czytelnika o komentarze z konstruktywną oceną tego artykułu. Czy jest on jasny i zawiera pożyteczne informacje.
Co można zmienić, aby spełnił w zupełności oczekiwania czytelnika?
Dr. Janusz Kowalik
Ten adres email jest ukrywany przed spamerami, włącz obsługę JavaScript w przeglądarce, by go zobaczyć
Wizytujący Profesor (Seattle, USA)
Uniwersytet Gdański
Instytut Informatyki
|