Open MP
Open MP
ra con "penMP
Jos Miguel Mantas Ruiz Depto. de Lenguajes y Sistemas Informticos Universidad de Granada
*ontenidos
Modelo de Programacin e Introduccin
Paraleli#acin de !ucles Gestin de varia!les privadas $%clusin mutua &educciones Paralelismo 'uncional Sincroni#acin en "penMP $jemplos (i!liograf)a y enlaces recomendados
Modelo de Programacin
Modelo de Programacin de Memoria compartida
Sincronizacin y Comunicac. mediante vars. compartidas
Procesador
Paralelismo 'or/0,oin
.e!ra
maestra
.e!ra maestra
.e!ra maestra
$l estndar "penMP
$s una 1PI2 define slo una interfa#. $%presa paralelismo multi ilo en sistemas de memoria compartida. *omponentes3
Directivas #pragma de compilacin Informan al compilador para optimizar cdigo
Paraleli#acin de !ucles
Un !ucle es fcilmente paraleli#a!le en "penMP &eglas3
o dependencia entre iteraciones !ro"ibidas instrucciones !rea/2 e%it452 goto2... 'orma *1-6-I*1
for( i=INICIO; i
7 78 98 9
FINAL;
i:: ::i i;; ;;i i:8 inc i;8 inc i8 i : inc i8 inc : i i8 i ; inc
.e!ra maestra crea e!ras adicionales para cu!rir las iteraciones del !ucle $l m!ito de cada directiva "penMP es el del !lo<ue <ue ay justo a continuacin.
#na sola instruccin es un blo$ue. #na sentencia for define su propio blo$ue. #n blo$ue convencional entre % &.
Paraleli#acin de !ucles4A5
*ada e!ra tiene su propio conte%to de ejecucin
'(isten variables compartidas )misma direccin en el conte(to de cada "ebra* y variables privadas. !or defecto+ todas son COMPARTIDAS+ salvo el iterador del bucle. #include <omp.h> void main(void){ int !"#$ char% cptr$ int i$ cptr& malloc(si'eo((char))$ #pra)ma omp parallel (or (or( i& * $ i< " $ i++ ) ! i #& i$ ,
.$1P S>1*+
cptr i
i
.e!ra Maestro 4?5
.e!ra 4@5
!ara colocar el n,mero de "ebras igual al n,mero de nodos del multiprocesador. int ompCgetCnumCprocs4 void 5D
Devuelve n/ de procesadores fsicos disponibles para el programa paralelo
7 firstprivate
/!*#& (uncion0comple.a()$ #pra)ma omp parallel (or (irstprivate(/) (or( i& * $ i< n $ i++ ) { /! i#& /!*# % / !i12#$ ,
7 lastprivate
#pra)ma omp parallel (or lastprivate(i) (or( i& 2 $ i< n $ i++ ) { /! i #& /!i34# % / !i32#$ , (i o04* & /!i#$
7 'l valor $ue se copia al ob-eto original es el valor en la ,ltima iteracin del bucle.
$%clusin mutua
*lculo de pi3 *ondiciones de carrera
4
4 = 2 0 1 +x
... dou le area- pi- /$ int i-n$ ... area& *.*$ #pra)ma omp parallel (or private(/) (or( i& * $ i< n $ i++ ) { / & (i+*.5)1n$ area +& 6.*1(4.* + /%/)$ , pi & area 1 n$
.$(&1;?
3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Memoria area
.$(&1;@
I.?
L"1D Harea sum Htemp 2 Harea
I.? I.=
S>"&$ Harea
S>"&$ Harea
I.=
Desventajas3
7 Disminuyen eficiencia al reducir paralelismo.
'l nombre opcional de la seccin crtica permite coe(istir a regiones crticas diferentes.
8os nombres act,an como identificadores globales. :odas las secciones crticas $ue no tienen nombre son tratadas como la misma.
$%clusin mutua4A5
'unciones para gestin de cerrojos
7ERRO8O9 9IMP:E9 void omp0init0loc;( omp0loc;0t % cerro.o )$ void omp0destro<0loc;( omp0loc;0t % cerro.o )$ void omp0set0loc;( omp0loc;0t % cerro.o )$ void omp0unset0loc;( omp0loc;0t % cerro.o )$ int omp0test0loc;( omp0loc;0t % cerro.o )$ int omp0)et0nested( void )$
7ERRO8O9 A=I>A>O9 void omp0init0nest0loc;( omp0nest0loc;0t % cerro.o )$ void omp0destro<0nest0loc;( omp0nest0loc;0t % cerro.o )$ void omp0set0nest0loc;( omp0nest0loc;0t % cerro.o )$ void omp0unset0nest0loc;( omp0nest0loc;0t % cerro.o )$ int omp0test0nest0loc;( omp0nest0loc;0t % cerro.o )$
La sentencia de!e tener una de las siguientes formas3 % 7operacion-binaria> 8 <expr> %:: ::% Slo atomi#a la lectura y escritura de la varia!le. %;;; La evaluacin de la e%presin no es atmica ;;;%
KcuidadoL
&educciones en "penMP
$l ejemplo anterior se puede mejorar
... dou le area- pi- /$ int i-n$ ... area& *.*$ #pra)ma omp parallel (or private(/) reduction(+?area ) (or( i& * $ i< n $ i++ ) { / & (i+*.5)1n$ area +& 6.*1(4.* + /%/)$ , pi & area 1 n$
Paraleli#acin condicional
*lusula i Si n no es suficientemente grande2 los gastos de gestin de e!ras pueden acer <ue no e%ista ganancia paralela
... #pra)ma omp parallel (or private(/) reduction(+?area ) i( ( n > 5*** ) (or( i& * $ i< n $ i++ ) { / & (i+*.5)1n$ area +& 6.*1(4.* + /%/)$ , pi & area 1 n$
... #pra)ma omp parallel (or private(.) schedule (d<namic-5) (or( i& * $ i< 5*** $ i++ ) (or( .& * $ .< ((i)$ .++ ) tarea0costo0varia le(i-.)$
alfa
!eta
gamma
delta
epsilon
$n las regiones paralelas anidadas2 se ejecuta slo la prim era e!ra <ue llegue...
#pra)ma omp parallel private(i-/i-t-/-<-local0in0circle) { local0in0circle&*$ /i!*#&atoi(ar)v!"#)$ /i!4#&atoi(ar)v!6#)$ /i!2#&omp0)et0thread0num()$ t&omp0)et0num0threads()$ (or (i & /i!2#$ i < n$ i+&t) { / & erand6B(/i)$ < & erand6B(/i)$ i( (/%/ + <%< <& 4.*) local0in0circle++$, #pra)ma omp critical in0circle+&local0in0circle$ , print((AEstimate o( pi& CD.5(EnA-6.*%((dou le) in0circle)1n)$ return *$,
Sincroni#acin en "penMP
#pragma omp l!"# [$<li"ta %e &ariable">']
$specifica un punto de sincroni#acin donde se re<uiere <ue todas las e!ras del grupo tengan una visin consistente de ciertos o!jetos en la memoria. $n este punto se escri!en en memoria varia!les <ue son visi!les por las e!ras. Si no se especifica lista de varia!les2 se escri!en en memoria todos los o!jetos compartidos por las e!ras.
/* ERROR - La directiva flush no puede ser la sentencia justamente inmediata a una sentencia if */
Sincroni#acin en "penMP
#pragma omp l!"# [$<li"ta %e &ariable">']
int main() { int data- (la)&*$ #pra)ma omp parallel sections num0threads(2) { #pra)ma omp section :ee(Fdata)$ #pra)ma omp (lush(data) (la) & 4$ #pra)ma omp (lush((la)) , #pra)ma omp section { @hile (G(la)) { #pra)ma omp (lush((la)) , #pra)ma omp (lush(data) Procesa(Fdata)$print(0s(ACdEnA- data)$ , , , void :ee(int %data) { print(0s(Aread dataEnA)$ %data & 4$ , void Procesa(int %data) { print(0s(Aprocess dataEnA)$ (%data)++$ ,
Sincroni#acin en "penMP
#pragma omp l!"# [$<li"ta %e &ariable">']
La directiva l!"# esta impl)cita en
!arrier critical ordered parallel for sections single parallel for parallel sections 1 la entrada S S S 1 la salida S S S S S S S S
S S
Sincroni#acin en "penMP
#pragma omp barrier
Sincroniza todos los t"reads del e$uipo. Cuando un t"read alcanza una directiva barrier+ esperarA en ese punto "asta $ue todos los t"reads del e$uipo lleguen "asta esta directiva. Cuando todos los t"reads "an alcanzado dic"o punto+ contin,an con la e-ecucin en paralelo del cdigo $ue sigue a la barrera. Cla,sula noTait. 8as "ebras de un bucle paralelo no se sincronizan al final del mismo y pueden continuar con la siguiente sentencia despu6s del bucle sin esperar a $ue el resto finalice.
#pra)ma omp parallel shared (A ! "# pri$ate(id# {id&omp0)et0thread0num()$ A!id# & i)0calc4(id)$ #pra)ma omp arrier #pra)ma omp (or (or(i&*$i<=$i++) {7!i#& i)0calc"(I-A)$, #pra)ma omp (or no%ait (or(i&*$i<=$i++){ H!i#& i)0calc2(7i)$ , A!id# & i)0calc"(id)$ ,
Sincroni#acin en "penMP
#pragma omp t#rea%pri&ate Se utiliza para permitir $ue varibles de Ambito global se conviertan en locales y persistentes a una "ebra de e-ecucin a trav6s de m,ltiples regiones paralelas.
#include <omp.h> int a- - i- tid$ (loat /$ #pra)ma omp threadprivate(a- /) main () { 1% >esactivo a.uste dinImico nJmero de he ras%1 omp0set0d<namic(*)$ #pra)ma omp parallel private( -tid) { tid & omp0)et0thread0num()$ a & tid$ & tid$ / & 4.4 % tid +4.*$ print((AKhread Cd? a- -/& Cd Cd C(EnA-tid-a- -/)$ , #pra)ma omp parallel private(tid) {tid & omp0)et0thread0num()$ print((AKhread Cd? a- -/& Cd Cd C(EnA-tid-a- -/)$ , ,
Sincroni#acin en "penMP
#pragma omp or%ere% ( cla)"!la or%ere% 'l cdigo afectado se e-ecuta en el orden en $ue las iteraciones "ubieran sido e-ecutadas en una e-ecucin secuencial del bucle. !uede aparecer slo una vez en el conte(to de una directiva for o parallel for. Slo puede estar una "ebra e-ecutAndose simultAneamente
static (loat a!4***#- !4***#- c!4***#$ void test(int (irst- int last) { #pra)ma omp (or schedule(static) ordered (or (int i & (irst$ i <& last$ ++i) { 11 7Ilculo i( (i C 2) { #pra)ma omp ordered print(0s(Atest() iteration CdEnA- i)$, , , void test2(int iter) { #pra)ma omp ordered print(0s(Atest2() iteration CdEnA- iter)$, int main( ) { int i$ #pra)ma omp parallel { test(4- B)$ #pra)ma omp (or ordered (or (i & * $ i < 5 $ i++) test2(i)$ , ,
Sincroni#acin en "penMP
#pragma omp ma"ter 'l cdigo afectado se e-ecuta e-ecutado slo por "ebra maestro del e$uipo. 'l resto de t"reads del e$uipo se saltan esta seccin del cdigo.
#include <omp.h> #include <stdio.h> int main( ) { int a!5#- i$ #pra)ma omp parallel { #pra)ma omp (or (or (i & *$ i < 5$ i++) a!i# & i % i$ 11 Maestro imprime resultados intermedios #pra)ma omp master (or (i & *$ i < 5$ i++) print(0s(Aa!Cd# & CdEnA- i- a!i#)$ #pra)ma omp arrier #pra)ma omp (or (or (i & *$ i < 5$ i++) a!i# +& i$ , ,
(Es<ueda en un array
Rpragma omp parallel pri&ate$i* i%* p* loa%* begin* en%' % p B omp2get2num2t"reads)*C id B omp2get2t"read2num)*C load B ;pC begin B idDloadC end B beginEloadC for )i B beginC ))iFend* GG <eepon*C iEE* % if )aHiI BB (* % <eepon B 0C position B iC & Jpragma omp flus")<eepon* &
(i!liograf)a y enlaces
Parallel Programming in C +it# MPI an% OpenMP. Mic ael ,. Uuinn. Mc GraT;.ill. *ap)tulo @I. Parallel Programming in OpenMP. &o it * andra2 Dave +o r2 Leonardo Dagum2 &ames Menon2 Dror Maydan2 ,eff McDonald. Morgan +aufmann Repo"itorio %e c,%igo OpenMP
ttp300sourceforge.net0projects0ompscr0
TTT.openmp.org