• Nie Znaleziono Wyników

Wykład 13 (Programowanie współbieżne - 1)

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 13 (Programowanie współbieżne - 1)"

Copied!
58
0
0

Pełen tekst

(1)

PARADYGMATY  I  JĘZYKI  

PROGRAMOWANIA  

(2)

Treść  

¨  Wstęp  

¨  Procesy  i  wątki  

¨  Szybkość  obliczeń  

¤  prawo  Amdahla  

¨   Wyścig  do  zasobów  

¨  Synchronizacja  i  mechanizmy  synchronizacji  

¤  semafory  

¤  monitory  

¤  inne  mechanizmy  synchronizacji  

¨  MPI   ¤  Podstawy   ¤  Przykłady   ¨  OpenMP   ¤  Podstawy   2  

(3)

   

Wstęp  

(4)

Do  czego  potrzebujemy  OR?  

¨  Aplikacje  CAD/CAM  

¨  Przewidywanie  pogody  

¨  Systemy  inteligentne  

¨  Modelowanie  (ekonomia,  planowanie  itd)  

¨  Opracowywanie  danych  satelitarnych  (...)  

¨  Projektowanie  obwodów  VLSI  

¨  Problemy  energetyki  jądrowej  

¨  Reakcje  chemiczne  i  jądrowe  

¨  Aktywność  sejsmiczna  Ziemi  

¨  Problemy  genetyki  

¨  inne  

(5)

Prawo  Amdahla  

Gene  Amdahl,  1967  

Przyspieszenie  obliczeń  współbieżnych    

         

gdzie  f  =  część  (<1)  odpowiadająca  obliczeniom   sekwencyjnym  (1-­‐f  odpowiada  tej  części  

programu,  ktora  daje  sie  uwspółbieżnić).  

S 1

f + (1 f )n

(6)

Prawo  Amdahla  

¨  Obliczenia  na  n  procesorach:  

n  –  liczba  procesorów  

T  –  całkowity  czas  obliczeń  na  1  procesorze  

f*T  –  czas  obliczeń  sekwencyjnych  na  1  procesorze   (1-­‐f)*T  –  czas  obl.  równoległych  na  1  procesorze    

(1-­‐f)*T/n  –  czas  obl.  równoległych  na  n  procesorach  

¨  Przyspieszenie  obliczeń    

(  czas  obl.  1proc./czas  obl.  nproc.  ):             Stąd  prawo  Amdahla.   S T f T + (1 f )Tn 6  

(7)

Prawo  Amdahla  

200 400 600 800 1000 n 20 40 60 80 S f=0.01   f=0.02   f=0.10   7  

(8)

Przykład.  Iloczyn  skalarny  

¨  1  proces  

Suma:                                                                                  Czas  1  operacji  +  :     Liczba  operacji  +:  N-­‐1;    czas  obliczeń:  

  ¨  2  procesy     Suma:     Czas  obliczeń:      

gdzie  C  jest  czasem  przesyłania  wyniku  częściowego  –  czas  komunikacji     Przyspieszenie:     Jeśli        

t

T1 = (N 1) t T2 = (N/2 1) t + t + C

S = T

1

/T

2

=

N/2+C/ tN 1

! 2

c << t s = PNi=1 xiyi s = PN/2i=1 xiyi+ PNi=N/2+1 xiyi 8  

(9)

Przykład.  Iloczyn  skalarny  

¨  P  procesorów.  Zakładamy,  że  

   

(qC  –  całkowity  czas  komunikacji).  Kładąc   otrzymamy       Nawet  dla              

S

P

=

T1 TP

=

(N 1) t q t+qC P = N, N = 2q ⌘ C/⇥t

S

P

=

(1+ ) logN 1 2 P

=

P 1 (1+ ) log2 P ↵ = 0

S

P

=

logP 1 2 P

< P

9  

(10)

Współbieżność  

¨  Współbieżność  –  wiele  kontekstów  

obliczeniowych  jednocześnie  

