Sunteți pe pagina 1din 6

Proiectarea unui algoritm paralel

Una dintre cele mai importante trsturi ale unui algoritm paralel
este divizarea problemei n subprobleme care pot fi distribuite pe
mai multe taskuri. Pentru proiectarea unuialgoritm paralel se pot
considera o serie de abordri. Prima ar fi paralelizarea
unui algoritm secvenial deja existent. Pentru aceasta va trebui s
se determine paralelismul care apare n mod natural n cadrul
unui algoritm secvenial . Uneori, se prefer gsirea unei soluii
diferite de cea oferit de algoritmul secvenial ceea ce presupune
o regndire a ntregului algoritm. Indiferent de modul de abordare
n cadrul unui algoritm paralel nu se pot ignora o serie de
consideraii importante. Una din acestea este costul de
comunicaie ntre procese. Dac la un algoritm secvenial costul
sau complexitatea este exprimat n spaiu (mrimea memoriei
ocupate) i timp (numrul de cicli de ceas) necesar pentru a
executa un program, la cel paralel trebuie luat n considerare i
modul n care se comunic ntre procese.
Problema comunicaiei
Exist unii algoritmi de calcul paralel care nu au nevoie de
comunicare ntre procese. Spre exemplu dac ne imaginm un
algoritm paralel care face conversia unei imagini color n una alb
negru. Datele din acea imagine pot fi distribuite pe mai multe
taskuri independente. Acest tip de probleme sunt denumite
"embarrassingly parallel" [1] (paralelism jenant) deoarece
comunicarea ntre taskuri este foarte redus. Cei mai muli
algoritmi paraleli sunt algoritmi compleci n care comunicaia
ntre procese are o importan major. Complexitatea algoritmilor
paraleli este calculat n funcie de memoria folosit i timp. Ei
trebuie s mai optimizeze folosirea unei alte resurse,
comunicarea ntre procese/procesoare. Sunt dou modaliti prin
care procesele/procesoarele comunic: Memorie partajat sau
Folosind mesaje. Modelul cu memorie partajat se refer la
programarea ntr-un mediu multiprocesor pentru care
comunicaia ntre procese se realizeaz prin intermediul unei
memorii comune. Modelul cu transfer de mesaje este adecvat
implementrii unui algoritm paralel ntr-o reea de calculatoare.

Pentru ca un program s poat fi executat n paralel acesta


trebuie descompus ntr-o serie de procese. Aceasta
descompunere presupune partiionarea algoritmului i alocarea
proceselor. Partiionarea reprezint specificarea setului de taskuri
care implementeaz algoritmul n modul cel mai eficient pe o
main de calcul paralel. Alocarea reprezint modul de distribuire
a task-urilor procesoarelor.
Partiionarea problemei
Performana unui algoritm de calcul paralel depinde de granularitate.
Aceasta se refer la mrimea task-ului n comparaie cu timpul necesar
comunicaiei i sincronizrii datelor. Dac timpul necesar comunicaiei
i sincronizrii este mai mare dect timpul de execuie al task-ului
atunci granularitatea este mic. O soluie este partiionarea programului
n taskuri de dimensiuni mai mari cu o granularitate grosier.
Dezavantajul acestei metode este reducerea gradului de paralelism.
mbuntirea performanelor unui algoritm de calcul paralel se face
prin gsirea unui compromis ntre mrimea task-ului i consumul
suplimentar de resurse. De obicei este gsit o corelare ntre numrul de
taskuri, dimensiunea acestora i meninerea la minimu necesar a
consumului suplimentar de resurse. Cea mai bun granularitate este cea
obinut prin adaptarea algoritmului pe platforma hardware pe care
ruleaz. n majoritatea cazurilor overhead-ul asociat comunicaiilor i
sincronizrii este mare n comparaie cu timpul de execuie caz n care
se prefer o granularitate grosier. Partiionarea unui algoritm se poate
face n dou moduri:
1. Static: Partiionarea se face nainte de execuie. Avantajul
acestei metode este acela c necesit un volum redus de
comunicaii. Pe de alt parte metoda aceasta prezint
dezavantajul ca gradul de paralelism s fie dat de datele de
intrare.
2. Dinamic: Generarea task-urilor este fcut n timpul de
execuie al programului. Avantajul acestei metode este dat
de meninerea procesoarelor ocupate cu preul creterii
volumului comunicaiei dintre procese.

Alocarea
Alocarea reprezint distribuirea de taskuri procesoarelor.
Planificarea ca i n cazul partiionrii poate fi static sau
dinamic. n cazul alocrii statice sarcinile i ordinea de execuie
sunt cunoscute nainte de execuie. Algoritmii de calcul
paralel ce folosesc planificarea static necesit un volum mic de
comunicare ntre procese potrivit pentru cazurile cnd costurile
de comunicaie este mare. n cazul planificrii dinamice alocarea
sarcinilor este fcut la rulare. Aceast tehnic permite
distribuirea uniform a ncrcrii procesoarelor i ofer flexibilitate
n utilizarea unui numr mare de procesoare. Astfel dac
un procesor termin mai repede task-ul alocat i se poate atribui
un alt task mrind n acest mod eficiena algoritmului.
Dezavantaje:

