La sintaxis es #pragma omp
Ejemplo: #pragma omp parallel for le dice al compilador que trate a paralelizar el bucle for que sigue, por tanto, el compilador tiene que verificar que cuando se ejecuta, habrá disponible la información necesaria para llevar a cabo las iteraciones
OpenMP Conceptos básicos
Ejemplo #include #include
int main (int argc, char *argv[]) { int p,th_id; p=omp_get_num_procs(); omp_set_num_threads(p); #pragma omp parallel private(th_id); { th_id = omp_get_thread_num(); printf("Hello World from thread %dn", th_id); } return 0; }
OpenMP Conceptos básicos
El contexto de ejecución Todo hilo tiene un contexto de ejecutación, que consiste en el espacio de direcciones que el hilo puede acceder El contexto de ejecutación incluye variables estáticas, estructuras dinámicamente asignadas, etc OpenMP Conceptos básicos
OpenMPParalelismo de datos Características generales de cláusulas de datos: Especifican propiedades “paralelas” de las variables Pueden aparecer tantas veces como sea necesario Pueden usarse con cualquier directiva OpenMP
Restricciones generales de cláusulas de datos: Una variable no puede aparecer en más de una cláusula Sólo admiten variables que sean visibles desde la subrutina o función que incluya la cláusula
Variables compartidas y Variables privadas Una variable compartida tiene la misma dirección en el contexto de ejecutación de cada hilo. Una variable privada tiene una dirección distinta en el contexto de ejecutación de cada hilo. Un hilo no puede acceder a las variables privadas de otro hilo.
OpenMP Paralelismo de datos
OpenMPParalelismo de datos La cláusula SHARED Especifica que una variable es compartida por las tareas: #pragma omp parallel for SHARED( c,d) o ! $OMP PARALLEL SHARED (c,d) … ! $OMP END PARALLEL
OpenMPParalelismo de datos La cláusula SHARED Características de las variables compartidas: Todas las tareas ven su contenido Todas las tareas pueden cambiar su contenido Todas las tareas ven los cambios realizados Peculiaridades de las variables compartidas: Los cambios no son inmediatos (cache coherency) Pueden requerir de sincronía entre tareas Existen algunas limitaciones en Fortran
OpenMPParalelismo de datos La cláusula PRIVATE Especifica que una variable es privada a cada tarea: #pragma omp parallel for PRIVATE(a,b ) o ! $OMP PARALLEL PRIVATE (a,b) … ! $OMP END PARALLEL
OpenMPParalelismo de datos La cláusula PRIVATE Características de las variables privadas: Cada tarea tiene su propia versión de la variable Eso se consigue replicando la variable en memoria Las otras tareas no pueden ver su contenido Peculiaridades de las variables privadas: Su valor inicial no está definido Tras la región paralela su valor tampoco está definido Existen algunas limitaciones
Variables privadas
for (i = 0; i < BLOCK_SIZE(id,p,n); i++) for (j = 0; j < n; j++) a[i][j] = MIN(a[i][j],a[i][k]+tmp[j]);
Cualquier de los bucles se podria ejecutar en paralelo Es mejor paralelizar el bucle exterior para reducir el número de forks/joins Todas las variables excepto el indice son compartidas. Deberiamos dar cada hilo su copia privada de j
OpenMP Conceptos básicos
Variables privadas
#pragma omp parallel for private(j) for (i = 0; i < BLOCK_SIZE(id,p,n); i++) for (j = 0; j < n; j++) a[i][j] = MIN(a[i][j],a[i][k]+tmp[j]);
Cualquier de los bucles se podria ejecutar en paralelo Es mejor paralelizar el bucle exterior para reducir el número de forks/joins Todas las variables excepto el indice son compartidas. Deberiamos dar cada hilo su copia privada de j
OpenMP Conceptos básicos
OpenMPParalelismo de datos La cláusula DEFAULT Especifica el comportamiento por defecto:
#pragma omp parallel for DEFAULT( PRIVATE ) SHARED (a) o
! $OMP PARALLEL DEFAULT ( PRIVATE ) SHARED (a) … ! $OMP END PARALLEL
OpenMPParalelismo de datos La cláusula DEFAULT Características de la cláusula: Sólo puede aparecer una única vez en cada directiva Admite tres opciones: PRIVATE, SHARED y NONE Con NONE todas las variables deben ser definidas Sólo afecta a las variables directamente visibles: Las variables definidas dentro de la subrutina ejemplo no se ven afectadas por la cláusula DEFAULT
firstprivate() Es una extensiónd e la cláusula PRIVATE Se usa para crear una variable privada que tiene su valor inicial igual al valor de la variable controlada por el hilo maestro cuando se entra el bucle. Si un hilo cambia el valor de una variable en alguna iteración, entonces este valor será el valor de la variable en iteraciones subsecuentes
OpenMP Conceptos básicos
firstprivate() x[0] = complex_function(); for (i-0;j<4;j++) x[j]=g(I,x[j-1]); answer[i] = x[i] – x[j]; } Se puede hacer el bucle exterior paralelo si hacemos j y x privadas. Sin embargo, x[0] se necesita en la primera iteración del bucle interior. OpenMP Conceptos básicos
firstprivate() Se podría mover la inicialización de x[0] dentro del bucle anterior, pero es caro. Mejor:
x[0] = complex_function(); #pragma op parallel for private[j] firstprivate(x) for (i-0;j<4;j++) x[j]=g(I,x[j-1]); answer[i] = x[i] – x[j]; }
OpenMP Conceptos básicos
OpenMPParalelismo de datos La cláusula FIRSTPRIVATE Características de las variables FIRSTPRIVATE: Cada tarea tiene su propia versión de la variable Eso se consigue replicando la variable en memoria Las otras tareas no pueden ver su contenido Su valor es inicializado con la variable original Peculiaridades de las variables FIRSTPRIVATE: Tras la región paralela su valor no está definido
La cláusula LASTPRIVATE La cláusula se usa para copiar el valor privado del hilo que ejecutó la última iteración a la copia del hilo maestro
OpenMP Conceptos básicos
OpenMPParalelismo de datos Resumen de cláusulas de datos Cláusulas de datos vistas: SHARED, PRIVATE, DEFAULT, FIRSTPRIVATE Cláusulas de datos adicionales: LASTPRIVATE, REDUCTION, COPYIN, COPYPRIVATE Condiciones generales a tener en cuenta: Una variable sólo puede aparecer en una cláusula, salvo en FIRSTPRIVATE y LASTPRIVATE, a la vez El contador de un bucle siempre es privado Cada cláusula tiene sus limitaciones
OpenMPDirectivas distribución de trabajo Características de estas directivas: Distribuyen una carga de trabajo sobre varias tareas No crean nuevas tareas, usan las ya existentes Funcionan en regiones seriales y en regiones paralelas Incluyen al final una sincronización implicita Restricciones de estas directivas: Deben ser encontradas por todas las tareas Sólo pueden contener bloques estructurados de código
Página anterior | Volver al principio del trabajo | Página siguiente |