¤ wielowątkowość;  wielozadaniowość  

¤ dodatkowe  procesory;  szybkość  

¤ komputery  rozproszone;  internet  

¨  Różne  poziomy  zrównoleglania  

¤ różne  poziomy  ziarnistości  

n instruction  Level  Parallelism  

n vector  parallelism  

n thread-­‐level  parallelism  

(11)

Wyścig  do  zasobów  

¨  Wyścig  do  zasobów  ma  miejsce  jeśli  działają  co  

najmniej  dwa  niezsynchronizowane  procesy  

i  wynik  obliczeń  zależy  od  kolejności  ich  działania  

¨  Czasami  wyścig  do  danych  nie  zagraża  wynikom  

obliczeń    (np.  pobieranie  zadań  z  kolejki)  

¨  W  ogólności,  wyścig  do  zasobów  jest  

niepożądany  i  należy  go  kontrolować  

(12)

Wyścig  do  zasobów  

¨  Przykład  

Dwa  procesy  dzielą  pamięć,  zwiększając  o  1  wartość   zmiennej  X.  Większość  procesorów  nie  wykonuje   operacji  arytmetycznych    bezpośrednio  na  pamięci.  

¨  Każdy  z  procesorów  wykonuje  operacje:  

¤  LOAD  X   ¤  INC  

¤  STORE  X  

¨  Jaki  będzie  wynik  obliczeń  jeśli  początkowa  wartość  

X=0,  a  procesy  działąją  równolegle?  Czy  wynikiem   końcowym  będzie  1,  czy  2?  

¨  Przykład  wielowątkowości:  serwery  sieciowe  

(13)

Architektura  

¨  Dwa  główne  typy  architektury  

¤ dzielona  pamięć  –  wiele  procesorów  jedna  pamięć;  

OpenMP  

¤ każdy  procesor  posiada  własną  pamięć  –  

komunikaty;  MPI  

(14)

Jaguar  &  Titan  

¨  http://computing.ornl.gov/  

¨  http://top500.org  

The  OLCF  is  home  to  Titan,  the  world’s  most  powerful  supercomputer     for  open  science  with  a  theoretical  peak  performance  exceeding    

20  petaflops  (quadrillion  calculations  per  second).  That  kind  of    

computational  capability—almost  unimaginable—is  on  par  with  each     of  the  world’s  7  billion  people  being  able  to  carry  out  3  million    

calculations  per  second.  Image  courtesy  Oak  Ridge  National  Laboratory.  

Titan  is  a  Cray  XK7  system  that  contains  18,688  nodes,  each  built  from     a  16-­‐core  AMD  Opteron  6274  processor  and  an  NVIDIA  Tesla  K20X  GPU     accelerator.  Titan  also  has  710  terabytes  of  memory.  

(15)

Synchronizacja  

¨  Tak,  czy  owak  synchronizacja  pracy  wątków,  czy  

procesów  jest  podstawą  obliczeń  równoległych  

¨  Synchronizację  zapewnia  język  programowaia  

(najczęściej  programista)  

¨  Języki  i  rozszerzenia  

¤ Java,  C#  

¤ MPI  (Message  Passing  Interface)  –  wywołania  

zdalne  procedur;  dostępność:  Fortran,  C++;   wszystkie  platformy  

¤ Biblioteki:  POSIX  pthreads  –  biblioteki  sieciowe   15  

(16)

Narodziny  i  śmierć  wątków  

¨  Systemy  programowania  współbieżnego  pozwalają  kreować  i  

niszczyć  wątki  

¨  Składnia  instrukcji  jest  różna  w  różnych  systemach  

¨  Przykład,  instrukcje  „do”  

¤  OpenMP  

#pragma omp parallel for

for (int i = 0; ji < 3; i++) { print („thread %d”\n, i);

}

¤  C#  

Parallel.For(0, 3, i => {

Console.WriteLine(„Thread ” + i); })

Trzeci  argument  Parallel.For  jest  delegatem,  tutaj  

