Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1
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) Sposób realizacji tych kroków może zależeć od organizacji procesu tworzenia programu równoległego Krzysztof Banaś Obliczenia równoległe 2
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 podazadania C communicate, określenie niezbędnej komunikacji 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 3
Metodologia programowania równoległego Przykłady podziałów zadania na podzadania: Podział ze względu na funkcje ( funkcjonalny ): modelowanie środowiska naturalnego złożony problem optymalizacji Podział struktury danych sortowanie tablic rozwiązywanie układów równań liniowych Podział w dziedzinie problemu symulacje zjawisk fizycznych w przestrzeni rozwiązywanie układów równań liniowych Krzysztof Banaś Obliczenia równoległe 4
Metodologia programowania równoległego Metodologia tworzenia programów równoległych może wynikać z: przyjętej docelowej architektury sprzętu na którym działać będzie oprogramowanie zakresu podejmowanych zadań: zrównoleglenie istniejącego kodu zrównoleglenie algorytmu opracowanie nowego, równoległego algorytmu i programu rozwiązującego pewne zadanie Krzysztof Banaś Obliczenia równoległe 5
Metodologia programowania równoległego Punkt wyjścia 1 algorytm (lub program) sekwencyjny jeżeli do dyspozycji mamy algorytm lub program sekwencyjny, a nie mamy możliwości lub chęci analizy samego algorytmu (lub ogólniej metody rozwiązywania postawionego problemu) i jednocześnie godzimy się na fakt nieprzenośności programu na platformy bez pamięci wspólnej korzystamy z równoległości na poziomie wątków: za pomocą odpowiednich narzędzi rozdzielamy sekwencje instrukcji (np. kolejne iteracje pętli lub szereg kolejnych wywołań procedur) pomiędzy wątki Krzysztof Banaś Obliczenia równoległe 6
Metodologia programowania równoległego Punkt wyjścia 2 problem do rozwiązania: dokonujemy analizy problemu starając się podzielić zadanie obliczeniowe na podzadania możliwe do wykonania równoległego: podział funkcji (functional decomposition) podział struktury danych (data decomposition) podział obszaru problemowego (domain decomposition) określamy konieczną wymianę informacji między podzadaniami w celu poprawnej i efektywnej realizacji obliczeń Krzysztof Banaś Obliczenia równoległe 7
Metodologia programowania równoległego Punkt wyjścia 2 problem do rozwiązania(cd.): wybieramy model do programowania i wykonania programu: równoległości danych równoległości na poziomie wątków z pamięcią wspólną równoległości na poziomie zadań z przesyłaniem komunikatów dobieramy stosowne narzędzia, dopasowując je np. do platformy sprzętowej (środowiska programowania HPF, OpenMP, MPI, wielowątkowość wbudowana w języki programowania lub inne) implementując problem dokonujemy ostatecznego odwzorowania obliczeń na architekturę systemu komputerowego Krzysztof Banaś Obliczenia równoległe 8
Podsumowanie Praktyczne alternatywy modelu programowania: programowanie sekwencyjne ze zrównolegleniem niejawnym: poprzez układ procesora superskalarnego poprzez automatyczny kompilator zrównoleglający programowanie w modelu równoległości danych programowanie w modelu z pamięcią wspólną programowanie w modelu z przesyłaniem komunikatów programowanie w modelu hybrydowym Krzysztof Banaś Obliczenia równoległe 9
Wykorzystanie muteksów #include<pthread.h> #define LICZBA 100 #define LICZBA_W 4 pthread_mutex_t muteks; int suma=0; pthread_t watki[liczba_w]; int main( int argc, char *argv[] ){ int i; indeksy[liczba_w]; for(i=0;i<liczba_w;i++) indeksy[i]=i; pthread_mutex_init( &muteks, NULL); for(i=0; i<liczba_w; i++ ) pthread_create( &watki[i], NULL, suma_w, (void *) &indeksy[i] ); for(i=0; i<liczba_w; i++ ) pthread_join( watki[i], NULL ); printf( suma = %d\n,suma); } Krzysztof Banaś Obliczenia równoległe 10
Wykorzystanie muteksów void *suma_w( void *arg_wsk){ int i, moj_id, moja_suma=0; moj_id = *( (int *) arg_wsk ); j=liczba/liczba_w; for( i=j*moj_id+1; i<=j*(moj_id+1); i++){ moja_suma += i; } pthread_mutex_lock( &muteks ); suma += moja_suma; pthread_mutex_unlock( &muteks ); pthread_exit( (void *)0); } Krzysztof Banaś Obliczenia równoległe 11