volumul de "overhead" este mare


modul de execuie este greu de urmrit
analiza performanelor devine dificil, ca urmare a alocrii
task-urilor n timpul rulrii.

Limitele programrii paralele


Conform legii lui Amdahl accelerarea unui program este dat de
urmtoarea formul:
, unde P reprezint poriunea
din cod care poate fi paralelizat. Dac nici o poriune a
programului nu poate fi paralelizat atunci accelerarea este 1
(algoritm secvenial). Daca P=1 (tot codul poate fi paralelizat),
atunci accelerarea este infinit (cel puin teoretic). Dac luam n
considerare c un algoritm paralel ruleaz pe mai multe
procesoare obinem urmtoarea formul:
, unde P
reprezint partea din algoritm care poate fi paralelizat, N
reprezint numrul de procesoare i S partea care nu a fost
paralelizat.Cu toate c un algoritm paralel are limitele sale
conform celei de-a doua formule putem concluziona c acetia

sunt foarte eficieni n rezolvarea problemelor de dimensiuni mari,


n care partea secvenial rmne neschimbat.
Factorii ce afecteaz performana algoritmilor paraleli

ncrcarea neechilibrat a porcesoarelor:


1. Imposibilitatea mpririi in taskuri perfect egale
2. Variaia gradului de paralelism n cadrul algoritmului

Calculele suplimentare ce apar n cazul n care cel mai


rapid algoritm secvenial nu poate fi paralelizat i se alege un
algoritm paralel greoi, dar paralelizabil
Comunicaia ntre procese
Concurena la setul de date partajate

Biblioteca mpich2
Message Passing Interface
MPI este un protocol de comunicatie folosit pentru programarea
paralela menit sa ofere functionalitate pentru sincronizarea si
comunicarea intre procese intr-un mod independent de limbaj si de
platforma ( exista implementari ale MPI pentru aproape orice
platforma ). Programele MPI sunt orientate catre procese, asadar
pentru obtinerea de performante maxime trebuiesc definite pe fiecare
computer atatea procese cate procesoare exista ( sau core-uri ).
MPICH2 e o implementare free, open-source a MPI-2. Cele mai
importante componente ale MPICH sunt
mpd ( multi-purpose daemon ) si mpiexec. Mpd are rolul de manager
in ceea ce priveste comunicarea si sincronizarea intre procese, iar
mpiexec are rolul de a lansa in executie aplicatiile MPI.
Sintaxa mpiexec:
Cel mai comun mod de utilizare al mpiexec este :
mpiexec n <numar procese> [-host <host>] aplicatie [: -n <numar
procese> -host <host> aplicatie]

Motive pentru utilizarea MPI:


Standardizare - MPI este singurul mesaj biblioteca trecerea care poate fi
considerat un standard. El este sprijinit pe aproape toate platformele de
HPC. Practic, le-a nlocuit toate bibliotecile trectori mesajul anterior.
Portabilitate - Exist puine sau nici o nevoie de a modifica codul surs
atunci cnd portarea aplicaiilor la o platform diferit care accept (i
este compatibil cu) standardul MPI.
Oportuniti de performan - implementri furnizor ar trebui s poat
s exploateze caracteristicile hardware native pentru a optimiza
performanta.
Funcionalitate - Exist peste 440 de rutine definite n MPI-3, care
include cea mai mare parte a celor de la MPI-2 i MPI-1.
Disponibilitate - O varietate de implementari sunt disponibile, att
vnztor i domeniul public.
Biblioteca OMP
OpenMP : API (Application Program Interface) utilizat pentru a controla
explicit paralelismul cu memorie partajata si fire multiple de executie.
Componente:
-directive compilator;
-functii runtime de biblioteca;
-variabile de mediu.
OpenMP este disponibil pentru C/C++ si Fortran. Exista implementari
pe o multitudine de platforme, inclusiv Unix si Windows.
Model de programare

OpenMP: memorie partajata si fire multiple de executie.


-> model de programare explicit (nu automat) => programatorul
are un control deplin asupra paralelismului.
modelul fork-join de executie paralela
Program OpenMP incepe cu un proces singular (thread master) ->
secvential -> constructie de regiune paralela (FORK) -> mai multe
thread-uri in paralel -> JOIN -> thread-ul master, etc.
Numarul de thread-uri : se poate modifica dinamic.
Structura unui program OpenMP :
#include <opm.h>
void main ( )
{
int var1, var2, var3;
..... cod secvential .....
//incepe sectiunea paralela => FORK
#pragma omp parallel private (var1, var2) shared (var3)
{
..... sectiune paralela executata de toate thread-urile .....
//toate thread-urile => JOIN => thread master
}
..... reia cod secvential .....
}

S-ar putea să vă placă și