wyrażeniem  lambda.  

(17)

Narodziny  i  śmierć  wątków  

¤  Java

class ImageRenderer extends Thread { ...

ImageRenderer( args ) { // konstruktor

}

public void run() { // kod wątku }

} ...

ImageRenderer rend = new ImageRenderer (arg_konstruktora)

¨  Wątek  uruchamia  polecenie  rend.start(),  łączy  rend.join()

¨  Podobnie  w  C#  

(18)

Podstawy  

Synchronizacja  

(19)

Synchronizacja  

¨  Operacje  atomowe  lub  opóźnienie  operacji  do  

chwili  gdy  spełnione  są  określone  warunki  (np.   zrealizowanie  obliczania  tablicy  elementów)  

¨  wykluczanie  –  tylko  jeden  wątek  działa  w  tzw.  

sekcji  krytycznej  

¨  synchronizacja  warunkowa  –  wątki  czekaja  na  

spełnienie  określonego  warunku  

¨  barriers  

(20)

Mechanizmy  synchronizacji  

¨  Semafory  

 

(Dijkstra,  1968):  semafor  –  licznik  o  dwóch  

operacjach  P  i  V  (P  –  passeren  =  dun.  przejść,  V  –  

vrijgeven  =  zwolnić;  Algol  68:  down  i  up).  Wątek,  

który  wywołuje  P  automatycznie  zmniejsza  

licznik  o  1  i  czeka  do  momentu  gdy  licznik  będzie   nieujemny.  Wątek,  wywołujący  V,  zwiększa  

licznik  o  1  i  w  ten  sposób  aktywuje  wątek  

oczekujący  (jeśli  taki  jest);  semafor  binarny;      

(21)

Mechanizmy  synchronizacji  

¨  Monitory  

 

(Hansen,  1973;  Hoare  1974):  moduł  lub  obiekt,   posiadajacy  pewne  operacje,  stan  wewnętrzny   i  jakies  zmienne,  określające  warunki.  W  danej   chwili  może  byc  wykonywana  tylko  jedna  

operacja.  Wątek,  wywołujący  zajęty  monitor,  jest   automatycznie  wstawiany  do  kolejki  wątków  

oczekujacych  (kolejka  wejściowa)  do  czasu  gdy   monitor  sie  zwolni.    

(22)

Zakleszczenie,  impas  

¨  Nieumiejętne  posługiwanie  się  semaforami  lub  

monitorami  może  prowadzić  do  zakleszczenia   (deadlock)  

(23)

Synchronizacja  w  Java  

¨  Instrukcja  synchronized   synchronized (obiekt_dzielony) { // sekcja krytyczna }

¨  metoda  wait()  pozwala  zawiesić  dzialanie  wątku  do  

odpowiedniego  momentu.    

while (!warunek) { wait();

}

¨  Wątek  zawieszony  może  być  aktywowany  przez  inne  wątki,  

wywołujące  metode  notify() lub  notifyAll().  

(24)

Atomowość  inaczej  (TM)  

¨  Organizacja  atomowych  operacji  w  programach  jest  

skomplikowana  

¨  Lepiej:  system  zarządza  konkurującymi  wątkami  

¨  TM  –  transactional  memory;  analogicznie,  jak  

w  przypadku  transakcyjnych  baz  danych   (atomowość,  spójność,  izolacja,  trwałość)  

¨  Podstawowa  idea  (TM).  W  programie:  

 

¨  atomic {

-- kod do wykonania }

(25)

Data  Parallel  Model  

DPM  

(26)

Data  Parallel  Model  (DPM)  

¨  Operacje  na  zbiorach  danych  (np  na  tablicach)  

¨  Zespół  zadań  (program)  operuje  na  wspólnej  

strukturze  danych,  a  każde  zadanie  pracuje  nad  

częścią  danych.  Zadania  wykonują  te  same  operacje   na  danych.  

 

¨  Przykład.  

 Utworzyć  tablicę  Y  mnożąc  elementy  tablicy  X  przez    pi  (3.1415...)     a)  na  1  procesorze    

b)  na  4  procesorach     c)  dla  n  procesorów.  

