56
Obliczenia równoległe

Obliczenia równoległe

  • Upload
    race

  • View
    57

  • Download
    1

Embed Size (px)

DESCRIPTION

Obliczenia równoległe. Materiały dotyczące obliczeń równoległych dostępne na sieci. Materiały kursu programowania równoległego w CI TASK http://www.task.gda.pl/szkolenia/MPI_kurs Książka on-line ``Designing and Building Parallel Programs'', Ian Foster, Addison Wesley, 1995 - PowerPoint PPT Presentation

Citation preview

Page 1: Obliczenia równoległe

Obliczenia równoległe

Page 2: Obliczenia równoległe

Materiały kursu programowania równoległego w CI TASKhttp://www.task.gda.pl/szkolenia/MPI_kurs

Książka on-line ``Designing and Building Parallel Programs'', Ian Foster, Addison Wesley, 1995 http://wotug.ukc.ac.uk/parallel/books/addison-wesley/dbpp/text/book.html

Książka on-line: ``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

Strona MPICH (wersja MPI opracowana na Uniwersytecie Michigan; znajduje się tam również książka on-line ``Using MPI'') http://www-unix.mcs.anl.gov/mpi/mpich

Materiały dotyczące obliczeń równoległych dostępne na sieci

Page 3: Obliczenia równoległe

„Obliczenia równoległe i rozproszone”

Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Oficyna Wydawnicza Politechniki Warszawskie, 2001

„Using MPI” oraz „Using MPI-2”

William Gropp, Ewing Lusk, Anthony Skjellum,

The MIT Press, Cambridge Massachussetts, London, 1999

Książki

Page 4: Obliczenia równoległe

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.

Page 5: Obliczenia równoległe

Czym jest komputer równoległy?

Jest to system umożliwiający równoczesne przetwarzanie wielu wątków obliczeniowych.

S E

S E

czas

Page 6: Obliczenia równoległe

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.

Page 7: Obliczenia równoległe

Celem 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.

Page 8: Obliczenia równoległe

Taksonomia architektur równoległych wg. Flynna

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

Page 9: Obliczenia równoległe

Zastosowanie: Przetwarzanie obrazówPrzykłady: ICL Distributed Array Processor (DAP); Thinking Machine Corporation's CM-200

Single Instruction Multiple Data

Page 10: Obliczenia równoległe

Multiple Instruction Multiple Data

memory

Pamięć dzielona

Pamięć rozproszonaSGI PowerChallenge

Page 11: Obliczenia równoległe

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.

Page 12: Obliczenia równoległe

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.

Page 13: Obliczenia równoległe

KlastrySuperklastry: Szybkie procesory + bardzo szybka sieć

Klaster Alpha w Pittsburgh Supercomputer Center

Klastry wyspecjalizowane: Szybkie procesory + szybka siećIBM SP2

Profesjonalne klastry typu Beowulf: Szybkie procesory + szybka sieć (>1GB; Myrinet, Giganet)Velocity, Velocity+ w Cornell Theory Center, Galera w 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 seti@home, Clusterix

Szy

bkoś

ć ko

mun

ikac

ji

Shared Memory

Distributed Memory

Page 14: Obliczenia równoległe

Schemat logiczny klastra typu Beowulf

Page 15: Obliczenia równoległe

Architektura klastra typu Beowulf

Page 16: Obliczenia równoległe

Matrix – klaster PC do obliczeń równoległych w laboratorium H.A. Scheragi

410 dwuprocesorowych komputerów PC (820 procesorów)

Nody PIII, K7, lub opteron 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++)

Page 17: Obliczenia równoległe

Ekonomia i logistyka obliczeń równoległych

Page 18: Obliczenia równoległe

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.

Page 19: Obliczenia równoległe

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.

Page 20: Obliczenia równoległe

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.

Rozpoznawanie obrazu

Dekompozycja funkcjonalna: przetwarzanie taśmowe (pipelining)

Page 21: Obliczenia równoległe

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

Page 22: Obliczenia równoległe

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

Page 23: Obliczenia równoległe

