Wprowadzenie, architektury równoległe i obliczenia równoległe, klastry
description
Transcript of Wprowadzenie, architektury równoległe i obliczenia równoległe, klastry
Wprowadzenie, architektury równoległe i obliczenia równoległe, klastry
Materiały:
“Designing and Building Parallel Programs”, Ian Foster, Addison Wesley, 1995 http://wotug.ukc.ac.uk/parallel/books/addison-wesley/dbpp/text/book.html
“MPI: the Complete Reference”, Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker, Jack Dongarra, The MIT Press, 1995 http://www.netlib.org/utk/papers/mpi-book/mpi-book.html
Tutorial z przykładami: http://www-unix.mcs.anl.gov/mpi/tutorial/gropp/talk.html
MPI Forum http://www.mpi-forum.org
Glosariusz funkcji i procedur MPI: http://www-rocq.inria.fr/~kern/MPI/
Strona MPICH (wersja MPI opracowana na Uniwersytecie Michiganhttp://www-unix.mcs.anl.gov/mpi/mpich
“Obliczenia równoległe i rozproszone”,
Praca zbiorowa pod redakcją Andrzeja Karbowskiegoi Ewy Niewiadomskiej-Szynkiewicz
Oficyna Wydawnicza Politechniki Warszawskie, 2001
“Using MPI”
William Gropp, Ewing Lusk, Anthony Skjellum,
The MIT Press, Cambridge Massachussetts, London, 1999
“Using MPI2”
William Gropp, Ewing Lusk, Rajeev Thakur,
The MIT Press, Cambridge Massachussetts, London, 1999
Przetwarzanie równoległe
Równoległość procesowa: współpraca elementów, z których każdy wykonuje określone zadanie, służące realizacji wspólnego celu (budowa, duża organizacja)
Równoległość tablicowa: każdy element wykonuje dokładnie takie samo zadanie (musztra, aerobik)
Równoległość potokowa: każdy element wykonuje zadanie inne niż pozostałe ale zawsze to samo (taśma produkcyjna).
O możliwości obliczeń równoległych wspomniano po raz pierwszy na długo przed skonstruowaniem pierwszej praktycznej maszyny obliczeniowej:
"When a long series of identical computations is to be performed, such as those required for the formation of numerical tables, the machine can be brought into play so as to give several
results at the same time, which will greatly abridge the whole amount of the processes." w “Sketch of the Analytical Engine invented by Charles Babbage” by L.F. Menabrea (1842).
…jednak trudności techniczne spowodowały, że praktyczna realizacja rozpoczęła się dopiero w późnych latach 60-tych.
Pierwszy komputer równoległy: ILLIAC IV, Uniwersytet Illinois, USA (lata siedemćdziesiąte).
Wczesne obliczenia równoległe polegały głównie na przetwarzaniu wektorowym i macierzonym.
Obliczenia współbieżne: takie programy, procesy i wątki, które są w trakcie wykonywania w tym samym czasie
Obliczenia równoległe: obliczenia, w których pewne procesy są realizowane jednocześnie na wielu maszynach lub przez wiele procesów czy procesorów
Obliczenia rozproszone: obliczenia realizowane na wielu komputerach połączonych siecią
• obliczenia na klastrach gdzie maszyny są połączone siecią lokalną• obliczenia gridowe gdzie maszyny są połączone siecią rozległą• usługi sieciowe przy użyciu aplikacji dostępnych globalnie
Czym jest komputer równoległy?
Jest to system umożliwiający równoczesne przetwarzanie wielu wątków obliczeniowych.
S
czas
E
S E
Klasyczny komputer Turinga
Komputer równoległy
Motywacja obliczeń równoległych
Potrzeba - konstrukcja szybszych procesorów nie nadąża za rosnącymi potrzebami obliczeń w nauce i technice, ekonomii, zarządzaniu, itp.
Ekonomia - kilka wolniejszych procesorów jest znacznie tańszych (również w eksploatacji), niż jeden superszybki.
Nieprzekraczalne prawa fizyki - w tej chwili w konstrukcji procesorów dochodzi się już do granic wyznaczonych przez prędkość światła i ziarnistą strukturę materii.
Prognoza pogody dla Polski
Pogoda(długość geograficzna, szerokość geograficzna, wysokość, czas)
PogodaR6 (temperatura, ciśnienie, wilgotność, prędkość wiatru (3 liczby))
Reprezentacja: Pogoda(i, j, l, k)
Metoda przewidywania pogody: rozwiązywanie numeryczne równania Naviera-Stokesa metodą siatek przy danych warunkach brzegowych
Założenia:
• obszar Polski przybliżony jest kwadratem 700 700 km
• bierzemy pod uwagę warstwy 15 km atmosfery n.p.m.
• wyznaczenie nowej wartości dla każdej komórki wymaga 100 operacji (100 flop)
• czas wyprzedzenia prognozy – 4 dni
• dyskretyzacja w przestrzeni – 100 m, w czasie – 5 minut
• prognoza musi być wyliczona po 15 minutach
• 1 liczba rzeczywista zajmuje 8 bajtów pamięci
159
92
10847.010012/1/2441035.7
1035.71.0/151.0/700
komórek siatki przestrzennej
operacji zmiennoprzecinkowych
potrzebna moc obliczeniowa
potrzebna pamięć
TB35.0GB35086107.35
TF1flop1094.0s6015/10847.09
1215
Największa odległość procesora od pamięci
m10319.0s100.94/m/s103100.94c/r 6112812
Pamięć 0.35 TB przy architekturze dwuwymiarowej odpowiada siatce 600000 słów
Wymiar liniowy pojedynczej komórki pamięci:
Å3.5m103.510m/61019.3d 1054
Tymczasem na pojedynczym procesorze jesteśmy w stanie osiągnąć 0.5 – 1 GFlopa. Na prognozę pogody za 4 dni musielibyśmy czekać od 1 do 2 tygodni. Lepiej zatrudnić bacę.
Oszacujmy jakie rozmiary musiałaby mieć pojedyncza komórka pamięci, jeżeli wyniki chcielibyśmy dostać za 15 minut…
Zalety obliczeń równoległych
Przyspieszenie obliczeń
Zwiększenie dokładności lub niezawodności
Umożliwienie wykonania obliczeń przekraczających możliwości szybkości lub pamięci maszyn sekwencyjnych
Zastosowanie obliczeń równoległych
Prognoza pogody
Modelowanie zmian klimatu
Przeszukiwanie baz danych
Animacja wysokorozdzielcza
Budownictwo i inżynieria
Hydrodynamika
Modelowanie molekularne
Biologia molekularna
Genetyka i medycyna
Astronomia i kosmologia
Fizyka cząstek elementarnych
http://www.top500.org
Taksonomia architektur równoległych
Single instruction Multiple instruction
Single Instruction Single Data
Single Instruction
Multiple Data
Multiple Instruction Single Data
Multiple Instruction
Multiple Data
Shared Memory
Distributed Memory
Virtual Shared Memory
Single Instruction Multiple Data – pamięć współdzielna – maszyna wektorowa
Operacje na wektorach danych (np. mnożenie skalarne wektorów, sumowanie współrzędnych wektora)
CDC Cyber 205
Cray 1
Cray 2
Cray 3
Fujitsu VPX 2000
Hitachi S3600
Zastosowanie: Przetwarzanie obrazówPrzykłady: ICL Distributed Array Processor (DAP); Thinking Machine Corporation's CM-200
Single Instruction Multiple Data – pamięć rozproszona – tablica procesorów
Multiple Instruction Multiple Data
memory
Pamięć dzielona
Pamięć rozproszonaSGI PowerChallenge
Podana klasyfikacja opisuje architektury wyidealizowane. Bardzo często rzeczywiste maszyny są mieszaniną architektur różnych typów. Przykładem jest architektura wirtualnej pamięci dzielonej (VSM), gdzie każdy procesor posiada swoją własną pamięć, jednak wszystkie procesory posiadają również globalną przestrzeń adresową, do której mają bezpośredni dostęp.
Przykładem maszyny VSM jest Cray T3D.
Schematy połączeń w architekturach rozproszonych
pierścień
sieć torus
hipersześcian
SP2: Architektura
• Klaster maszyn SMP
Interconnect
Memory
CPU
CPU
SP2: Sieć komunikacyjna
• Procesory są dołączone do przełączników; każdy przełącznik łączy 16 procesorów. Takie grupy 16 procesorów są połączone w większą sieć.
Switch Board
Nodes
SP2: parametry sieci komunikacyjnej
• Maksymalna szybkość transmisji: 2.4 GB/s
• Opóźnienie (latency) ok. 2 s.
• Średnia szybkość transmisji: 185 Mbyte/s (1.5GB)
SP2: Konfiguracja I/O
• Nody mają lokalne dyski SCSI.• Wszystkie nody mają równy dostęp do globalnego
równoległego systemu plików (Global Parallel File System; GPFS)
• Komunikacja z GPFS:– Nody do nody na której jest posadowiony GPFS poprzez IP
– Nod na którym jest GPFS do macierzy dyskowej poprzez pętlę SSA (Serial Storage Architecture)
SP2: Konfiguracja I/O
Switch
Switch
GPFS Nodes
Disk Array
Nodes
Klastry
Większość obecnie używanych komputerów równoległych to klastry o architekturze mieszanej. Klaster jest układem niezależnych jednostek obliczeniowych połączonych siecią komunikacyjną. Zwykle każda jednostka posiada niezależną pamięć (jednak jednostka może zawierać kilka procesorów ze wspólną pamięcią). Taki typ architektury równoległej jest bardzo elastyczny.
Klastry
Superklastry: Szybkie procesory + bardzo szybka sieć Klaster BigBen w Pittsburgh Supercomputer Center, JuGene w Forschungszentrum Juelich
Klastry wyspecjalizowane: Szybkie procesory + szybka siećIBM SP2
Profesjonalne klastry typu Beowulf: Szybkie procesory + szybka sieć (>1GB; Myrinet, Giganet)Holk w CI TASK
Standardowe klastry typu Beowulf: Szybkie lub standardowe procesory + standardowa sieć (10-100MB)Większość klastrów PC (matrix, piasek)
Klastry rozproszone: Standardowe procesory połączone siecią Internet folding@home, Clusterix
Szy
bkoś
ć ko
mun
ikac
ji
Pamięć współdzielna
Pamięć rozproszona
Schemat logiczny klastra typu Beowulf
Architektura klastra typu Beowulf
Matrix – klaster PC do obliczeń równoległych w laboratorium H.A. Scheragi
196 dwuprocesorowych komputerów PC (382 procesory)
Nody PIII lub K7 połączone switchem HP 7000 ProCrve.
System operacyjny Linux
Message Passing Interface (MPICH) dla przetwarzania równoległego
Portable Batch System (PBS) dla kontroli zadań
Kompilatory z Portland Group (Fortran 90, Fortran 77, C and C++)
Ekonomia i logistyka obliczeń równoległych
Cele zrównoleglenia i zadania z nim związane
Efektywny kod równoległy powinien zapewnić wykorzystanie wszystkich procesorów przez cały czas (load-balancing) oraz zawierać tylko niezbędną komunikację między procesorami.
Największym problemem jest zawsze dekompozycja algorytmu na podzadania równoległe, które muszą być od siebie niezależne lub słabo zależne. Te podzadania nazywamy ziarnami, które są rozdzielane pomiędzy procesory. Wyróżnia się dwa typy dekompozycji: dekompozycję funkcjonalną oraz dekompozycję danych.
Realizacja powyższego zadania wymaga długiej pracy wysoko wykwalifikowanych programistów.
W ogromnej większości przypadków algorytm nie może być do końca zrównoleglony.
Dekompozycja zadań
Dekompozycja trywialna
Dekompozycja funkcjonalna
Dekompozycja danych
Narzuty związane z obliczeniami równoległymi (overhead): opóźnienie komunikacji (latency), czas komunikacji, synchronizacja, itp.
Dekompozycja trywialna
Algorytm jest złożony z części zupełnie od siebie niezależnych
Przykłady: Wykonanie dużej liczby minimalizacji funkcji, obliczanie średnich metodą Monte Carlo.
W przypadku dekompozycji trywialnej komunikacja między procesorami jest niepotrzebna.
W przypadku dekompozycji funkcjonalnej zadanie zostaje rozbite na bloki, które muszą być dla określonych danych wykonywane sekwencyjnie. Kolejne moduły są realizowane przez różne procesory i przetewarzają po kolei różne dane.
Przetwarzanie obrazu
Dekompozycja funkcjonalna: przetwarzanie taśmowe (pipelining)
Dekompozycja funkcjonalna: farmy zadań
Dane są dzielone na ziarna, którymi zawiaduje wybrany procesor główny (nadzorca). Nadzorca rozdziela dane do przetworzenia pomiędzy robotników (lub niewolników). Po wykonaniu zadania każdy robotnik zwraca wynik do kolektora wyników, którym jest zwykle nadzorca.
Nadzorca
Robotnik 1 Robotnik 2 Robotnik 3 Robotnik 4
Kolektor wyników
Dekompozycja danych
Te same obliczenia są wykonywane przez wszystkie procesory dla różnych części danych
Przykład: Obliczanie energii układu molekularnego
f(1,1,1,1) f(1,1,1,2) f(1,1,1,3) … f(1,1,2,1) f(1,1,2,2) f(1,1,2,3) … …
1
1 1 1],[
, ,
)(mol mol iat jat
ji
n
i
n
ij
n
k
n
llklktype rfE
f(1,1,1,1)
f(1,1,1,2)
…
f(k1,k2,k3,k4)
f(k1+1,k2+1,k3+1,k4+1)
…
f(l1,l2,l3,l4)...
f(n1,n2,n3,n4)
Procesor 1
Procesor 2
.
.
.
Procesor p
Energia całkowita
Współczynnik przyspieszenia
),(
)1,(),(
pnT
nTpnS
Sprawność programu równoległego
),()(
)(),(
pnhnw
nwpn
w(n) – liczba operacji związanych z wykonywaniem obliczeń
h(n,p) – narzuty na komunikacje
• n - wielkość zadania
• p - liczba procesorów
• T(n,p) – czas wykonania
Prawo Amdahla
p – liczba procesorów
n – wielkość zadania
tsingle=T(n,1) – czas wykonania zadania na 1 procesorze
(n) – udział części nie dającej się zrównoleglić
ntn
p
nt
t
tt
tpnS
p
singlesingle
single
serialparallel
single
11
),(
Prawo Gustafsona
''
''
''''
''
)1(),(
parallelserial
serial
parallelserial
parallelserial
tt
ts
psstt
pttpnS
Zwykle maleje ze wzrostem rozmiaru problemu. Jeżeli założymy że tserial jest zawsze stałe (np. na I/O) a liczbę procesorów zwiększamy proporcjonalnie do rozmiaru problemu, przyspieszenie wyraża się następująco (primy oznaczają, że punktem odniesienia są czasy na p procesorach):
0
10
20
30
40
50
60
70
80
90
100
10 20 30 40 50 60 70 80 90
99%
90%
80%
100%
p
S(p)
Przypadek gdy (n)=
Dewastujący wpływ synchronizacji na przyspieszenie (symulacje dynamiki molekularnej z wymianą replik)
z synchronizacją
bez synchronizacji
Badania skalowalności
Słaby test skalowalności (weak scalability test): niezależnie od liczby procesorów, każdemu procesorowi przydzielamy zawsze taką samą ilość pracy (tak jak przy wyprowadzaniu prawa Gustafsona).
Silny test skalowalności (strong scalability test): dla każdej liczby procesorów całkowita ilość pracy do wykonania jest stała.
Oprogramowanie do obliczeń równoległych
• System operacyjny
• Języki wysokiego poziomu
• Kompilatory
• Biblioteki procedur numerycznych
• Biblioteki do sterowania zadaniami
• Narzędzia do wspomagania programowania, uruchamiania i profilowania
Paradygmaty programowania równoległego
• Możliwe rzadkie używanie bariery
• Minimalizacja czasu zajmowanego przez mechanizmy synchronizacji (pamięć wspólna)
• Minimalizacja czasu zajmowanego przez mechanizmy komunikacji (pamięć rozproszona)
Stopień ziarnistości obliczeń równoległych
• Ziarnistość opisuje ilość operacji obliczeniowych między punktami synchronizacji
• Ilość danych przypadająca na procesor, częstotliwość komunikacji i synchronizacji
• Grube ziarno, ang. coarse grain
• Drobne ziarno, ang. fine grain
Oprogramowanie do obliczeń równoległych
Maszyny z pamięcią wspólną
• Procesy– Mechanizmy komunikacji międzyprocesowej (IPC)
• Mechanizm wątków (thread)– Tworzenie, niszczenie, identyfikacja, punkty
synchronizacji (zamek, semafor)– Lokalne zmienne wątku
• Dyrektywy kompilatora
• Standard OpenMP
SUBROUTINE MULKJI(A,B,C,N)CC Multiply A=B*C using index order K/J/IC DIMENSION A(N,N),B(N,N),C(N,N)C TIME3=TIMEF() CALL SECOND(TIME1)
CMIC$ DO ALL SHARED(N, A, B, C) PRIVATE(K, J, I) DO 30 K=1,N DO 20 J=1,NCDIR$ IVDEP DO 10 I=1,N A(I,K)=A(I,K)+B(I,J)*C(J,K)10 CONTINUE20 CONTINUE30 CONTINUE
CALL SECOND(TIME2) TIME4=TIMEF() TEMP=(TIME4-TIME3)/1000.0 WRITE(*,’(1X,A,I5,A,G14.6,A,G14.6)’) *'MULIJK - N=',N,' CPU=',TIME2-TIME1,' Elapsed=',TEMP RETURN END
Maszyny z pamięcią lokalną
• High Performance Fortran (HPF) język dyrektyw zrównoleglających (data parallelism)
• Unified Parallel C (UPC)
• Linda: globalna baza danych (tuple space) out,eval,in,inp,rd,rdp
• Parallel Virtual Machine (PVM)
• Message Passing Interface (MPI)
PROGRAM main IMPLICIT NONE INTEGER N PARAMETER (N=1000) INTEGER i, procnum(N), procsum(N), sum1, sum2
!HPF$ DISTRIBUTE PROCNUM(BLOCK) !HPF$ ALIGN PROCSUM(I) WITH PROCNUM(I) FORALL (i = 1:N) procnum(i) = i sum1 = SUM(procnum) PRINT *, 'Sum using global reduction is ', sum1 procsum = 0 DO i = 1, N procnum = CSHIFT(procnum,1) procsum = procsum + procnum END DO sum2 = procsum(1) PRINT *, 'Sum using local shifts is ', sum2 FORALL (i = 1:N) procnum(i) = procsum(i) - procsum(1) END FORALL IF (SUM(procnum) .EQ. 0) THEN PRINT *, 'Array values are the same.' ELSE PRINT *, 'OOPS! Array values are not the same!' ENDIF STOP END
PVM
• 1989 Oak Ridge National Laboratory
• Komputery połączone siecią tworzą równoległą maszynę wirtualną
• Biblioteka procedur i funkcji do tworzenia procesów użytkownika oraz przesyłania komunikatów miedzy procesami
MPI
• 1993 spotkania producentów i użytkowników maszyn równoległych
• Standard interfejsu do przesyłania komunikatów opracowany przez MPI Forum
• MPI jest nadzbiorem funkcji oferowanych przez PVM
• wszystkie procesy maja wspólny kod
Charakterystyka standardowego interfejsu przesyłania wiadomości MPI:
• Kod jest napisany w „zwyczajnym” języku programowania (Fortran 77, Fortran 90, C, C++); przesyłanie wiadomości jest realizowane poprzez wywołanie odpowiednich procedur lub funkcji.
• Wszystkie zmienne są lokalne dla danego procesora; inny procesor może je uzyskać tylko poprzez wymianę wiadomości.
• Zwykle każdy procesor realizuje ten sam program wykonywalny (Single Program Multiple Data; SPMD), jednak występuje podział na procesor (procesory) nadzorujące (master) oraz „robotników” (workers) lub „niewolników” (slaves); realizują one inne fragmenty kodu, niż master.
IF (ME == MASTER) THEN
CALL SUB_MASTER(parametry)
ELSE
CALL SUB_WORKER(parametry)
ENDIF
W celu umożliwienia realizacji innych części kodu przez dany procesor lub grupę procesorów, każdy procesor ma własny identyfikator (0, 1, ..., NPROC-1).
Konstrukcja systemu przesyłania wiadomości
Definicja i konstrukcja wiadomości
Wiadomość: pakiet danych przemieszczających się między procesorami.Podobnie jak list czy faks, oprócz właściwych przesyłanych danych musi ona być opakowana w „kopertę” (zawierać nagłówek) umożliwiający jej dostarczenie do właściwego odbiorcy:
Koperta musi zawierać następujące informacje dla systemu przesyłania wiadomości:
• Procesor wysyłający • Lokalizacja źródła wiadomości • Typ przesyłanych danych • Długość przesyłanych danych • Procesor(y) odbierające • Lokalizacja odbiorcy wiadomości • Wielkość buforu odbiorcy
Rodzaje przesyłania wiadomościW zależności od zachowania nadawcy po wysłaniu wiadomości, przesyłanie dzielimy na:
• Asynchroniczne (asynchronous send) - nadawca wysyła wiadomość i nie interesuje się jej
dalszymi losami. Można to porównać do wysłania okolicznościowej kartki do dalszego znajomego. • Synchroniczne - (synchronous send) nadawca żąda potwierdzenia dotarcia wiadomości.
W zależności od dalszej jego akcji dalszy podział jest następujący:
• Wstrzymujące (blocking send) - nadawca wstrzymuje dalszą akcję do czasu potwierdzenia dotarcia wiadomości (można to porównać z wysyłaniem faksu lub rozmową telefoniczną). W MPI ten tryb wysyłania wiadomości jest standardem.
• Niewstrzymujące (nonblocking send) - nadawca po wysłaniu wiadomości może
wykonywać coś innego, po czym sprawdza, czy wiadomość dotarła.
Realizacja operacji „niewstrzymujących” jest kontynuowana po powrocie do programu wywołującego. Po każdej instrukcja przesyłania „niewstrzymującego” powinna następować odpowiadająca jej instrukcja oczekiwania na potwierdzenie odbioru wiadomości. Jeżeli instrukcja oczekiwania jest kolejną instrukcją po instrukcji wysłania, jest to równoważne przesyłaniu ``wstrzymującemu''
Asynchroniczne wysyłanie wiadomości (nadawca jedynie wie, że wiadomość została wysłana)
Synchroniczne przesyłanie wiadomości (nadawca otrzymuje potwierdzenie dotarcia wiadomości)
„Niewstrzymujące” przesyłanie wiadomości ( nonblocking send)
Komunikacja zbiorowa (kolektywna) W MPI podstawowym trybem komunikacji jest tryb międzypunktowy „od procesora do procesora”. Dla ułatwienia pisania złożonych programów równoległych, które wymagają zebrania danych od wszystkich procesorów, rozesłania danych przez „nadzorcę” do „robotników”, synchronizacji procesorów, itp. wprowadzono tryb komunikacji zbiorowej, realizowany przez odpowiednie procedury MPI. Trzy najczęściej spotykane sytuacje: synchronizacja, broadcast (rozesłanie danych) i redukcja (zgrupowanie danych) są zilustrowane na poniższych rysunkach.
Bariera - synchronizacja procesów
Broadcast - jeden procesor przesyła dane do pozostałych
Redukcja - procesory przekazują dane do jednego, np. w celu ich zsumowania
Kompilacja z użyciem bibliotek MPINajprościej: użyć odpowiedniego skryptu wywołującego kompilator z dołączaniem
bibliotek MPI:
mpif77 - Fortran 77 mpicc - CmpiCC - C++
Poniżej podany jest przykład linii polecenia dla kompilacji kodu źródłowego programu hello w Fortranie 77.
mpif77 -o hello hello.f Makefile
FC = /usr/bin/g77INSTALL_DIR=/opt/scaliFFLAGS = -c ${OPT} -I$(INSTALL_DIR)/includeLIBS = -L$(INSTALL_DIR)/lib_pgi -L$(INSTALL_DIR)/lib -lmpi -lfmpi
.SUFFIXES: .f
.f.o: ${FC} ${FFLAGS} $*.fhello: hello.o ${FC} -o hello $(LIBS) hello.o
Pisanie kodów żródłowych z użyciem MPI - inicjalizacja, zakończenie, informacje o przydzielonych procesorach.
W każdym żródle muszą się znaleźć definicje zawarte w pliku mpi.h (C) lub mpif.h (Fortran); plik ten musi być zaspecyfikowany jako pierwszy plik include. Program musi zawsze zawierać instrukcję inicjalizacji MPI (MPI_Init) i zakończenia MPI (MPI_Finalize). Komunikacja między procesorami oraz inne funkcje MPI są realizowane poprzez wywołanie odpowiednich procedur.
Ogólna postać wywołania procedur MPI jest następująca:
C: ierr = MPI_Xyyyyy( parametry )
lub
MPI_Xyyyyy( parametry )
Zmienna ierr typu int jest kodem wyjścia z procedury; 0 oznacza zakończenie poprawne. Należy zwrócić uwagę, że nazwa procedury MPI zaczyna się od MPI_X, gdzie X jest pierwszą literą nazwy procedury (zawsze duża litera); dalsza część nazwy jest pisana małymi literami.
Fortran (77 lub 90): CALL MPI_XYYYYY( parametry, IERROR )
Podobnie jak w wersji C, IERROR (zmienna typu INTEGER) jest kodem wyjścia. Zgodnie z konwencją Fortranu, wielkość liter w nazwie procedury nie odgrywa roli.
Przykład programu z użyciem bibliotek MPI (C):
#include "mpi.h"#include <stdio.h>
int main( argc, argv )int argc;char **argv;{ int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( "Hello world! I'm %d of %d\n",rank, size );
MPI_Finalize();
return 0;}
Przykład programu z użyciem bibliotek MPI (Fortran 77):
program main include "mpif.h" integer rank, size
call MPI_Init( ierr )
call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
call MPI_Comm_size( MPI_COMM_WORLD, size, ierr )
print 10, rank, size
call MPI_Finalize(ierr);
10 format("Hello world! I'm",i3," of",i3) return end
program main include 'mpif.h' integer rank, size, to, from, tag, count, i, ierr integer src, dest integer st_source, st_tag, st_count integer status(MPI_STATUS_SIZE) double precision data(100)
call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr ) print *, 'Process ', rank, ' of ', size, ' is alive' dest = size - 1 src = 0 if (rank .eq. src) then to = dest count = 10 tag = 2001 do 10 i=1, 10 10 data(i) = i call MPI_SEND( data, count, MPI_DOUBLE_PRECISION, to, + tag, MPI_COMM_WORLD, ierr ) else if (rank .eq. dest) then tag = MPI_ANY_TAG count = 10 from = MPI_ANY_SOURCE call MPI_RECV( data, count, MPI_DOUBLE_PRECISION, from, + tag, MPI_COMM_WORLD, status, ierr ) print *, rank, ' received', (data(i),i=1,10) endif
call MPI_FINALIZE( ierr ) end
#include "mpi.h"#include <stdio.h>
int main( argc, argv )int argc;char **argv; { int rank, size, to, from, tag, count, i, ierr; int src, dest; int st_source, st_tag, st_count; MPI_Status status; double data[100]; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); printf("Process %d of %d is alive\n",rank,size); dest = size - 1; src = 0; if (rank == src) { to = dest; count = 10; tag = 2001; for (i=0;i<10;i++) { data[i] = i+1; } MPI_Send( data, count, MPI_DOUBLE_PRECISION, to,tag, MPI_COMM_WORLD ); }else if (rank == dest) { tag = MPI_ANY_TAG; count = 10; from = MPI_ANY_SOURCE; MPI_Recv( data, count, MPI_DOUBLE_PRECISION, from,tag, MPI_COMM_WORLD, &status ); printf("%d received ",rank); for (i=0;i<10;i++) printf ("%10.5f",data[i]); printf("\n"); } MPI_Finalize(); return 0;}