(27)

DPM,  przykład  

Przykład  (data  parallel  model),  4  procesory  

34 PARALLEL COMPUTING ARRAY X, Y x1 x2 .. x20 x21 x22 .. x40 x41 x42 .. x60 x ` x61 62 .. x80 x81 x82 .. x100 y1 y2 .. y20 y21 y22 .. y40 y41 y42 .. y60 y ` y61 62 .. y80 y81 y82 .. y100 For i:= 21 to 40 do Begin X(i):= Y(i)*PI For i:= 61 to 80 do Begin X(i):= Y(i)*PI For i:= 81 to 100 do Begin X(i):= Y(i)*PI End; For i:= 41 to 60 do Begin (Xi):= Y(i)*PI For i:= 1 to 20 do Begin X(i):= Y(i)*PI

End; End; End; End;

Fig. 1.28 Data Parallel Model

!"#$%&'()*%+$,#%'-%$'.$'##'/$0$1/$(2*-3)*/3.4$5$%*%(%.-6$1/$7'*2%$"8$9:$ '6$6;"<.$3. !34=>=?@+$<;%#%$%',;$)#",%663.4$%*%(%.-$<"#A6$".$?B$C36-3.,-$%*%(%.-6$"8$-;%$'##'/6=$:.$6;'#%C (%("#/$'#,;3-%,-2#%6+$'**$-;%$-'6A6$;'7%$',,%66$-"$-;%$C'-'$6-#2,-2#%$-;#"24;$4*"1'*$(%("#/= D.$-;%$"-;%#$;'.C+$3.$-;%$C36-#312-%C$(%("#/$'#,;3-%,-2#%6+$-;%$C'-'$6-#2,-2#%$36$6)*3-$2)$3. )3%,%6+$%',;$)3%,%$#%63C%6$3.$-;%$*",'*$(%("#/$"8$'$-'6A=$9#"4#'((3.4$-;%$C'-'$)'#'**%*$("C%* 36$ ',,"()*36;%C$ 1/$ <#3-3.4$ '$ )#"4#'($ <3-;$ C'-'$ )'#'**%*$ ,".6-#2,-6=$ E;%$ ,".6-#2,-6$ ,'.$ 1% ,'**6$-"$'$C'-'$)'#'**%*$621#"2-3.%$*31#'#/$"#+$,"()3*%#$C3#%,-37%6$#%,"4.3F%C$1/$'$C'-'$)'#'**%* ,"()3*%#=$G34;$9%#8"#('.,%$!DHEHIJ$KG9!L$)#"73C%6$%&-%.63".6$-"$!"#-#'.$MB$-"$62))"#-C'-'$)'#'**%*$)#"4#'((3.4= !"# $%&%''(') %'*+&,-./0 N-2C3%6$3.$-;%$C%634.$"8$)'#'**%*$'*4"#3-;(6$'#%$3.-%#%6-3.4=$I./$'*4"#3-;($C%7%*")(%.-$'.C '.'*/636$6-2C3%6$3.7"*7%$;"<$1%6-$".%$,'.$C"$-;%$437%.$O"1=$N%P2%.-3'*$'*4"#3-;(6$;'7%$1%%. %&-%.637%*/$6-2C3%C$8"#$6%7%#'*$3()"#-'.-$)#"1*%(6=$D.%$3()"#-'.-$(%'62#%$"8$-;%$)%#8"#('.,% "8$'./$'*4"#3-;($36$-;%$-3(%$,"()*%&3-/=$:-$36$-;%$-3(%$#%P23#%C$-"$%&%,2-%$-;%$'*4"#3-;($6)%,383%C '6$6"(%$82.,-3".$"8$-;%$)#"1*%($63F%=$I."-;%#$3()"#-'.-$)%#8"#('.,%$(%'62#%$36$-;%$6)',% ,"()*%&3-/$C%83.%C$'6$(%("#/$#%P23#%C$1/$-;%$'*4"#3-;(=$:-$36$'*6"$6)%,383%C$'6$6"(%$82.,-3". "8$-;%$)#"1*%($63F%=$Q'./$-3(%6+$-;%$-3(%$'.C$6)',%$,"()*%&3-3%6$C%)%.C$".$-;%$C'-'$6-#2,-2#% 26%C=$I."-;%#$3()"#-'.-$(%'62#%$-;%#%8"#%+$36$-;%$)#%)#",%663.4$-3(%$,"()*%&3-/$-"$4%.%#'-% -;%$C%63#%C$C'-'$6-#2,-2#%=$I*4"#3-;(6$4373.4$-;%$1%6-$8342#%6$8"#$-;%$'1"7%$(%'62#%6$.'-2#'**/ 6;'**$1%$)#%8%##%C=$E"$C%-%#(3.%$-;%$-;%"#%-3,'*$*"<%#$1"2.C$".$-;%$-3(%$'.C$6)',%$,"()*%&3-3%6 36$'.$3()"#-'.-$#%6%'#,;$',-373-/= $ 9'#'**%*$ '*4"#3-;(6$ '#%$ -;%$ '*4"#3-;(6$ -"$ 1%$ #2.$ ".$ )'#'**%*$ (',;3.%6=$ E;%$ ("6-3()"#-'.-$(%'62#%$"8$)%#8"#('.,%$"8$'$)'#'**%*$'*4"#3-;($36$;"<$8'6-$".%$,'.$6"*7%$'$437%. )#"1*%($ 263.4$ '6$ ('./$ )#",%66"#6$ '6$ #%P23#%C=$ N3.,%$ -;%$ )'#'**%*$ '*4"#3-;($ 26%6$ 6%7%#'* )#",%66"#6+$-;%$,"()*%&3-/$"8$,"((2.3,'-3".$'(".4$-;%$)#",%66"#6$36$'*6"$'.$3()"#-'.-$(%'62#%= E;%$,"((2.3,'-3".$,"()*%&3-/$3.$-2#.$C%)%.C6$".$-;%$,"((2.3,'-3".$;'#C<'#%$62))"#-%C$1/ w-­‐13   27  

