Publicado el 18 de Agosto del 2020
962 visualizaciones desde el 18 de Agosto del 2020
2,7 MB
67 paginas
Creado hace 13a (08/02/2012)
Curso de Promoción Educativa
Curso de Promoción Educativa
Programación en el Supercomputador Ben Arabi
Programación en el Supercomputador Ben Arabi
Programación con OpenMP
Programación con OpenMP
Javier Cuenca
Universidad de Murcia
Indice de la
Indice
de la sesión
sesión
Introducción.
Nociones básicas
Ejemplo inicial
Directivas
Constructores
Claúsulas de alcance de datos
Funciones de librería
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prácticos
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
22
Nociones básicas
Nociones básicas
• Modelo de programación fork-join, con generación de múltiples 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 continúa la ejecución el maestro.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
33
Ejemplo inicial: ejemplo_hello.c
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 Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
44
Directivas
Directivas
#pragma omp nombre-directiva [cláusulas]
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
55
Indice de la
Indice
de la sesión
sesión
Introducción.
Nociones básicas
Ejemplo inicial
Directivas
Constructores
Claúsulas de alcance de datos
Funciones de librería
Variables de entorno
Ejemplos
Tareas en OpenMP 3.0
Uso de OpenMP en el supercomputador Ben Arabi
Ejercicios prácticos
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
66
Constructores:
Constructores:
parallel
Constructor parallel
Constructor
#pragma omp parallel [cláusulas]
bloque
Se crea un grupo de threads
El que los pone en marcha actúa de maestro.
Con cláusula if se evalúa su expresión
si da valor distinto de cero se crean los threads
si es cero se hace en secuencial.
Número de threads a crear se obtiene por
variables de entorno o llamadas a librería.
Hay barrera implícita al final de la región.
Cuando dentro de una región hay otro constructor paralelo: anidamiento
cada esclavo crearía otro grupo de threads esclavos de los que sería el
maestro.
Cláusulas (private, firstprivate, default, shared, copyin y reduction) forma en
que se accede a las variables.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
77
Constructores:
Constructores:
Constructor forfor
Constructor
#pragma omp for [cláusulas]
bucle for
•
•
•
•
•
•
•
Las iteraciones se ejecutan en paralelo por threads que ya existen
La parte de inicialización del for debe ser una asignación
La parte de incremento debe ser una suma o resta
La parte de evaluación es la comparación 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 cláusula nowait.
Hay una serie de cláusulas (private, firstprivate, lastprivate y reduction) para indicar
la forma en que se accede a las variables.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
88
Constructores:
Constructores:
Constructor forfor: ejemplo_for.c
: ejemplo_for.c
Constructor
#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 Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
99
Constructores:
Constructores:
Constructor forfor
Constructor
•
•
•
•
Una cláusula schedule indica la forma como se dividen las iteraciones del for entre los
threads:
schedule(static,tamaño) las iteraciones se dividen según el tamaño, y la asignación
se hace estáticamente a los threads. Si no se indica el tamaño se divide por igual
entre los threads.
schedule(dynamic,tamaño) las iteraciones se dividen según el tamaño y se asignan
a los threads dinámicamente cuando van acabando su trabajo.
schedule(guided,tamaño) las iteraciones se asignan dinámicamente a los threads
pero con tamaños decrecientes, empezando en tamaño numiter/np y acabando en
“tamaño”.
schedule(runtime) deja la decisión para el tiempo de ejecución, y se obtienen de la
variable de entorno OMP_SCHEDULE.
• ver modificaciones ejemplo_for.c
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1010
Constructores:
Constructores:
sections
Constructor sections
Constructor
#pragma omp sections [cláusulas]
{
[#pragma omp section]
bloque
[#pragma omp section
bloque
...
}
•
•
•
Cada sección se ejecuta por un thread.
Hay barrera al final de “sections” a no ser que se utilice la cláusula nowait.
Hay una serie de cláusulas (private, firstprivate, lastprivate y reduction) para indicar
la forma en que se accede a las variables.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1111
Constructores:
Constructores:
Constructor sections
Constructor
sections: ejemplo_sections.c
: 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 sección 2ª \n",iam);
#pragma omp section
printf("Soy el thread %d, en solitario en la seccion 3ª \n",iam);
}//sections
}//parallel
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1212
Constructores:
Constructores:
Constructores combinados
Constructores combinados
#pragma omp parallel for [cláusulas]
bucle for
Es forma abreviada de directiva parallel que tiene una única directiva for, y admite sus
cláusulas menos la nowait.
#pragma omp parallel sections [cláusulas]
Es forma abreviada de directiva parallel que tiene una única directiva sections, y admite sus
cláusulas menos la nowait.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1313
Constructores:
Constructores:
Constructores de ejecución secuencial
Constructores de ejecución secuencial
#pragma omp single [cláusulas]
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 cláusula nowait.
#pragma omp master
bloque
El bloque lo ejecuta el thread maestro.
No hay sincronización al entrar ni salir.
#pragma omp ordered
bloque
•
•
•
•
•
Todo dentro de un for, el bloque se ejecuta en el orden en que se ejecutaría en
secuencial.
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1414
Constructores:
Constructores:
Constructores de ejecución secuencial: ejemplos
Constructores de ejecución secuencial: ejemplos
ejemplo_single.c
Barreras al final de cada single
ejemplo_master.c
Ejecución solamente por thread maestro (el 0)
No hay barreras
ejemplo_ordered.c
Se ordena la ejecución por iteraciones del bucle
Facultad de Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1515
Constructores:
Constructores:
Constructores de ejecución secuencial: ejemplo_single.c
Constructores de ejecución 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 Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1616
Constructores:
Constructores:
Constructores de ejecución secuencial: ejemplo_master.c
Constructores de ejecución 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 Informática. Universidad de Murcia
Facultad de Informática. Universidad de Murcia
1717
Constructores:
Constructores:
Constructores de ejecución secuencial: ejemplo_ordered.c
Constr
Comentarios de: Programación con OpenMP (0)
No hay comentarios