procesamiento paralelo - introducción a openmp una api para realizar expl´ıcitamente paralelismo...

Post on 21-Jul-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Procesamiento ParaleloIntroduccion a OpenMP

Javier Iparraguirre

Universidad Tecnologica Nacional, Facultad Regional Bahıa Blanca11 de Abril 461, Bahıa Blanca, Argentina

jiparraguirre@frbb.utn.edu.ar

http://www.frbb.utn.edu.ar/hpc/

22 de abril de 2016

Hilos

¿Que es un hilo (thread)?

• Se define como una entidad con su propio contador deprograma, su datos y codigo

• Para el programador es un procedimiento que corre enforma independiente del programa principal

• Estos procedimientos pueden ser mas de uno y sonejecutados y simultaneamente por el sistema operativos(programa multi-threaded)

Un proceso en el sistema operativo

Procesos y threads

• Un proceso requiere bastante informacion adicional• Algunos de los datos mas relevante son ID proceso,

ambiente, directorio de trabajo, stack, heap, senales• Los threads estan asociados al proceso y ven los recursos• Los threads duplican solo lo necesario para poder correr

de forma independiente• Pueden compartir recursos• Los threads mueren si el proceso padre muere• Son mas livianos que un proceso

Un proceso con threads

UMA y NUMA

El modelo de programacion: UMA y NUMA

OpenMP

¿Que es OpenMP?

• Una API para realizar explıcitamente paralelismomulti-threaded de memoria compartida

• Tiene tres componentes: directivas al compilador, rutinasen tiempo de ejecucion y variables de entorno

• Es un estandar y es portable

Caracterısticas de OpenMP

1 Paralelismo de memoria compartida basado en threads2 Explıcito3 Modelo fork-join4 Basado en directivas al compilador5 Soporta paralelismo dentro del paralelismo6 Threads dinamicos

Ejemplo ejecucion

Hola OpenMP!

# inc lude <s t d i o . h># inc lude <omp. h>i n t main ( ){

i n t nthreads , t i d ;/∗ Se produce un f o r k de va r i os threads , t i d es una v a r i a b l e pr ivada para cada uno ∗ /#pragma omp p a r a l l e l p r i v a t e ( t i d ){

/∗ Obtenemos e l i d de cada thread ∗ /t i d = omp get thread num ( ) ;p r i n t f ( ” Hola mundo desde e l thread = %d\n ” , t i d ) ;/∗ Solo e l thread maestro hace esto ∗ /i f ( t i d == 0){

nthreads = omp get num threads ( ) ;p r i n t f ( ” Numero t o t a l de threads = %d\n ” , nthreads ) ;

}} /∗ Todos los threads se unen a l maestro y terminan ∗ /r e t u r n 0 ;

}

Salida

Hola mundo desde e l thread = 0Hola mundo desde e l thread = 1Numero t o t a l de threads = 2

Compilando

Como compilar

• -openmp para el caso de Intel• -fopenmp para el caso de GNU C/C++

Directivas

Estructura de las directivas

Son cuatro campos principales:

1 #pragma omp requerido para todas las directivasOpenMP en C++

2 nombre de la directiva hay varias directivas posibles3 [argumentos] opcional, pueden estar en cualquier orden y

se pueden repetir si es necesario4 nueva linea requerido, precede al bloque de codigo

alcanzado por la directiva

Ejemplo#pragma omp parallel default(shared) private(beta,pi)

Reglas generales

• Es sensitivo a las mayusculas/minusculas• Las directivas siguen el estandar del compilador C/C++• Solo un nombre de directiva puede ser especificada en

cada delcaracion• Cada directiva se aplica solo la instruccion que la sigue

(puede ser un bloque)• Si la lınea de la instruccion es muy larga, se puede

continuar con el caracter \

Directiva parallel

#pragma omp p a r a l l e l [ c lause . . . ] newl inei f ( sca la r exp ress ion )p r i v a t e ( l i s t )shared ( l i s t )d e f a u l t ( shared | none )f i r s t p r i v a t e ( l i s t )reduc t ion ( opera tor : l i s t )copyin ( l i s t )num threads ( in teger−expr )

{ s t r u c t u r e d b l o c k }

Ejemplo

# inc lude <s t d i o . h># inc lude <omp. h>i n t main ( ){

i n t nthreads , t i d ;/∗ Se produce un f o r k de va r i os threads , t i d es una v a r i a b l e pr ivada para cada uno ∗ /#pragma omp p a r a l l e l p r i v a t e ( t i d ){