(28)

DPM,  przykład  

Przykład,  n  procesorów  (zakladamy,  że  indeksy  macierzy  są  0,1,...)    

Deklaracja m, n, p, k Deklaracja X(m), Y(m) Wczytaj X(m)

n = liczba_procesorów()

//ile elementów macierzy przypada na jeden proces? k = m/n

//numer procesu lub procesora: (0,...,p) p = moj_numer()

//ustal granice zmienności indeksów macierzy w “mojej” części istart = p*k; iend =(p+1)*k-1

For i=istart to iend do Begin

X(i)=Pi*Y(i) End

(29)

Przykład  (  1  procesor)  

 

1.  Czytaj a() z pliku! !

2.  wykonaj obliczenia dla a() od a(i=1) do a(i=6)!

!

3.  zapisz a() do pliku!

we  

a  

 wy   a  

(30)

Przykład  (3  procesory)  

   

1.  Czytaj  a()  z  pliku     2.  Pobierz  „rank”  

3.  If  rank==0  then  is=1,  ie=2   4.  If  rank==1  then  is=3,  ie=4   5.  If  rank==2  then  is=5,  ie=6  

6.  Wykonaj  obliczenia  od  a(is)  do  a(ie)   7.  Zbierz  wyniki;  proces  0  

8.  If  rank==0  zapisz  a()  do  pliku  

Proces  0   Proces  1   Proces  2  

1.  Czytaj  a()  z  pliku     2.  Pobierz  „rank”  

3.  If  rank==0  then  is=1,  ie=2   4.  If  rank==1  then  is=3,  ie=4   5.  If  rank==2  then  is=5,  ie=6  

