0% encontró este documento útil (0 votos)
84 vistas31 páginas

Open MP

1) El documento describe el modelo de programación paralela OpenMP y sus características principales como la paralelización de bucles, gestión de variables privadas y compartidas, secciones críticas, reducciones y sincronización. 2) OpenMP permite la paralelización incremental de código secuencial mediante directivas de compilación pragmas. 3) Se explican funciones como la planificación de bucles paralelos y el paralelismo funcional mediante secciones.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
84 vistas31 páginas

Open MP

1) El documento describe el modelo de programación paralela OpenMP y sus características principales como la paralelización de bucles, gestión de variables privadas y compartidas, secciones críticas, reducciones y sincronización. 2) OpenMP permite la paralelización incremental de código secuencial mediante directivas de compilación pragmas. 3) Se explican funciones como la planificación de bucles paralelos y el paralelismo funcional mediante secciones.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 31

Programacin Multi e!

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

MEMORIA Procesador Procesador Procesador

Paralelismo 'or/0,oin
.e!ra

Soporta paraleli#acin incremental

maestra

' " & +

, " I &egin paralela

.e!ra maestra

' " & +

, " I &egin paralela

.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

#pragma omp <directiva> {<clusula>}* <\n>


Funciones de librera Variables de entorno

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

Paraleli#acin de !ucles 4=5


#pragma omp parallel for for ( i= primero; i< ultimo; i+= incr ) celda[ i ]= TRUE;

.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

-Emero de e!ras e identificacin


Baria!les de entorno "MPC-UMC>.&$1DS
,mero de "ebras por defecto en secciones paralelas

void ompCsetCnumCt reads4 int numC e!ras 5D


Fi-a el n,mero de "ebras en secciones paralelas

!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

void ompCgetCt readCnum4void5D


Devuelve n,mero de "ebra. 0+1+num2"ebras34

Gestin de varia!les privadas


Podemos especificar <uF varia!les sern privadas y cuales compartidas
5tra formulacin del e-emplo anterior
#include <omp.h> void main(void){ int !"#- i$ char% cptr$ cptr& malloc(si'eo((char))$ #pra)ma omp parallel (or shared( - cptr) (or( i& * $ i< " $ i++ ) ! i #& i$ G

Gestin de varia!les privadas 4=5


*lusula private3 #pra)ma omp parallel (or private4 j 5 (or( i& * $ i< m $ i++ ) (or( .& * $ . < n $ .++ ) a ! i # ! . # & a!i#!*# + a ! i # ! . # $
'(iste una copia de las variables i y - para cada "ebra $ue e-ecute el blo$ue precedente 'l valor de i j. Despu6s del bucle es indefinido ya $ue no se conoce el valor a la
salida de las variables privadas. o se "ereda el valor de las variables compartidas.

Gestin de varia!les privadas 4A5


1signacin de valores co erentes a varia!les privadas

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 8as variables de la lista se inicializan de acuerdo con sus valores originales.

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

L"1D Harea sum Htemp 2 Harea ... ... ... ...

S>"&$ Harea

S>"&$ Harea

I.=

$%clusin mutua 4=5


Definicin de una seccin cr)tica3 #pragma omp critical [nombre] Bentajas3 ...
dou le area- pi- /$ int i-n$ ... area& *.*$ #pra)ma omp parallel (or private(/) (or( i& * $ i< n $ i++ ) { / & (i+*.5)1n$ #pra)ma omp critical area +& 6.*1(4.* + /%/)$ , pi & area 1 n$

7 Secuencializan cdigo )depuracin*. 7 9cceso seguro a memoria compartida.

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

$%clusin mutua 4J5


#pragma omp atomic
1segura <ue una posicin espec)fica de memoria de!e ser modificada de forma atmica2 sin permitir <ue mEltiples t reads intenten escri!ir en ella de forma simultnea. Proporciona una seccin m ini;critical.
#include <omp.h> int main(void) { int /& *$ #pra)ma omp parallel {#pra)ma omp atomic /& /+4$ , return *$ ,

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$

Planificacin de !ucles paralelos


K*mo se distri!uyen las e!ras el tra!ajoM
7 Sea n el n,mero de iteraciones totales. 7 Sea t el n,mero de "ebras.

7 Sc edule 47tipo9N2 7tamaOo9P 5


sc"edule)static*+ n;t iteraciones contiguas por "ebra. sc"edule)static+ +*+ asignacin de < iteraciones contiguas. sc"edule)dynamic*+ una iteracin cada vez. sc"edule)dynamic+ +*+ < iteraciones cada vez. sc"edule)guided+ +*+ descenso e(ponencial con <. sc"edule)guided*+ descenso e(ponencial. sc"edule)runtime*+ depende de la variable 5=!2S>'D#8'.
'-emplo. setenv 5=!2SC>'D#8' ?static+4@

Planificacin de !ucles paralelos


Distri!ucin de iteraciones de costo varia!le

... #pra)ma omp parallel (or private(.) schedule (d<namic-5) (or( i& * $ i< 5*** $ i++ ) (or( .& * $ .< ((i)$ .++ ) tarea0costo0varia le(i-.)$

Paralelismo funcional en "penMP


$s posi!le asignar diferente cdigo a a cada e!ra
#include <omp.h> ... #pra)ma omp parallel { #pra)ma omp sections { #pra)ma omp section v& al(a()$ #pra)ma omp section @& eta()$ , #pra)ma omp sections { #pra)ma omp section /& )amma(v-@)$ #pra)ma omp section <& delta()$ , , print((Valor de epsilon= %6.6f\n- epsilon(/-<) )$

alfa

!eta

gamma

delta

epsilon

$n las regiones paralelas anidadas2 se ejecuta slo la prim era e!ra <ue llegue...

Rpragma omp parallel


*lculo Monte*arlo de Q en "penMP
... #include Aomp.hA int main(int ar)c-char % ar)v!#) { int n- i$ dou le pi0est-/-<$ int in0circle & *$ int local0in0circle-t$ unsi)ned short /i!"#$ n&atoi(ar)v!4#)$ omp0set0num0threads(atoi(ar)v!2#))$

#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 */

if (x! !" #pragma omp flush (x" ###


/* O$ % La directiva flush es encerrada en una instrucci&n */

if (x! !" ' #pragma omp flush (x" ( ####

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

-o esta impl)cita si esta presente la clusula noTait y en3


1 la entrada for master sections single S S S S S 1 la salida

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$ , ,

Producto escalar de dos vectores


#include <omp.h> #include <stdio.h> #include <stdli .h> #de(ine LE7:E= 4** (loat a!LE7:E=#- !LE7:E=#- sum$ (loat dotprod () { int i-tid$ tid & omp0)et0thread0num()$ #pra)ma omp (or reduction (+?sum) (or (i&*$ i < LE7:E=$ i++) sum & sum + (a!i#% !i#)$ , int main (int ar)c- char %ar)v!#) { int i$ (or (i&*$ i < LE7:E=$ i++) a!i# & !i# & 4.* % i$ sum & *.*$ #pra)ma omp parallel dotprod()$ print((A9um & C(EnA-sum)$ ,

(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

P-gina %e intel para !ajarse compilador para Linu%


ttp300TTT.intel.com0cd0softTare0products0asmo;na0eng0=@VII@. tm

TTT.openmp.org

También podría gustarte