Curso de Promocin Educativa
Programacin en el Supercomputador Ben Arabi
Programacin con OpenMP
Javier Cuenca
Universidad de Murcia
Indice de la sesin
Introduccin.
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
Nociones bsicas
Modelo de programacin fork-join, con generacin de mltiples threads.
Inicialmente se ejecuta un thread hasta que aparece el primer constructor paralelo,
se crean threads esclavos y el que los pone en marcha es el maestro.
Al final del constructor se sincronizan los threads y contina la ejecucin el maestro.
Facultad de Informtica. Universidad de Murcia
Ejemplo inicial: ejemplo_hello.c
#include <omp.h>
int main()
{
int iam =0, np = 1;
#pragma omp parallel private(iam, np)
{
#if defined (_OPENMP)
np = omp_get_num_threads();
iam = omp_get_thread_num();
#endif
printf(Hello from thread %d out of %d \n,iam,np);
}
}
Facultad de Informtica. Universidad de Murcia
Directivas
#pragma omp nombre-directiva [clusulas]
Facultad de Informtica. Universidad de Murcia
Indice de la sesin
Introduccin.
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
Constructores:
Constructor parallel
#pragma omp parallel [clusulas]
bloque
Se crea un grupo de threads
El que los pone en marcha acta de maestro.
Con clusula if se evala su expresin
si da valor distinto de cero se crean los threads
si es cero se hace en secuencial.
Nmero de threads a crear se obtiene por
variables de entorno o llamadas a librera.
Hay barrera implcita al final de la regin.
Cuando dentro de una regin hay otro constructor paralelo: anidamiento
cada esclavo creara otro grupo de threads esclavos de los que sera el
maestro.
Clusulas (private, firstprivate, default, shared, copyin y reduction) forma en
que se accede a las variables.
Facultad de Informtica. Universidad de Murcia
Constructores:
Constructor for
#pragma omp for [clusulas]
bucle for
Las iteraciones se ejecutan en paralelo por threads que ya existen
La parte de inicializacin del for debe ser una asignacin
La parte de incremento debe ser una suma o resta
La parte de evaluacin es la comparacin de una variable entera sin signo con un
valor, utilizando un comparador mayor o menor (puede incluir igual).
Los valores que aparecen en las tres partes del for deben ser enteros.
Hay barrera al final a no ser que se utilice la clusula nowait.
Hay una serie de clusulas (private, firstprivate, lastprivate y reduction) para indicar
la forma en que se accede a las variables.
Facultad de Informtica. Universidad de Murcia
Constructores:
Constructor for: ejemplo_for.c
#include <omp.h>
int main()
{
int iam =0, np = 1, i=0;
#pragma omp parallel private(iam, np,i)
{
#if defined (_OPENMP)
np = omp_get_num_threads();
iam = omp_get_thread_num();
#endif
printf("Hello from thread %d out of
%d\n",iam,np);
#pragma omp for
for(i=0;i<(np*2);i++)
{
printf("Thread %d, contador %d \n",iam,i);
}
}
}
Facultad de Informtica. Universidad de Murcia
Constructores:
Constructor for
Una clusula schedule indica la forma como se dividen las iteraciones del for entre los
threads:
schedule(static,tamao) las iteraciones se dividen segn el tamao, y la asignacin
se hace estticamente a los threads. Si no se indica el tamao se divide por igual
entre los threads.
schedule(dynamic,tamao) las iteraciones se dividen segn el tamao y se asignan
a los threads dinmicamente cuando van acabando su trabajo.
schedule(guided,tamao) las iteraciones se asignan dinmicamente a los threads
pero con tamaos decrecientes, empezando en tamao numiter/np y acabando en
tamao.
schedule(runtime) deja la decisin para el tiempo de ejecucin, y se obtienen de la
variable de entorno OMP_SCHEDULE.
ver modificaciones ejemplo_for.c
Facultad de Informtica. Universidad de Murcia
10
Constructores:
Constructor sections
#pragma omp sections [clusulas]
{
[#pragma omp section]
bloque
[#pragma omp section
bloque
...
}
Cada seccin se ejecuta por un thread.
Hay barrera al final de sections a no ser que se utilice la clusula nowait.
Hay una serie de clusulas (private, firstprivate, lastprivate y reduction) para indicar
la forma en que se accede a las variables.
Facultad de Informtica. Universidad de Murcia
11
Constructores:
Constructor sections: ejemplo_sections.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp sections
{
#pragma omp section
printf("Soy el thread %d, en solitario en la seccion 1 \n",iam);
#pragma omp section
printf("Soy el thread %d, en solitario en la seccin 2 \n",iam);
#pragma omp section
printf("Soy el thread %d, en solitario en la seccion 3 \n",iam);
}//sections
}//parallel
Facultad de Informtica. Universidad de Murcia
12
Constructores:
Constructores combinados
#pragma omp parallel for [clusulas]
bucle for
Es forma abreviada de directiva parallel que tiene una nica directiva for, y admite sus
clusulas menos la nowait.
#pragma omp parallel sections [clusulas]
Es forma abreviada de directiva parallel que tiene una nica directiva sections, y admite sus
clusulas menos la nowait.
Facultad de Informtica. Universidad de Murcia
13
Constructores:
Constructores de ejecucin secuencial
#pragma omp single [clusulas]
bloque
El bloque se ejecuta por un nico thread. No tiene por qu ser el maestro.
Hay barrera al final a no ser que se utilice la clusula nowait.
#pragma omp master
bloque
El bloque lo ejecuta el thread maestro.
No hay sincronizacin al entrar ni salir.
#pragma omp ordered
bloque
Todo dentro de un for, el bloque se ejecuta en el orden en que se ejecutara en
secuencial.
Facultad de Informtica. Universidad de Murcia
14
Constructores:
Constructores de ejecucin secuencial: ejemplos
ejemplo_single.c
Barreras al final de cada single
ejemplo_master.c
Ejecucin solamente por thread maestro (el 0)
No hay barreras
ejemplo_ordered.c
Se ordena la ejecucin por iteraciones del bucle
Facultad de Informtica. Universidad de Murcia
15
Constructores:
Constructores de ejecucin secuencial: ejemplo_single.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp single
printf("Soy el thread %d, actuando en solitario dentro del primer
bloque\n",iam);
sleep(1);
}
#pragma omp single
printf("Soy el thread %d, actuando en solitario dentro ddel
segundo bloque \n",iam);
sleep(1);
}
#pragma omp single
printf("Soy el thread %d, actuando en solitario dentro ddel tercer
bloque \n",iam);
sleep(1);
}
printf("Soy el thread %d, fuera de los singles\n",iam);
}//parallel
Facultad de Informtica. Universidad de Murcia
16
Constructores:
Constructores de ejecucin secuencial: ejemplo_master.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp master
printf("Soy el thread %d, actuando en solitario dentro del primer
bloque\n",iam);
sleep(1);
}
#pragma omp master
printf("Soy el thread %d, actuando en solitario dentro ddel
segundo bloque \n",iam);
sleep(1);
}
#pragma omp master
printf("Soy el thread %d, actuando en solitario dentro ddel tercer
bloque \n",iam);
sleep(1);
}
printf("Soy el thread %d, fuera de los singles\n",iam);
}//parallel
Facultad de Informtica. Universidad de Murcia
17
Constructores:
Constructores de ejecucin secuencial: ejemplo_ordered.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp for ordered
for(i=0;i<5;i++)
{
printf("\t\tSoy el thread %d, antes del ordered en la iteracion
%d\n",iam,i);
#pragma omp ordered
{
printf("Soy el thread %d, actuando en la iteracion
%d\n",iam,i);
sleep(1);
}
}//parallel
Facultad de Informtica. Universidad de Murcia
18
Constructores:
Constructores de sincronizacin
#pragma omp critical [nombre]
bloque
Asegura exclusin mutua en la ejecucin del bloque.
El nombre se puede usar para identificar secciones crticas distintas.
#pragma omp barrier
Sincroniza todos los threads en el equipo.
#pragma omp atomic
expresin
La expresin debe ser:
x binop=exp
, x++, ++x, x-- o x
, donde x es una expresin con valor escalar, y binop es un operador binario.
Asegura la carga y el almacenamiento de la variable x de forma atmica.
Facultad de Informtica. Universidad de Murcia
19
Constructores:
Constructores de sincronizacin: ejemplo_critical.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp critical
{
printf("Soy el thread %d, al inicio de la seccion critica
\n",iam);
sleep(1);
printf("\t\tSoy el thread %d, al final de la seccion critica
\n",iam);
}
}//parallel
Facultad de Informtica. Universidad de Murcia
20
Constructores:
Constructores de sincronizacin: ejemplo_barrier.c
#pragma omp parallel private(iam, np,i)
{
printf("Soy el thread %d, antes del barrier \n",iam);
#pragma omp barrier
printf("\t\tSoy el thread %d, despues del barrier \n",iam);
}//parallel
Facultad de Informtica. Universidad de Murcia
21
Constructores:
Constructores de manejo de variables
#pragma omp flush [lista]
Asegura que las variables que aparecen en la lista quedan actualizadas para
todos los threads.
Si no hay lista se actualizan todos los objetos compartidos.
Se hace flush implcito al acabar barrier, al entrar o salir de critical u ordered, al
salir de parallel, for, sections o single.
ejemplo_flush.c
#pragma omp threadprivate (lista)
Usado para declarar variables privadas a los threads.
Facultad de Informtica. Universidad de Murcia
22
Constructores:
Constructores de manejo de variables: ejemplo_flush.c
#pragma omp parallel private(iam, np,i)
{
#pragma omp master
{
x=999;
printf("Soy el thread %d, actualizando x=999 \n\n",iam);
}
printf("Soy el thread %d, antes del flush, con x=%d
\n",iam,x);
#pragma omp flush(x)
printf("\t\tSoy el thread %d, despues del flush, con x=%d
\n",iam,x);
}//parallel
Facultad de Informtica. Universidad de Murcia
23
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
24
Clasulas de alcance de datos
private(lista)
firstprivate(lista)
indica cmo sern las variables por defecto.
reduction(operador:lista)
compartidas por todos los threads.
default(shared|none)
privadas a los threads, al salir quedan con el valor de la ltima iteracin o seccin.
shared(lista)
privadas a los threads, se inicializan al entrar con el valor que tuviera la variable
correspondiente.
lastprivate(lista)
privadas a los threads, no se inicializan antes de entrar y no se guarda su valor al salir.
se obtienen por la aplicacin del operador.
copyin(lista)
para asignar el valor de la variable en el master a variables locales privadas a los threads al
empezar la regin paralela.
Facultad de Informtica. Universidad de Murcia
25
Clasulas de alcance de datos:
Ejemplos: ejemplo_private.c
int x=1234;
#pragma omp parallel private(iam, np,i,x)
{
printf("Soy el thread %d, antes de actualizar, con x=%d
\n",iam,x);
x=iam*1111;
printf("\t\tSoy el thread %d, despues de actualizar, con x=%d
\n",iam,x);
}
printf("\n Despues de pragma parallel x=%d \n\n",x); //x=1234
Facultad de Informtica. Universidad de Murcia
26
Clasulas de alcance de datos:
Ejemplos: ejemplo_firstprivate.c
int x=1234;
#pragma omp parallel firstprivate(iam, np,i,x)
{
printf("Soy el thread %d, antes de actualizar, con x=%d
\n",iam,x);
x=iam*1111;
printf("\t\tSoy el thread %d, despues de actualizar, con x=%d
\n",iam,x);
}
printf("\n Despues de pragma parallel x=%d \n\n",x); // x=1234
Facultad de Informtica. Universidad de Murcia
27
Clasulas de alcance de datos:
Ejemplos: ejemplo_lastprivate.c
int x=1234;
#pragma omp parallel private(iam, np,i)
{
printf("Soy el thread %d, antes de actualizar, con x=%d
\n",iam,x);
#pragma omp for lastprivate(x) schedule(dynamic)
for(i=0;i<11;i++)
{
x=iam*i;
printf("\tSoy el thread %d, actualizando en for, i=%d
x=%d\n",iam,i,x);
}
printf("\t\tSoy el thread %d, despues de actualizar, con x=%d
\n",iam,x);
}
printf("\n Despues de pragma parallel x=%d \n\n",x);
Facultad de Informtica. Universidad de Murcia
28
Clasulas de alcance de datos:
Ejemplos: ejemplo_reduction.c
int x=1000; int iam =0, np = 1, i=0,j=0;
printf("\n Antes de pragma parallel x=%d \n\n",x);
#pragma omp parallel private(iam, np,i) reduction(+:x)
{
printf("Soy el thread %d, antes de actualizar, con x=%d
\n",iam,x);
x=iam*10;
printf("\t\tSoy el thread %d, despues de actualizar, con x=%d
\n",iam,x);
}//parallel
printf("\n Despues de pragma parallel x=%d \n\n",x);
Facultad de Informtica. Universidad de Murcia
29
Clasulas de alcance de datos:
Ejemplos: ejemplo_copyin.c
int x;
#pragma omp threadprivate(x)
int main()
//x privada a cada thread, no se copia valor del master
int iam =0, np = 1, i=0,j=0;
x=9999; // lo ponemos en el master
#pragma omp parallel private(iam, np,i) copyin(x)
//sin copyin en cada tread x=0, salvo el master
{
printf("Soy el thread %d, antes de actualizar, con x=%d \n",iam,x);
x=1000+iam;
printf("\t\tSoy el thread %d, despues de que actualice, con x=%d \n",iam,x);
}//parallel
printf("\n Despues de pragma parallel x=%d \n\n",x); //x=1000
}//main
Facultad de Informtica. Universidad de Murcia
30
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
31
Funciones de librera
Poner al principio:
#include <omp.h>
void omp_set_num_threads(int num_threads);
Pone el nmero de threads a usar en la siguiente regin paralela.
int omp_get_num_threads(void);
Obtiene el nmero de threads que se estn usando en una regin paralela.
int omp_get_max_threads(void);
Obtiene la mxima cantidad posible de threads.
int omp_get_thread_num(void);
Devuelve el nmero del thread.
int omp_get_num_procs(void);
Devuelve el mximo nmero de procesadores que se pueden asignar al programa.
int omp_in_parallel(void);
Devuelve valor distinto de cero si se ejecuta dentro de una regin paralela.
Facultad de Informtica. Universidad de Murcia
32
Funciones de librera
int omp_set_dynamic(void);
Permite poner o quitar el que el nmero de threads se pueda ajustar dinmicamente en las
regiones paralelas.
int omp_get_dynamic(void);
Devuelve un valor distinto de cero si est permitido el ajuste dinmico del nmero de
threads.
int omp_set_nested(int);
Para permitir o desautorizar el paralelismo anidado.
ejemplo_nested.c
int omp_get_nested(void);
Devuelve un valor distinto de cero si est permitido el paralelismo anidado.
Facultad de Informtica. Universidad de Murcia
33
Funciones de librera
ejemplo_nested.c
#pragma omp parallel private(iam, np,i)
{
#if defined (_OPENMP)
np = omp_get_num_threads();
iam = omp_get_thread_num();
#endif
printf("Hello from thread %d out of %d \n",iam,np);
omp_set_nested(1);
#pragma omp parallel private(iam, np,i)
{
#if defined (_OPENMP)
np = omp_get_num_threads();
iam = omp_get_thread_num();
#endif
printf("\t\tHello from thread %d out of %d \n",iam,np);
}//parallel
}//parallel
Facultad de Informtica. Universidad de Murcia
34
Funciones de librera
void omp_init_lock(omp_lock_t *lock);
Para inicializar una llave. Una llave se inicializa como no bloqueada.
void omp_init_destroy(omp_lock_t *lock);
Para destruir una llave.
void omp_set_lock(omp_lock_t *lock);
Para pedir una llave.
void omp_unset_lock(omp_lock_t *lock);
Para soltar una llave.
int omp_test_lock(omp_lock_t *lock);
Intenta pedir una llave pero no se bloquea.
ejemplo_lock.c
Facultad de Informtica. Universidad de Murcia
35
Funciones de librera:
ejemplo_lock.c
omp_init_lock(&lck);
#pragma omp parallel shared(lck) private(id)
{
id=omp_get_thread_num();
omp_set_lock(&lck);
printf("My thread id is %d.\n",id);
omp_unset_lock(&lck);
while (! omp_test_lock(&lck))
skip(id); }//while
//ahora tengo
work(id);
omp_unset_lock(&lck);
el
lock,
entonces
hago
el
trabajo
}//parallel
omp_destroy_lock(&lck);
Facultad de Informtica. Universidad de Murcia
36
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
37
Variables de entorno
OMP_SCHEDULE
indica el tipo de scheduling para for y parallel for.
OMP_NUM_THREADS
Pone el nmero de threads a usar, aunque se puede cambiar con la funcin de librera.
OMP_DYNAMIC
Autoriza o desautoriza el ajuste dinmico del nmero de threads.
OMP_NESTED
Autoriza o desautoriza el anidamiento. Por defecto no est autorizado.
Facultad de Informtica. Universidad de Murcia
38
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
39
Ejemplos:
Busqueda en array
#pragma omp parallel private(i, id, p, load, begin, end)
{
p = omp_get_num_threads();
id = omp_get_thread_num();
load = N/p; begin = id*load; end = begin+load;
for (i = begin; ((i<end) && keepon); i++)
{
if (a[i] == x)
{
keepon = 0;
position = i;
}
#pragma omp flush(keepon)
}
}
Facultad de Informtica. Universidad de Murcia
40
Ejemplos:
Multiplicacin matriz-vector
void mv(double *a, int fa,int ca,int lda,double *b,int fb,double
*c,int fc)
{
int i, j; double s;
#pragma omp parallel
{
#pragma omp for private(i,j,s) schedule(static,BLOQUE)
for (i = 0; i < fa; i++)
{
s=0.;
for(j=0;j<ca;j++)
s+=a[i*lda+j]*b[j];
c[i]=s;
}
}
}
Facultad de Informtica. Universidad de Murcia
41
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
42
Tareas en OpenMP 3.0
Cambiar OpenMP de thread-centric a task-centric.
Para expresar paralelismo irregular y no estructurado
Para hacer paralelismo anidado de tareas sin que conlleve un estricto paralelismo
anidado de threads con sus consecuentes barriers implicitos que puedan ser
innecesarios.
Para paralelizar bucles while. Por ejemplo recorrido de una lista de punteros de
longitud no conocida
Tied task: ligada a un thread fijo que la ejecutar. Puede tener pausas o hacer otra
cosa, pero ese thread acabar la tarea
Untied task: cualquier thread del team el scheduler le puede asignar una untied task
que est suspendida en ese momento
Facultad de Informtica. Universidad de Murcia
43
Tareas en OpenMP 3.0:
Constructor task
#pragma omp task [clause [[,]clause] ...]
structured-block
Clauses:
if (scalar expression)
untied
default (shared |none)
private (list)
firstprivate (list)
shared (list)
Facultad de Informtica. Universidad de Murcia
44
Tareas en OpenMP 3.0:
Sincronizacin y Finalizacin de tareas
#pragma omp taskwait
Tarea actual se suspende hasta finalizacin de sus tareas hijas
Util para sincronizacin de tareas de grano fino
Un conjunto de tareas ser forzada a completarse en alguno de estos casos:
En una barrier implcita de threads
En una barrier explcita de threads (#pragma omp barrier)
En una barrier de tareas (#pragma omp taskwait)
Facultad de Informtica. Universidad de Murcia
45
Tareas en OpenMP 3.0:
Ejemplo: recorrido de lista (secuencial)
........
while(my_pointer)
{
(void) do_independent_work (my_pointer);
my_pointer = my_pointer->next ;
} // End of while loop
........
Facultad de Informtica. Universidad de Murcia
46
Tareas en OpenMP 3.0:
Ejemplo: recorrido de lista (paralelo)
my_pointer = listhead;
#pragma omp parallel
{
#pragma omp single nowait
{
while(my_pointer)
{
#pragma omp task firstprivate(my_pointer)
{
(void) do_independent_work (my_pointer);
}
my_pointer = my_pointer->next ;
}
} // End of single - no implied barrier (nowait)
} // End of parallel region - implied barrier
Facultad de Informtica. Universidad de Murcia
47
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci
F(0) = 1
F(1) = 1
F(n) = F(n-1) + F(n-2)
(para n=2,3,)
Secuencia valores resultado:
1, 1, 2, 3, 5, 8, 13,
Facultad de Informtica. Universidad de Murcia
48
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci (secuencial recursivo)
long comp_fib_numbers(int n)
{
// Basic algorithm: f(n) = f(n-1) + f(n-2)
long fnm1, fnm2, fn;
if ( n == 0 || n == 1 )
return(n);
fnm1 = comp_fib_numbers(n-1);
fnm2 = comp_fib_numbers(n-2);
fn = fnm1 + fnm2;
return(fn);
}
Facultad de Informtica. Universidad de Murcia
49
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci (paralelo)
long comp_fib_numbers(int n)
{
long fnm1, fnm2, fn;
if ( n == 0 || n == 1 )
return(1);
#pragma omp task shared(fnm1)
{fnm1 = comp_fib_numbers(n-1);}
#pragma omp task shared(fnm2)
{fnm2 = comp_fib_numbers(n-2);}
#pragma omp taskwait
fn = fnm1 + fnm2;
return(fn);
}
Facultad de Informtica. Universidad de Murcia
50
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci (paralelo)
long comp_fib_numbers(int n)
{
long fnm1, fnm2,
fn;
#pragma
#pragma omp
omp parallel
parallel shared(nthreads)
shared(nthreads)
if ( n == 0 {{|| n == 1 )
#pragma
return(1);
#pragma omp
omp single
single nowait
nowait
{{
#pragma omp task shared(fnm1)
result
{fnm1 = comp_fib_numbers(n-1);}
result == comp_fib_numbers(n);
comp_fib_numbers(n);
}
//
End
of
single
} // End of single
#pragma omp task shared(fnm2)
}} //
End
// End of
of parallel
parallel region
region
{fnm2 = comp_fib_numbers(n-2);}
#pragma omp taskwait
fn = fnm1 + fnm2;
return(fn);
}
Facultad de Informtica. Universidad de Murcia
51
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci (paralelo, versin 2)
long comp_fib_numbers(int n)
{
long fnm1, fnm2, fn;
if ( n == 0 || n == 1 ) return(1);
if ( n<20 ) return(comp_fib_numbers(n-1) +comp_fib_numbers(n2));
#pragma omp task shared(fnm1)
{fnm1 = comp_fib_numbers(n-1);}
#pragma omp task shared(fnm2)
{fnm2 = comp_fib_numbers(n-2);}
#pragma omp taskwait
fn = fnm1 + fnm2;
return(fn);
}
Facultad de Informtica. Universidad de Murcia
52
Tareas en OpenMP 3.0:
Ejemplo: Fibonacci. Probando
. iccStart
icc_compilar ejemplo_fibo
ejemplo_fibo
OCULTA
Facultad de Informtica. Universidad de Murcia
53
Tareas en OpenMP 3.0:
Ejemplo: Recorrido de rbol en preorden
void traverse(bynarytree *p)
{
process(p);
if (p->left)
{
#pragma omp task
traverse(p->left);
}
if (p->right)
{
#pragma omp task
traverse(p->right);
}
}
Facultad de Informtica. Universidad de Murcia
54
Tareas en OpenMP 3.0:
Ejemplo: Recorrido de rbol en postorden
void traverse(bynarytree *p)
{
if (p->left)
{
#pragma omp task
traverse(p->left);
}
if (p->right)
{
#pragma omp task
traverse(p->right);
}
#pragma omp taskwait
process(p);
}
Facultad de Informtica. Universidad de Murcia
55
Tareas en OpenMP 3.0:
threads y tareas
Por defecto: tarea t est ligada a un thread h (tied task):
El thread h ejecuta cdigo de t desde principio al final
La ejecucin puede no ser contigua:
En los task scheduling points el thread h puede dedicarse a realizar otra tarea
Task scheduling points:
tareas anidadas
Pragma task
Pragma taskwait
Barreras explcitas o implcitas
Finalizacin de tarea
Valor de threadprivate variables pueden cambiar (por obra de otra tarea ejecutada por
el thread h)
Facultad de Informtica. Universidad de Murcia
56
Tareas en OpenMP 3.0:
threads y tareas
int tp;
#pragma omp threadprivate(tp)
int var;
void work()
{
#pragma omp task
// tarea 1
{
/* do work here */
#pragma omp task
//tarea 1.1. Tarea 1 puede ser suspendida
{
tp = 1;
/* do work here */
#pragma omp task //tarea 1.1.1. -> posible cambio a tarea
1
{
/* no modification of tp */
}
var = tp; //value of tp can be 1 or 2
}
tp = 2;
}
Facultad de Informtica. Universidad de Murcia
57
Tareas en OpenMP 3.0:
threads y tareas
Si la tarea t no est ligada a un thread h (untied task):
El thread h inicia la ejecucin cdigo de t
Otro thread distinto puede continuar la ejecucin de t en cualquier momento
Mismas restricciones con variables threadprivates que en tied task
Evitar cualquier referencia ligada al identificador del thread
Facultad de Informtica. Universidad de Murcia
58
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
59
Uso de OpenMP en el supercomputador Ben Arab
Ben Arab cuenta con dos compiladores que podemos usar para en C+OpenMP
icc 11.1
gcc 4.1.2
Para usar icc:
Previamente ejecutar:
module load icc
Y ya a acontinuacin, podremos trabajar con el compilador, por ejemplo:
icc ejemplo_hello.c -o ejemplo_hello_icc -lm -openmp
Para usar gcc:
Previamente ejecutar:
module load igcc
Y ya trabajar con el compilador, por ejemplo:
gcc ejemplo_hello.c -o ejemplo_hello_gcc -lm -fopenmp
Facultad de Informtica. Universidad de Murcia
60
Uso de OpenMP en el supercomputador Ben Arab
Crear un script para enviar a una cola de trabajos. Por ejemplo, cuando hemos usado icc,
creamos el script trabajo_hello_icc:
#!/bin/bash
#BSUB -J ejemplo_hello_icc
#BSUB -o ejemplo_hello_icc.%[Link]
#BSUB -e ejemplo_hello_icc.%[Link]
#BSUB -q ben_short
#BSUB -n 32
source
module
module
module
/etc/profile.d/[Link]
load mkl
load icc
load intel
export OMP_NUM_THREADS=16
/users/$USER/ejemplos_openmp/ejemplo_hello_icc
Facultad de Informtica. Universidad de Murcia
61
Uso de OpenMP en el supercomputador Ben Arab
Crear un script para enviar a una cola de trabajos. Por ejemplo, cuando hemos usado gcc,
creamos el script trabajo_hello_gcc:
#!/bin/bash
#BSUB -J ejemplo_hello_gcc
#BSUB -o ejemplo_hello_gcc.%[Link]
#BSUB -e ejemplo_hello_gcc.%[Link]
#BSUB -q ben_short
#BSUB -n 32
source
module
module
module
/etc/profile.d/[Link]
load mkl
load gcc
load intel
export OMP_NUM_THREADS=16
/users/$USER/ejemplos_openmp/ejemplo_hello_gcc
Facultad de Informtica. Universidad de Murcia
62
Uso de OpenMP en el supercomputador Ben Arab
Finalmente, envamos el script a la cola de trabajos:
bsub < trabajo_hello_icc
O bien:
bsub < trabajo_hello_gcc
Facultad de Informtica. Universidad de Murcia
63
Uso de OpenMP en el supercomputador Ben Arab
Facultad de Informtica. Universidad de Murcia
64
Uso de OpenMP en el supercomputador Ben Arab
Ver las colas disponibles ejecutamos bqueues.
Consultar el estado de nuestros trabajos ejecutamos el comando bjobs.
Obtener informacin detallada: bjobs con la opcin l.
PEND: esperando en la cola para ser atendido.
RUN: enviado a un host y ejecutndose.
USUSP: suspendido por el usuario.
PSUSP: suspendido mientras esperaba ser atendido
SSUSP: suspendido por el sistema LSF
los recursos usados, los parmetros enviados, el entorno de ejecucin, etc.
Normalmente la salida de un trabajo no est disponible hasta que finaliza
Ver la salida hasta el momento con el comando bpeek seguido del job_id.
Si se ejecuta sin el job_id : informacin sobre el ltimo trabajo lanzado.
Eliminamos un trabajo con el comando bkill seguido del job_id
Facultad de Informtica. Universidad de Murcia
65
Indice de la sesin
Introduccin
Nociones bsicas
Ejemplo inicial
Directivas
Constructores
Clasulas de alcance de datos
Funciones de librera
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prcticos
Facultad de Informtica. Universidad de Murcia
66
Ejercicios
0.- Probar los distintos ejemplos de programas. Razonar su comportamiento
1.- En ejemplo_for.c: probar distintos schedules: esttico vs. dinmico, sin tamao vs.
con tamao=2. Ejecutar y razonar comportamientos.
2.- En ejemplo_sections.c: Agrupar las directivas parallel y sections en una nica.
3.- Compara y razona el comportamiento de ejemplo_sections.c vs.
ejemplo_single.c.
4.- Compara y razona el comportamiento de ejemplo_sections.c vs.
ejemplo_critical.c.
5.- A partir del ejemplo de multiplicacin matriz-vector ejemplo_mv.c: disea un
programa para multiplicar dos matrices AxB=C, donde cada thread se encargue de
calcular un bloque de filas consecutivas de elementos de C.
6.- Disear, programar y probar un programa de recorrido recursivo de un rbol, usando
tareas de OpenMP 3.0. Mostrar qu thread se encarga de procesar cada nodo.
Facultad de Informtica. Universidad de Murcia
67