6.  Wykonaj  obliczenia  od  a(is)  do  a(ie)   7.  Zbierz  wyniki;  proces  0  

8.  If  rank==0  zapisz  a()  do  pliku  

1.  Czytaj  a()  z  pliku     2.  Pobierz  „rank”  

3.  If  rank==0  then  is=1,  ie=2   4.  If  rank==1  then  is=3,  ie=4   5.  If  rank==2  then  is=5,  ie=6  

6.  Wykonaj  obliczenia  od  a(is)  do  a(ie)   7.  Zbierz  wyniki;  proces  0  

8.  If  rank==0  zapisz  a()  do  pliku  

we  

a   a  

we   we  

a  

(31)

Message  Passing  Interface  

MPI  

(32)

MPI  

¨  MPI  –  message  passing  interface  

¤ Standard  z  lat  90-­‐ch;  KLASTRY  

¤ C/C++  

¤ Fortran   32  

(33)

Numerologia  ...

J

 

¨  Każdy  „element  logiczny”  w  komputerze  

posiada  własną  nazwę,  numer:  komórka  pamięci,   dysk,  procesor,  proces  itd.  Np.  procesy,  wątki  

mają  numery  0,  1,  2,  ...  Proces  może  się  

dowiedzieć  jaki  numer  posiada  (Ogólniej  może  to   być  numeracja  złożona:  numer  grupy,  podgrupy,   itd.)  

(34)

MPI  –  przykład:  Wyślij  N  liczb  int  

!!

Example - Send “N” Integers

#include <mpi.h>

you = 0; him = 1;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &me);

if ( me == 0 ) {

error_code = MPI_Send(&data_buffer, N, MPI_INT, him, 1957, MPI_COMM_WORLD); } else if ( me == 1 ) {

error_code = MPI_Recv(&data_buffer, N, MPI_INT, you, 1957, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

}

MPI_Finalize();

include fi le

initialize MPI environment get process ID process 0 sends

process 1 receives

leave the MPI environment w-­‐13  

(35)

MPI  -­‐  komunikacja  

Proces  0       you  =  0   him  =  1   me    =  0   MPI_Send Proces 1! !   you  =  0   him  =  1   me    =  1   MPI_Recv !! MPI_Send N liczb całkowitych odbiorca = him = 1 tag = 1957 MPI_Recv N liczb całkowitych nadawca = you = 0 tag = 1957 35  

(36)

6  FUNKCJI  MPI  

¨  Proste  programy  MPI  można  tworzyć    używając  

tylko  sześciu  funkcji  

(37)

6  funkcji  MPI  (1)  

¨  MPI_INIT(...)  

Zainicjuj  obliczenia  MPI    

¨  MPI_FINALIZE(...)  

Zakończ  obliczenia  MPI  

(38)

6  funkcji  MPI  (2)

 

¨  MPI_COMM_SIZE(...)  

Określ  liczbę  procesów  w  komunikatorze    

¨  MPI_COMM_RANK(...)  

Określ  identyfikator  procesu  w  danym   komunikatorze  

(39)

6  podstawowych  funkcji  

(3)

 

¨  MPI_SEND(...)  

Wyślij  wiadomość  do  innego  procesu    

¨  MPI_RECV(...)  

Odbierz  wiadomość  od  innego  procesu  

(40)

Wymiana  danych  -­‐  problemy  

Proces  0                                                    Proces  1   MPI_send(…,1,…) MPI_recv(…,1,…) MPI_send(…,0,…) MPI_recv(…,0,…)

Może  dojść  do  impasu  (zależy  od  implementacji).  Jeśli  komunikaty  będą   buforowane  program  może  działać.  (W  standardzie  MPI  nosi  to  nazwę  

unsafe  send/recv)  

(41)

Wymiana  danych  -­‐  problemy  

Proces  0                                                    Proces  1   MPI_recv(…,1,…) MPI_send(…,1,…) MPI_recv(…,0,…) MPI_send(…,0,…) Zakleszczenie  (Deadlock).    

MPI_recv  czeka  dopóty,  dopóki  nie  wykona  się  send    

(42)

Wymiana  danych  -­‐  problemy  

Proces  0                                                    Proces  1   MPI_send(…,1,…) MPI_recv(…,1,…) MPI_recv(…,0,…) MPI_send(…,0,…) OK!   42  

(43)

Przykład.  Obliczanie  π    

¨ 

Wyliczyć  wartość  

π

 według  formuły  

(pokazać  najpierw,  że  formuła  jest  słuszna):  

+

=

π

1 0 2

dx

x

1

4

43  

(44)

Przykład

.

π  w  C  (1)  

#include "mpi.h" #include <math.h>

int main(int argc, char *argv[]) {

int done = 0, n, myid, numprocs, i, rc;

double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, a;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid); while (!done) {

if (myid == 0) {

printf("Enter the number of intervals: (0 quits) "); scanf("%d",&n);

}

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); if (n == 0) break;

(45)

Przykład

.

π  w  C  (2)  

h = 1.0 / (double) n; sum = 0.0;

for (i = myid + 1; i <= n; i += numprocs) { x = h * ((double)i - 0.5);

sum += 4.0 / (1.0 + x*x); }

mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0)

