Publicado el 22 de Diciembre del 2020
615 visualizaciones desde el 22 de Diciembre del 2020
1,6 MB
54 paginas
Creado hace 15a (10/03/2010)
Curso de Computación Científica en Clusters
Programación de Plataformas Paralelas I:
Programación de Plataformas Paralelas I:
OpenMP
OpenMP
Javier Cuenca
Universidad de Murcia
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.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
22
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);
}
}
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
33
Directivas
Directivas
#pragma omp nombre-directiva [cláusulas]
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
44
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.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
55
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.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
66
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);
}
}
}
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
77
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
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
88
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.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
99
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
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1010
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.
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1111
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.
•
•
•
•
•
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1212
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
Curso de Computación Científica en Clusters Facultad de Informática. Universidad de Murcia. Febrero
Curso de Computación Científica en Clusters
Facultad de Informática. Universidad de Murcia. Febrero--Mayo 2010
Mayo 2010
1313
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); }
Comentarios de: Programación de Plataformas Paralelas I - Curso de Computación Científica en Clusters (0)
No hay comentarios