Wstęp. Przetwarzanie równoległe. Krzysztof Banaś Obliczenia równoległe 1
Historia i pojęcia wstępne Obliczenia równoległe: dwa lub więcej procesów (wątków) jednocześnie współpracuje (komunikując się wzajemnie) w celu rozwiązania pojedynczego zadania (najczęściej z określonej dziedziny zastosowań) rozwój związany z powstaniem w latach siedemdziesiątych komputerów równoległych problemy obliczeń równoległych (poza klasycznymi zagadnieniami współbieżności) są najczęściej związane z konkretnymi algorytmami obliczenia równoległe były silnie związane z dziedziną obliczeń wysokiej wydajności (i obliczeniami naukowo technicznymi) dziś, w czasach procesorów wielordzeniowych, programowanie równoległe jest koniecznością przetwarzanie równoległe jest jedynym sposobem wykorzystania pełnej mocy współczesnego sprzętu Krzysztof Banaś Obliczenia równoległe 2
Po co obliczenia równoległe? Lepsze wykorzystanie dostępnego sprzętu Krzysztof Banaś Obliczenia równoległe 3
Po co obliczenia równoległe? Zwiększenie maksymalnej mocy obliczeniowej Krzysztof Banaś Obliczenia równoległe 4
Rodzaje przetwarzania równoległego Równoległość na poziomie: pojedynczego rozkazu (instruction level parallelism ILP) potokowość, superskalarność poza kontrolą programisty, w gestii projektanta procesora sekwencji rozkazów tworzących zadanie (task level parallelism), pętli (loop level parallelism) w gestii programisty i twórców kompilatorów wykorzystanie wątków (thread level parallelism) i procesów rozdział kolejno wykonywanych rozkazów pomiędzy procesory/rdzenie podział zadania obliczeniowego na podzadania, przydział poszczególnych zadań procesorom/rdzeniom programów (job level parallelism) jednoczesne wykonywanie niezależnych programów przez system operacyjny (OS level parallelism) w gestii projektantów systemów komputerowych (m.in. systemów operacyjnych) Krzysztof Banaś Obliczenia równoległe 5
C/C++/Java/C# itp., itd. (źródło www.tiobe.com) Krzysztof Banaś Obliczenia równoległe 6
C/C++/Java/C# itp., itd. C++ programmers and programs benefit from the very expressive templating and overloading features of the language, allowing more abstraction and more code reuse than is available in other languages. However, that template processing and overloading is typically expanded and evaluated in the C++ front end. By the time the rest of the compiler sees the program, it s just a C program. The only unique feature in C++ that remains after the front end is exception handling. All the templating is extremely useful for reducing the number of times you have to write an axpy kernel for different data types (float, double, complex, ), but it doesn t increase your expressivity, that is, it doesn t let you write anything you couldn t have written in a C library, however painfully. Michael Wolfe* *Michael Wolfe has developed compilers for over 35 years in both academia and industry, and is now a PGI compiler engineer at NVIDIA Corporation Krzysztof Banaś Obliczenia równoległe 7
Motywacja Krzysztof Banaś Obliczenia równoległe 8
Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 9
Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie dostępnej współbieżności w trakcie realizacji programu określenie koniecznej synchronizacji lub wymiany komunikatów pomiędzy procesami lub wątkami realizującymi program Pierwszy z tych kroków często ma charakter bardziej twórczy, drugi bardziej techniczny (zakłada znajomość modelu programowania) Jednym z najważniejszych wymagań stawianych programom równoległym jest przenośność możliwość uruchomienia na maszynie o dowolnej liczbie procesorów/rdzeni liczba wątków/procesów staje się parametrem programu Krzysztof Banaś Obliczenia równoległe 10
Metodologia programowania równoległego Przydatnym sposobem ujęcia metodologii programowania równoległego jest wyróżnienie pięciu podstawowych zadań, które muszą zostać zrealizowane przy tworzeniu programu równoległego: podział (dekompozycja) zadania obliczeniowego na podzadania odwzorowanie zadań na procesy i wątki oraz dalej na elementy przetwarzania: węzły, multi procesory, procesory (rdzenie) podział (dystrybucja) danych pomiędzy elementy pamięci związane z elementami przetwarzania (uwzględniając hierarchię pamięci) określenie koniecznej wymiany danych między procesami (wątkami) oraz odwzorowanie jej na sieć połączeń między procesorami (rdzeniami) określenie koniecznej synchronizacji między zadaniami (=wątkami (procesami) ) Krzysztof Banaś Obliczenia równoległe 11
Metodologia programowania równoległego Wygodnym sposobem uporządkowania procesu tworzenia programów równoległych jest ujęcie go w ramy specyficznej metodologii Jedną z takich metodologii jest PCAM (Foster 1985) Kolejne litery oznaczają kroki przy tworzeniu programu: P partition, podział zadania na podzadania C communicate, określenie niezbędnej komunikacji, podział danych na wspólne i prywatne, określenie sposobu korzystania z danych, synchronizacja operacji na danych A agglomerate, analiza wariantów podziału M map, uwzględnienie ostatecznej implementacji, odwzorowania na architekturę sprzętu Pierwsze dwa kroki zmierzają do stworzenia poprawnego programu równoległego, kolejne dwa do jego optymalizacji Krzysztof Banaś Obliczenia równoległe 12
Metodologia programowania równoległego Wzorce programowania równoległego Zarządca wykonawcy (manager worker, master slave) Dziel i rządź (divide and conquer) i inne wersje dynamicznego, rekursywnego zarządzania obliczeniami (recursive splitting np. fork join) Zrównoleglenie pętli (loop parallelism) Przetwarzanie potokowe (pipelining) Agenci (software agents), aktorzy (actors), przetwarzanie sterowane zdarzeniami (discrete event) Map Reduce i wiele innych Wzorce są ogólnymi wskazówkami rozwiązania problemu dekompozycji zadania na równoległe pod zadania, konkretne programy mogą realizować wiele, często odpowiednio zmodyfikowanych, wzorców Krzysztof Banaś Obliczenia równoległe 13
Metodologia programowania równoległego Krzysztof Banaś Obliczenia równoległe 14