printf("pi is approximately %.16f, Error is .16f \n",

pi, fabs(pi - PI25DT)); }

MPI_Finalize(); return 0;

}

(46)

Komunikacja  kolektywna  

46  

¨  Operacje  kolektywne  wywoływane  są  przez  wszystkie  procesy  w  

komunikatorze  

¨  MPI_BCAST  rozdziela  dane  z  jednego  procesu  (root)  na  

wszystkie  procesory  w  komunikatorze  

¨  MPI_REDUCE  zbiera  dane  od  wszystkich  procesów  w  

komunikatorze  I  zwraca  do  jednego  procesu  

¨  W  wielu  algorytmach  numerycznych,  SEND/RECEIVE

można  zastąpić  parą  BCAST/REDUCE,  upraszczając  program  i   podnosząc  efektywność  

(47)

Procedury  kolektywne  

47  

¨  MPI_Bcast(data, count, type, src, comm)

Rozesłanie  danych  z  src  do  wszystkich  procesów  

w  komunikatorze.    

¨  MPI_Gather(in, count, type, out, count,

type, dest, comm)

Zbieranie  danych  ze  wszystkich  węzłów  do  węzła  dest ¨  MPI_Scatter(in, count, type, out, count,

type, src, comm)

(48)

Procedury  kolektywne  

48  

Dane  à  

Pro

ces

y   A   A  

A   A   A   bcast   Pro ces

y   A   B   C   D   A  

B   C   D   scatter  

(49)

Procedury  kolektywne  

49   ¨  Funkcje  dodatkowe   ¤ MPI_Allgather ¤ MPI_Gatherv ¤ MPI_Scatterv ¤ MPI_Allgatherv ¤ MPI_Alltoall

(50)

Procedury  redukcji  

50  

MPI_Reduce(send, recv, count, type, op, root, comm)

Globalna  operacja  “op”  redukcji;  wynik  znajduje  się  w  buforze  recv  procesu  root;   “op”  może  być  zdefiniowane  przez  użytkownika  (predefiiowane  operacje  MPI)  

MPI_Allreduce(send, recv, count, type, op, comm)

(51)

Procedury  redukcji  

51   dane   reduce   allreduce   A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3 A0#A1#A2#A3 B0+B1#B2#B3 C0#C1#C2#C3 D0#D1#D2#D3 A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3 A0#A1#A2#A3 B0#B1#B2#B3 C0#C1#C2#C3 D0#D1#D2#D3 A0#A1#A2#A3 B0#B1#B2#B3 C0#C1#C2#C3 D0#D1#D2#D3 A0#A1#A2#A3 B0#B1#B2#B3 C0#C1#C2#C3 D0#D1#D2#D3 A0#A1#A2#A3 B0#B1#B2#B3 C0#C1#C2#C3 D0#D1#D2#D3