/∗ Obtenemos e l i d de cada thread ∗ /t i d = omp get thread num ( ) ;p r i n t f ( ” Hola mundo desde e l thread = %d\n ” , t i d ) ;/∗ Solo e l thread maestro hace esto ∗ /i f ( t i d == 0){

nthreads = omp get num threads ( ) ;p r i n t f ( ” Numero t o t a l de threads = %d\n ” , nthreads ) ;

}} /∗ Todos los threads se unen a l maestro y terminan ∗ /r e t u r n 0 ;

}

Comentarios

• La directiva parallel crea un grupo de threads que se uneal principal

• Se duplica el codigo para cada thread• Hay una barrera de sincronizacion al final de bloque

Cantidad de threads

La cantidad de threads se determina siguiendo este criterio:1 Se evalua la condicion IF2 El valor del parametro NUM THREADS3 Uso de la funcion omp set num threads()4 Seteo de la variable de ambiente OMP NUM THREADS5 Por defecto se usa la cantidad de threads que soporta el

CPU

Compartiendo trabajo

• Estas directivas comparten el trabajo del bloque de codigoalcanzado

• No hay creacion de nuevos threads• Hay tres casos DO/FOR, SECTIONS, SINGLE

DO/FOR

Directiva DO/FOR

#pragma omp f o r [ c lause . . . ] newl ineschedule ( type [ , chunk ] )orderedp r i v a t e ( l i s t )f i r s t p r i v a t e ( l i s t )l a s t p r i v a t e ( l i s t )shared ( l i s t )reduc t ion ( opera tor : l i s t )co l lapse ( n )nowait

f o r l o o p

Ejemplo DO/FOR

# inc lude <omp. h># def ine CHUNKSIZE 100# def ine N 1000i n t main ( ){

i n t i , chunk ;f l o a t a [N] , b [N] , c [N ] ;/∗ Some i n i t i a l i z a t i o n s ∗ /f o r ( i =0; i < N; i ++)

a [ i ] = b [ i ] = i ∗ 1 . 0 ;chunk = CHUNKSIZE;#pragma omp p a r a l l e l shared ( a , b , c , chunk ) p r i v a t e ( i ){

#pragma omp f o r schedule ( dynamic , chunk ) nowaitf o r ( i =0; i < N; i ++)

c [ i ] = a [ i ] + b [ i ] ;} /∗ end of p a r a l l e l sec t i on ∗ /r e t u r n 0 ;

}

SECTIONS

Directiva SECTIONS

#pragma omp sec t ions [ c lause . . . ] newl inep r i v a t e ( l i s t )f i r s t p r i v a t e ( l i s t )l a s t p r i v a t e ( l i s t )reduc t ion ( opera tor : l i s t )nowait

{#pragma omp sec t ion newl ine

s t r u c t u r e d b l o c k

#pragma omp sec t ion newl ine

s t r u c t u r e d b l o c k}

Ejemplo SECTIONS

# inc lude <omp. h># def ine N 1000i n t main ( ){

i n t i ;f l o a t a [N] , b [N] , c [N] , d [N ] ;/∗ Some i n i t i a l i z a t i o n s ∗ /f o r ( i =0; i < N; i ++) {

a [ i ] = i ∗ 1 . 5 ;b [ i ] = i + 22.35;

}#pragma omp p a r a l l e l shared ( a , b , c , d ) p r i v a t e ( i ){

#pragma omp sec t ions nowait{

#pragma omp sec t ionf o r ( i =0; i < N; i ++)

c [ i ] = a [ i ] + b [ i ] ;#pragma omp sec t ionf o r ( i =0; i < N; i ++)

d [ i ] = a [ i ] ∗ b [ i ] ;} /∗ end of sec t ions ∗ /} /∗ end of p a r a l l e l sec t i on ∗ /r e t u r n 0 ;

}

SINGLE

Directiva CRITICAL para sincronizacion

#pragma omp c r i t i c a l [ name ] newl ine

s t r u c t u r e d b l o c k

Ejemplo CRITICAL

# inc lude <omp. h>i n t main ( ){

i n t x ;x= 0 ;#pragma omp p a r a l l e l shared ( x ){

#pragma omp c r i t i c a lx = x + 1;

} /∗ end of p a r a l l e l sec t i on ∗ /r e t u r n 0 ;

}

Directiva BARRIER

#pragma omp b a r r i e r newl ine

Resumen directivas

¡Muchas gracias!

¿Preguntas?jiparraguirre@frbb.utn.edu.ar

Referencias

• G. Ananth, G. Anshul, K. George, and K. Vipin.Introduction to parallel computing, 2003.

• OpenMP Tutorial @LLNLhttps://computing.llnl.gov/tutorials/openMP/

• Sitio oficial OpenMP http://openmp.org/

• Wikipedia http://en.wikipedia.org/wiki/OpenMP

top related