Wielordzeniowe procesory

Masowa popularyzacja procesorów wielordzeniowych wywołuje dyskusję na temat tego jak należy zmienić kierunki edukacji programistów i przyspieszyć proces opracowywania narzędzi ułatwiających programowanie równoległe i przetwarzanie wielowątkowe.

Masowa popularyzacja procesorów wielordzeniowych wywołuje dyskusję na temat tego jak należy zmienić kierunki edukacji programistów i przyspieszyć proces opracowywania narzędzi ułatwiających programowanie równoległe i przetwarzanie wielowątkowe.

Zakup nowego komputera wyposażonego w kolejny model procesora o większej niż dotąd liczbie rdzeni CPU ma sens przede wszystkim wtedy, gdy ktoś często korzysta z aplikacji zoptymalizowanych pod kątem wielowątkowości. Jest to prawda znana i nieco częściej powtarzana od momentu, gdy układy wielordzeniowe zaczęły być instalowane w popularnych, masowo sprzedawanych serwerach, a obecnie również komputerach PC i notebookach.

Niestety aplikacje takie wciąż są mało popularne, a taki stan rzeczy będzie trwał jeszcze przynajmniej przez kilka następnych lat, chyba że sposób tworzenia oprogramowania radykalnie się zmieni i obsługa wielowątkowości stanie się standardem. "Większość użytkowników popularnych programów niewiele zyska na wprowadzeniu nowych architektur sprzętowych bez poważnej przebudowy oprogramowania" - przyznaje Herb Sutter, architekt z Microsoftu.

Zdają sobie z tego sprawę również producenci procesorów, którzy coraz głośniej mówią m.in. o konieczności poważnych zmian w programach edukacji programistów, a także podejmują działania mające przyspieszyć ten proces, jak np. inicjatywa Intela, który zapowiedział, że do końca 2008 r. chce uruchomić specjalne programy nauczania w ponad 400 współpracujących z tą firmą uczelniach na całym świecie.

Programowanie równoległe na ratunek

Jednoczesne działanie wielu aplikacji w systemie o kilku rdzeniach nie ma żadnego związku z programowaniem równoległym. Wprawdzie zauważalna jest poprawa komfortu pracy podczas przełączania się między poszczególnymi programami, ale nie oznacza to, że są one "świadome" prawdziwych możliwości procesora i że są w stanie je wykorzystać.

Umożliwia to natomiast programowanie równoległe, czyli projektowanie, implementację i ulepszanie programów działających na systemach równoległych wyposażonych w więcej niż jeden procesor lub element przechowujący dane.

Większość czasu pracy procesora przeznaczana jest zwykle na obliczenia w pętlach. Najbardziej popularne, a zarazem najmniej złożone, są algorytmy sortowania i przeszukiwania przetwarzające w sposób sekwencyjny kolekcje (tablice, wektory, listy). Działają one dobrze w maszynach z jednym rdzeniem, ale ich uruchamianie w środowisku wielordzeniowym/wieloprocesorowym można nazwać marnotrawieniem zasobów.

Pracę polegającą np. na przeszukiwaniu tablicy w środowisku dwurdzeniowym lepiej rozdzielić na dwa wątki, bo tylko wtedy czas oczekiwania na wynik końcowy można skrócić o połowę.

Teoretyczny pesymizm

Niestety nie można w nieskończoność "zrównoleglać" programów, więc systematyczne podwajanie liczby dostępnych rdzeni w nowych modelach procesorów nie przyspiesza automatycznie w tym samym stopniu wydajności aplikacji. Gene Amdahl, inżynier z IBM sformułował jedno z podstawowych praw dotyczące programowania równoległego i rozproszonego.

Podzielił instrukcje kodu na dwie części - sekwencyjną (niedającą się zrównoleglić) oraz równoległą i zauważył, że zwiększanie liczby procesorów/rdzeni skraca czas przetwarzania części równoległej programu do coraz mniejszej wartości. Zawsze pozostaje jednak część sekwencyjna kodu, której czas wykonania, pomimo dodawania do systemu kolejnych rdzeni, nie ulega zmianie.

Prawo Amdahla wprowadza wzór, który pozwala na wyznaczenie maksymalnego przyspieszenia wykonywania programu równoległego. Zgodnie z nim, jeśli uda nam się zrównoleglić połowę programu, to przyspieszenie będzie najwyżej dwukrotne. Przy zrównolegleniu 25% programu maksymalne przyspieszenie nie przekroczy 33%.

Wielordzeniowe procesory
Czy oznacza to, że zrównoleglanie aplikacji jest nieopłacalne i lepiej wybrać inną strategię przyspieszania działania aplikacji. Pojawiają się takie opinie. Na przykład Alexandra Weber Morales w felietonie dla portalu DevX rozważa inną możliwość - wykonywanie obliczeń z wyprzedzeniem. "Przewidywanie wykonania programu to bardzo efektywny sposób na wykorzystanie «dodatkowych» cyklów obliczeniowych. Superskalarne procesory już robią to w sposób niejawny. Wielordzeniowe procesory wprowadzają «dodatkowe» cykle na zupełnie inny poziom i uważam, że wreszcie dają okazję do przewidywania na większą niż dotąd skalę".

Programiści nie lubią równoległego kodu

Kang Su Gatlin i Pete Isensee w swoim artykule na łamach MSDN Magazine przytaczają powiedzenie krążące w środowisku osób zajmujących się programowaniem równoległym: "programowanie równoległe to przyszłość… i zawsze tak będzie". Doskonale przedstawia ono stosunek większości programistów do pracy z wieloma wątkami. Nawet przy stosowaniu języków wysokiego poziomu ich obsługa jest niewygodna i skomplikowana. Ale nawet w przypadku aplikacji desktopowych wielowątkowość jest obecna w programach, choć tylko po to, by nie dochodziło do "zamrożenia" interfejsu użytkownika.

Dlaczego programiści mają niechętny stosunek do programowania równoległego dobrze przedstawia dyskusja na ten temat na forum portalu Slashdot. "Chodzi o to, że pisanie wielowątkowych aplikacji nie jest szczególnie trudne, jest ono jednak o wiele trudniejsze niż pisanie programów jednowątkowych. Nagle trzeba wprowadzać blokady we wszystkich współdzielonych strukturach danych i upewnić się, że są one respektowane w całym programie. Te szczegóły w znaczny sposób zwiększają złożoność kodu i wymuszają konieczność przeprowadzania większej liczby jego testów" - pisze jeden z jej uczestników.

Pojawiają się też głosy wskazujące na leniwość programistów i ich zbyt duże przyzwyczajenia: "zauważalny jest istotny brak umiejętności programowania równoległego i wymaganej wiedzy nawet wśród doświadczonych programistów, którzy mają problemy z samymi jego podstawami".

Istotnym problemem jest także brak odpowiednich narzędzi wspierających programowanie równoległe. Równoległość wprowadza nowe typy błędów, które są trudne do wykrycia za pomocą tradycyjnych technik i narzędzi. Zakleszczenia lub nadpisywanie zmiennych przez różne wątki niełatwo wytropić ze względu na ich niedeterministyczny charakter. Kolejnym wyzwaniem jest konieczność zaprojektowania nowych algorytmów i bibliotek zorientowanych na wielowątkowość.


TOP 200