Współczynnik przyspieszenia

)n,s(T

),s(T)n,s(S

1

T(s,1) – czas wykonania obliczeń na jednym procesorze.

T(s,n) – czas wykonania tych samych obliczeń na n procesorach.

Page 24: Obliczenia równoległe

Sprawność programu równoległego

)n,s(h)s(w

)s(w)n,s(

w(s) – ilość operacji związanych z wykonywaniem obliczeń

h(s,p) – narzuty na komunikację

• s - wielkość zadania

• n - liczba procesorów

Page 25: Obliczenia równoległe

Prawo Amdahla

Niech p będzie kosztem obliczeniowym zrównolalnej części algorytmu. Jeżeli p nie zależy od liczby procesorów, przyspieszenie obliczeń wyraża się prawem Amdahla:

pt)p(

n

pt

t

tt

tenieprzyspiesz n

singlesingle

single

serialparallel

single

1

1

1

W podanym przykładzie p=99%, 90% i 80%

0

10

20

30

40

50

60

70

80

90

100

10 20 30 40 50 60 70 80 90

99%

90%

80%

100%

Page 26: Obliczenia równoległe

01

1

1

n

glesinglesin

glesin

glesin

qnnp

p

nqtn

ptt)p(

tenieprzyspiesz

Najprostsza modyfikacja prawa Amdahla uwzględniająca narzuty na komunikację

Więcej o analizie skalowalności można znaleźć w książce on line „Designing and building parallel programs”.

Page 27: Obliczenia równoległe

Liczba procesorów

przysp

ieszenie

Liczba procesorów

efektywn

ość

Skalowalność algorytmu MREMD na przykładzie obliczeń dla białka 1SAP na komputerze jubl.fz-juelich.de (Blue Gene)

Page 28: Obliczenia równoległe

wyd

ajn

ość

Skalowalność programu AMBER na przykładzie obliczeń energii BPTI w próżni na klastrze holk.task.gda.pl

Dopasowanie przy założeniu prawa Amdahla bez narzutów na komunikację

Dopasowanie przy założeniu prawa Amdahla z narzutami na komunikację

Linia „teoretyczna”, odpowiadająca 100% sprawności

Page 29: Obliczenia równoległe

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

Page 30: Obliczenia równoległe

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)

Page 31: Obliczenia równoległe

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

Page 32: Obliczenia równoległe

Oprogramowanie do obliczeń równoległych

Page 33: Obliczenia równoległe

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

Page 34: Obliczenia równoległe

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

Page 35: Obliczenia równoległe
Page 36: Obliczenia równoległe

Maszyny z pamięcią lokalną

• High Performance Fortran (HPF) język dyrektyw zrównoleglających (data parallelism)

• Linda: globalna baza danych (tuple space) out,eval,in,inp,rd,rdp

• Parallel Virtual Machine (PVM)

• Message Passing Interface (MPI)

Page 37: Obliczenia równoległe

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

Page 38: Obliczenia równoległe

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

Page 39: Obliczenia równoległe

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

Page 40: Obliczenia równoległe

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).

Page 41: Obliczenia równoległe

Konstrukcja systemu przesyłania wiadomości

                                                                                                             

Page 42: Obliczenia równoległe

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:

                                                            

Page 43: Obliczenia równoległe

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

Page 44: Obliczenia równoległe

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''

Page 45: Obliczenia równoległe

Asynchroniczne wysyłanie wiadomości (nadawca jedynie wie, że wiadomość została wysłana)

                                                                                   

Page 46: Obliczenia równoległe

Synchroniczne przesyłanie wiadomości (nadawca otrzymuje potwierdzenie dotarcia wiadomości)

                                                                    

Page 47: Obliczenia równoległe

„Niewstrzymujące” przesyłanie wiadomości ( nonblocking send)

                                                                               

Page 48: Obliczenia równoległe

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

                                                    

Page 49: Obliczenia równoległe

Broadcast - jeden procesor przesyła dane do pozostałych

                                                                                                  

Page 50: Obliczenia równoległe

Redukcja - procesory przekazują dane do jednego, np. w celu ich zsumowania

                                                      

Page 51: Obliczenia równoległe

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

Page 52: Obliczenia równoległe

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.

Page 53: Obliczenia równoległe

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;}

Page 54: Obliczenia równoległe

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

Page 55: Obliczenia równoległe

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

Page 56: Obliczenia równoległe

#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;}