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

37
Procesamiento Paralelo Introducci ´ on a OpenMP Javier Iparraguirre Universidad Tecnol´ ogica Nacional, Facultad Regional Bah´ ıa Blanca 11 de Abril 461, Bah´ ıa Blanca, Argentina [email protected] http://www.frbb.utn.edu.ar/hpc/ 22 de abril de 2016

Upload: others

Post on 21-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Procesamiento ParaleloIntroduccion a OpenMP

Javier Iparraguirre

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

[email protected]

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

22 de abril de 2016

Page 2: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Hilos

Page 3: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 4: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Un proceso en el sistema operativo

Page 5: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 6: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Un proceso con threads

Page 7: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

UMA y NUMA

Page 8: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

El modelo de programacion: UMA y NUMA

Page 9: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

OpenMP

Page 10: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

¿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

Page 11: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 12: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Ejemplo ejecucion

Page 13: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 ;

}

Page 14: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Salida

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

Page 15: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Compilando

Page 16: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Como compilar

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

Page 17: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Directivas

Page 18: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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)

Page 19: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 \

Page 20: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 }

Page 21: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 ;

}

Page 22: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 23: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 24: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Compartiendo trabajo

• Estas directivas comparten el trabajo del bloque de codigoalcanzado

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

Page 25: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

DO/FOR

Page 26: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 27: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 ;

}

Page 28: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

SECTIONS

Page 29: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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}

Page 30: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 ;

}

Page 31: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

SINGLE

Page 32: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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

Page 33: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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 ;

}

Page 34: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Directiva BARRIER

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

Page 35: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

Resumen directivas

Page 36: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

¡Muchas gracias!

¿[email protected]

Page 37: Procesamiento Paralelo - Introducción a OpenMP Una API para realizar expl´ıcitamente paralelismo multi-threaded de memoria compartida Tiene tres componentes: directivas al compilador,

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