Documentos de Académico
Documentos de Profesional
Documentos de Cultura
con OpenMP
• Modelo de Programación de
Memoria compartida MEMORIA
– Sincronización y Comunicac.
Procesador Procesador Procesador Procesador
mediante vars. compartidas
• Paralelismo Fork/Join
F J F J
O O O O
Hebra R I Hebra R I Hebra
maestra K N maestra K N maestra
• Soporta paralelización
incremental Región paralela Región paralela
El estándar OpenMP
• Componentes:
– Directivas #pragma de compilación
• Informan al compilador para optimizar código
– Variables de entorno
Paralelización de bucles
#include <omp.h>
#include <omp.h>
void main(void){
int b[3], i;
char* cptr;
cptr= malloc(sizeof(char));
• Cláusula private:
Existe una copia de las variables i y j para cada hebra que ejecute
el bloque precedente
El valor de i j:
Después del bucle es indefinido ya que no se conoce el valor a la
salida de las variables privadas.
No se hereda el valor de las variables compartidas.
Gestión de variables privadas (3)
Asignación de valores coherentes a variables privadas
– firstprivate – lastprivate
x[0]= funcion_compleja(); #pragma omp parallel for lastprivate(i)
for( i= 2 ; i< n ; i++ ) {
#pragma omp parallel for firstprivate(x) x[ i ]= x[i-1] * x [i-2];
for( i= 0 ; i< n ; i++ ) { }
x[ i]= x[0] * x [i/2]; fibo_10 = x[i];
}
1
3.9
4
3.8
π= ∫
3.7
2
3.6
0 1+x
3.5
3.4
3.3
3.2
... 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
... area
area= 0.0; LOAD $area
7.0 sum $temp ,
#pragma omp parallel for private(x)
LOAD $area $area
for( i= 0 ; i< n ; i++ ) { sum $temp , 7.0 ... ... ... ...
x = (i+0.5)/n; $area
area += 4.0/(1.0 + x*x); STORE $area 7.2 STORE $area
}
pi = area / n; 7.2
Exclusión mutua (2)
Definición de una sección crítica: #pragma omp critical [nombre]
... • Ventajas:
double area, pi, x; – Secuencializan código
int i,n; (depuración).
...
area= 0.0; – Acceso seguro a memoria
#pragma omp parallel for private(x) compartida.
for( i= 0 ; i< n ; i++ ) {
x = (i+0.5)/n;
#pragma omp critical • Desventajas:
area += 4.0/(1.0 + x*x);
}
– Disminuyen eficiencia al
pi = area / n; reducir paralelismo.
CERROJOS ANIDADOS
...
double area, pi, x;
int i,n;
...
area= 0.0;
...
#pragma omp parallel for private(j) schedule (dynamic,5)
for( i= 0 ; i< 5000 ; i++ )
for( j= 0 ; j< f(i); j++ )
tarea_costo_variable(i,j);
Paralelismo funcional en OpenMP
Es posible asignar diferente código a a cada hebra
#include <omp.h>
...
#pragma omp parallel
{ #pragma omp sections
alfa beta { #pragma omp section
v= alfa();
#pragma omp section
w= beta();
gamma delta
}
#pragma omp sections
{ #pragma omp section
epsilon x= gamma(v,w);
#pragma omp section
y= delta();
}
}
printf(“Valor de epsilon= %6.6f\n”, epsilon(x,y) );
n=atoi(argv[1]); omp_set_num_threads(atoi(argv[2]));
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define VECLEN 100
float a[VECLEN], b[VECLEN], sum; int main (int argc, char *argv[]) {
int i;
float dotprod ()
{ for (i=0; i < VECLEN; i++)
int i,tid; a[i] = b[i] = 1.0 * i;
sum = 0.0;
tid = omp_get_thread_num();
#pragma omp for reduction (+:sum) #pragma omp parallel
for (i=0; i < VECLEN; i++) dotprod();
sum = sum + (a[i]*b[i]);
} printf("Sum = %f\n",sum);
}
Búsqueda en un array