(52)

Procedury  redukcji  

52  

¨   Procedury  dodatkowe  

¤ MPI_Reduce_scatter(), MPI_Scan()

¨  Operacje  predefiniowane  

¤ sum, product, min, max,  …  

¨  Operacje  definiowane  przez  użytkownika:  patrz  

opis  MPI  

¤ MPI_Op_create()

(53)

Komunikacja  kolektywna  

53       A   B   C   D   A   B   C   D   A   B   C   D   A   B   C   D   A   B   C   D   allgather  

A0   A1   A2   A3  

B0   B1   B2   B3   C0   C1   C2   C3   D0   D1   D2   D3   A0   B0   C0   D0   A1   B1   C1   D1   A2   B2   C2   D2   A3   B3   C3   D3   alltoall  

(54)

Komunikacja  kolektywna  

54       A   B   C   D   A   A#B   A#B#C   A#B#C#D   scan   #  -­‐  operator  

A0   A1   A2   A3  

B0   B1   B2   B3   C0   C1   C2   C3   D0   D1   D2   D3   A0#B0#C0#D0   A1#B1#C1#D1   A2#B2#C2#D2   A3#B3#C3#D3   reduce   scatter  

(55)

Podstawy  

OpenMP  

(56)

Realizacja  OpenMP  

                                                                                                                                    !"

http://www.openmp.org

#

$

%

$

&

$

'()*+,-$+./*0

ü  Wszystkie wątki mają

dostęp do wspólnej pamięci i danych dzielonych

ü  Dane mogę być prywatne i wspólne

ü  Dane prywatne

dostępne są tylko dla wątku właściciela ü  Transfer danych odbywa się bardziej przejrzyście

ü  Synchronizacja jest

wciąż potrzebna lecz jest przeważnie ukryta

http://www.openmp.org  

 

w-­‐13  

(57)

Literatura  

Introduction  to  Parallel   Computing.    

A.  Grama,  G.  Karypis,   V.  Kumar,    

B.  A.  Gupta.  Addison-­‐

Wprowadzenie  do   obliczeń  równoległych.   Zbigniew  J.  Czech.  PWN,   Warszawa,  2013.   Parallel   Programming.  

Rauber  &  Ruenger.   Springer,  2010.  

(58)

Za  tydzień  ...    

Obraz

Fig. 1.28 Data Parallel Model

Cytaty

Powiązane dokumenty

Zauważyliśmy wyżej, że spośród trzech kolumn macierzy możemy wybrać najwyżej dwie, aby mieć układ liniowo niezależny. Wektory zapisane w tych dwóch kolumnach będą

Argument sid jest numerem identyfikacyjnym zestawu semaforów zwróconym przez funkcję semget(), zaś numer_semafora jest kolejnym numerem semafora w zestawie licząc

Uruchomienie programu za pomocą 7 wątków korzystając z odpowiedniej klauzuli, sprawdzenie poprawności działania kodu

Uzupełnienie programu o definicje zadań (tasks) – dla wersji równoległej openmp wyszukiwania binarnego (można wzorować się na procedurze sortowania przez scalanie merge_sort_openmp

Kompilator używa konstruktora kopiującego, gdy program generuje kopię obiektu (np. w sytuacji, gdy obiekt przekazywany jest do funkcji przez wartość). void f(Osoba

Znając łańcuch decyzji optymalnych łatwo odtworzyć łańcuch optymalnych sterowań (odpływów ze zbiornika ) przy których zapewniona zostanie minimalna wartość wskaźnika

W wypadku negatywnym (nie życzę tego nikomu) możliwe są dwa rodzaje ocen: (a) zaliczenie 2, (b) zaliczenie 3,

[4 ] Mark Mitchell, Jefrey Oldham, Alex Samuel, LINUX Programowanie dla zaawansowanych RM 2002. Salama; UNIX Programowanie systemowe, RM