1 Programowanie współbieżne Iwona Kochańska
2 Organizacja przedmiotu Wykład: 1 godzina tygodniowo (piątek, 10:15) 2 kolokwia w trakcie semestru Ocena końcowa: 0.5*(średnia z kolokw.)+0.5*projekt Projekt: od połowy semestru (termin wydawania zadań projektowych będzie podany na wykładzie z 2- tygodniowym wyprzedzeniem) Wykład: Iwona Kochańska iwona.kochanska@pg.edu.pl tel. 58 347 20 04 pokój EA 745 WETI PG Projekt: Mariusz Rudnicki mariusz.rudnicki@pg.edu.pl tel. 58 347 26 39 pokój EA 753 WETI PG
3 Historia programowania współbieżnego Początki programowania współbieżnego to lata 60 XX wieku Pojawienie sie kontrolerów dla urządzeń we/wy, które mogły wykonywań operacje równoległe do obliczeń wykonywanych przez CPU Komunikacja miedzy urządzeniami we/wy a CPU za pomocą przerwań przestań wykonywać bieżący program i zacznij wykonywać inną sekwencje instrukcji wielozadaniowość Przerwania mogą zdarzyć sie w dowolnym momencie Początek lat 70 pierwsze komputery wieloprocesorowe (D825 w 1962 r., 4-procesory)
4 Programowanie współbieżne Programowanie współbieżne znaczne skrócenie czasu obliczeń rozwiązywanie problemów o większych rozmiarach danych Przykładowe zastosowania:
5 Procesory CISC CISC - Complex Instruction Set Computer (np. 6502, 8088) duży zbiór instrukcji o różnej złożoności niektóre kilku-bajtowe, do wykonania wymagają od kilku do kilkunastu cykli zegara, minimalizuje liczbę instrukcji potrzebnych do wykonania zadania (oszczędność RAM) szeroka gama trybów adresowania, rozkazy mogą operować bezpośrednio na pamięci (zamiast przesłania wartości do rejestrów i operowania na nich), dekoder rozkazów jest skomplikowany,
6 Procesory CISC Istotą architektury CISC jest to, iż pojedynczy rozkaz mikroprocesora wykonuje kilka operacji niskiego poziomu, jak na przykład pobranie z pamięci, operację arytmetyczną i zapisanie do pamięci. Współczesne procesory zgodne z x86 produkowane przez firmy Intel, AMD i VIA przetwarzają rozkazy procesora x86 na proste mikropolecenia pracujące według idei RISC, często wykonujące się równolegle.
7 Procesory RISC RISC - Reducted Instruction Set Computer mały zbiór instrukcji, instrukcje są proste - potrzeba mniej tranzystorów, niż w CISC, do realizacji zadania potrzeba więcej wywołań instrukcji niż w CISC, ale: pamięć jest coraz tańsza i lepiej upakowana kompilatory są coraz bardziej wydajne każda instrukcja mieści sie w pojedynczym słowie binarnym (kod instrukcji + adres + dane) wykonanie każdej instrukcji zajmuje tyle samo czasu przetwarzanie potokowe (Pipelining) - kiedy jedna instrukcja jest wykonywana, następna jest odczytywana z pamięci
Procesory SPARC SPARC - Scalable Processor ARChitecture Zaprojektowana przez firmę Sun Microsystems (1985), od 1989 r. rozwijana przez organizacje SPARC International. Wersje: 32-bitowa (SPARC version 8) 64-bitowa (SPARC version 9) Architektura otwarta model programowy mikroprocesora (Instruction Set Architecture, ISA) jest publicznie dostępny (dokumentacja). otwarta implementacja (GNU LGPL) - kod w języku VHDL procesora LEON. Zastosowania: wysokowydajne serwery, stacje robocze, systemy wbudowane 8
Przykłady procesorów CISC i RISC 9
Rozwój procesorów SPARC 10
11
12
13 Graphics Processing Unit (GPU) Współcześnie możliwości wykonywania obliczeń równoległych nie ograniczają się tylko do CPU od wielu lat możliwe jest wykonywanie obliczeń na GPU Nvidia Tesla K40, moc 1.43TFLOPS, 2880 CUDA cores Tesla P100, 3584 rdzenie CUDA, moc 5.3TFLOPS oraz 10.6 TFLOPS dla obl. zmiennoprzecinkowych pojedynczej precyzji, (zródło Nvidia). CUDA (ang. Compute Unified Device Architecture) opracowana przez firmę Nvidia uniwersalna architektura procesorów wielordzeniowych (głównie kart graficznych) umożliwiająca wykorzystanie ich mocy obliczeniowej do rozwiązywania ogólnych problemów numerycznych w sposób wydajniejszy niż w tradycyjnych, sekwencyjnych procesorach ogólnego zastosowania.
Jednostki w obliczeniach równoległych MIPS liczba milionów operacji stałoprzecinkowych wykonywanych w ciągu sekundy Flop (floating point operation) operacja zmiennoprzecinkowa. Liczba zmiennoprzecinkowa (double) zajmuje 8 bajtów. Flops/s (FLOPS) liczba operacji zmiennoprzecinkowych na sekundę 14
15 Superkomputer Superkomputer komputer znacznie przewyższający możliwościami powszechnie używane komputery, w szczególności dysponujący wielokrotnie większą mocą obliczeniową. Określenie to pojawiło się w latach 60. w odniesieniu do komputerów produkowanych przez CDC i później przez przedsiębiorstwo Cray Elementy architektury Blue Gene: chip, karta, węzeł, szafa, system (Wikipedia)
16 TOP500 Projekt TOP500 (www.top500.org) od 1993 publikuje listę najszybszych superkomputerów na świecie na podstawie testów wykorzystujących m.in. oprogramowanie do obliczeń numerycznych z dziedziny algebry liniowej. Listopad 2012 - najszybszym komputerem był Titan wyprodukowany przez Cray i zainstalowany w DOE/SC/Oak Ridge National Laboratory. moc 17.59 PFLOPS (17.59 10 15 ) PFLOPS Architektura: 18 688 AMD Opteron 6274 16-core CPUs, 18 688 Nvidia Tesla K20X GPUs zużycie energii 8.2 MW koszt: 97 mln $ powierzchnia 404 m2
17 TOP500 Czerwiec 2013 - Tianhe-2 (ang. Skyriver-2) - superkomputer stworzony dla potrzeb Uniwersytetu Technologii Obronnych w Chinach. 33.86 PFLOPS (33.86 10 15 ) PFLOPS architektura: 16000 węzłów, 3120000 rdzeni - Intel Xeon E5-2692 12C 2.2 zużycie energii 17.8 MW pamięć 1024000 GB powierzchnia 404 m2 Czerwiec 2016 - chiński Sunway TaihuLight moc ok. 93 PFLOPS (93 10 15 ) 40960 węzłów z 10669600 rdzeni procesory z 256 rdzeniami w architekturze RISC pamięć 1310720 GB zapotrzebowanie na energie 15.37MW, ok. 6 GFLOPS/W koszt ok. 273 mln. $
18 Prawo Moore a W 1965 roku Gordon Moore, szef laboratorium firmy Fairchild Semiconductor, opublikował w branżowym elektronicznym periodyku artykuł, w którym przedstawił prognozę: Liczba dyskretnych komponentów możliwych do upakowania w pojedynczym czipie komputerowym będzie się co rok podwajała, podczas gdy cena tychże czipów pozostanie stała. Gordon Moore stał się później współzałożycielem Intela, a jego prognoza stała się zarówno napędzającą firmy ideą postępu w branży półprzewodników, jak i standardem, którego przestrzeganie jest konieczne, by w tej branży w ogóle przetrwać. Od 1980 podwajanie liczby komponentów chipu co 2 lata
19 Prawo Moore a Dave House: choć tempo przyrostu liczby elementów maleje, to same tranzystory stają się szybsze. To zaś powinno oznaczać, że moc obliczeniowa układu scalonego powinna podwajać się co ok. 18 miesięcy. (współczesna postać prawa Moore a). Ten wykładniczy wzrost towarzyszył nam jeszcze do końca lat zerowych XXI wieku a potem zaczęto coraz częściej mówić o tym, że Prawo Moore'a się skończyło. Intel w 2003 roku sugerował, że koniec może nastąpić przed 2018 roku, kiedy to efekty kwantowe sprawią, że tranzystory nie będą mogły już być dalej miniaturyzowane.
20 Prawo Moore a Robert Dennard: w miarę zmniejszania tranzystorów ich gęstość energetyczna pozostaje stała tak więc zużycie energii pozostaje proporcjonalne do powierzchni. Mniejsze tranzystory potrzebują mniejszego napięcia i natężenia prądu, tak więc wraz z kolejnymi generacjami czipów o coraz większej liczbie tranzystorów, będą one wydzielały mniej ciepła i zużywały mniej energii. Ta zasada zawiodła! Poniżej pewnych rozmiarów tranzystorów pojawiają się prądy upływu, prowadzące do eskalującego się nagrzewania układu (przez pętlę dodatniego sprzężenia zwrotnego). Kres zasady skalowania Dennarda doprowadził do tego, że zamiast podkręcać zegary, postawiono na zwiększenie liczby rdzeni i optymalizację wydajności pojedyńczych wątków. Dzięki temu udało się utrzymać obowiązywanie Prawa Moore'a w jego współczesnej postaci!
Wykładniczy wzrost wydajności obliczeniowej 21
22 Zrównoleglenie Gdy nie można skrócić czasu trwania cyklu (zwiększyć taktowania procesora), pozostaje zwiększyć liczbę wykonywanych w tym samym czasie operacji zrównoleglenie. Równoległość na poziomie procesora: równoległość na poziomie bitów: szersze magistrale i liczba bitów w rejestrach procesora (8, 16, 32, 64 bity) równoległość na poziomie instrukcji: równoległe wykonywanie wielu rozkazów w tym samym czasie przetwarzanie potokowe. Procesory wielordzeniowe przetwarzanie wielu wątków w tym samym czasie Komputery równoległe wymagają programów równoległych (współbieżnych)
23 Programowanie lata 60 i 70 Programowanie w językach asemblerowych Wzrost mocy obliczeniowej powodował, ze komputery mogły rozwiązywać bardziej złożone zadania konieczność zastosowania bardziej złożonego oprogramowania Problem z przenośnością oprogramowania - potrzeba języków programowania o wyższym stopniu abstrakcji bez utraty wydajności -> języki wysokiego poziomu: Fortran i C
24 Programowanie lata 80 i 90 Języki Fortran i C Trudność w tworzeniu i utrzymaniu złożonych aplikacji wymagających milionów linii kodu pisanych przez setki programistów Rozwój komputerów osobistych i ich mocy obliczeniowej Języki obiektowe: C++, Java, C# Lepsze narzędzia: środowiska programistyczne, biblioteki Rozwój metodologii tworzenia oprogramowania: wzorce projektowe, odpowiednie dokumentowanie, testowanie
25 Programowanie - współcześnie Programiści mogą tworzyć oprogramowanie bez konieczności dogłębnej znajomości sprzętu, dostępne języki programowania i biblioteki zapewniają wysoki poziom abstrakcji Uzyskania wydajności zgodnej z prawem Moore a wymaga wyjścia poza programowanie sekwencyjne wzrost taktowania procesorów uległ spowolnieniu rośnie liczba rdzeni w procesorach konieczność pisania oprogramowania korzystającego z większej liczby wątków w tym samym czasie
Cele programowania współbieżnego 26 Większa wydajność: jeżeli mamy do dyspozycji 4 rdzenie procesora, a program wykorzystuje jedynie jeden, to 75% mocy pozostaje niewykorzystane jeżeli program jest jednowątkowy i korzysta z urządzeń we/wy, to często musi czekać bezczynnie, aż urządzenie przęśle mu dane; program wielowątkowy może w tym czasie pobierać dane z wielu źródeł lub wykonywać inne operacje Prostota modelowania niektóre problemy można podzielić na podzadania, które mogą być wykonywane niezależnie od siebie, np. serwer WWW
Cele programowania współbieżnego 27 Większa responsywność (płynność) programu wykonywanie intensywnych obliczeniowo żądań w osobnych watkach, a nie w wątku GUI Uproszczona obsługa asynchronicznych zdarzeń np. komunikacja przez gniazda sieciowe wymaga czekania na odpowiedź (ang. bloking I/O). w aplikacji wielowątkowej każda komunikacja może być obsługiwana w osobnych wątkach, po jednym na połączenie
28 Narzędzia C/C++ brak obsługi wielowątkowości w standardzie aż do standardu C++11 z 2011 r. biblioteka POSIX Threads (pthreads) Windows Threads boost (Asio, Thread, Interprocess) Źródło: http://www.modernescpp.com/index.php/multithreading-in-modern-c
29 Narzędzia Java obsługa wielowątkowości od początku, zdefiniowany model pamięci uwzględniający wykonanie wielowątkowe, bogata biblioteka standardowa
Narzędzia MPI Message Passing Interface protokół komunikacyjny przesyłania komunikatów miedzy procesami w programach współbieżnych najpopularniejszy standard dla superkomputerów wysoka wydajność i skalowalność implementacja dla wielu języków programowania (C, C++, Ada, Fortran, C#) mała wygoda użycia w porównaniu do np. OpenMP OpenMP interfejs służący do tworzenia programów równoległych dla komputerów wieloprocesorowych z pamięcią wspólną dostępny dla C, C++, Fortran wygodniejszy w użyciu od MPI często stosowany łącznie z MPI MPI do komunikacji między węzłami klastra, OpenMP do komunikacji wewnątrz węzła Open Computing Language (OpenCL) otwarty standard ułatwiający pisanie programów do równoległego wykonania na różnych urządzeniach obliczeniowych, tj. CPU, GPU, FPGA oraz DSP 30
31 Co jeśli nie program równoległy? Uruchomienie wielu instancji tego samego programu dla różnych danych dobre, gdy dane wejściowe można podzielić na niezależne od siebie podzbiory uruchomienie wielu instancji, np. za pomocą skryptów powłoki (np. Bash w Linuxie) Wykorzystanie istniejącego oprogramowania równoległego do wykonania np. zastosowanie baz danych z wbudowaną obsługą równoległości Optymalizacja programu sekwencyjnego, tak by spełniał założenia odnośnie czasu działania Nowe rozkazy procesora umożliwiające przyspieszenie wybranych operacji Zastosowanie algorytmu o mniejszej złożoności obliczeniowej
Trudności programowania równoległego 32 Podział pracy obliczenia należy podzielić na zadania, które mogą być wykonywane jednocześnie nierówny podział negatywnie wpływa na wydajność (prawo Amdahla) jak rozdzielić zadania pomiędzy watkami jak Dzielic czas procesora pomiędzy watkami watki o różnych priorytetach Zamiast pojedynczego przepływu sterowania mamy ich wiele dodatkowa logika niezbędna do zarządzania i komunikacji pomiędzy watkami, np. mechanizmy synchronizacji, współbieżne struktury danych
33 Trudności programowania równoległego Nowa kategoria bledów możliwych przy współbieżnym wykonywaniu obliczeń: wyścigi w dostępie do danych (ang. data race) sytuacje prowadzące do niepoprawnych wartości zmiennych wynikające z równoczesnego niekontrolowanego dostępu do współdzielonej pamięci zaburzenia poprawnego wykonania zakleszczenia i zagłodzenia Trudniejsze debugowanie: program może działać poprawnie na jednym proc., ale niepoprawnie na większej liczbie błąd może sie objawiać tylko w specyficznych sytuacjach, np. przy dużej liczbie wątków i dla konkretnych danych wejściowych