Descargar

Programación de Sistemas de Memoria Compartida (página 2)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red Introducción ? No se trata de un nuevo lenguaje de programación, sino de un API (application programming interface) formado por: ? directivas para el compilador

? unas pocas funciones de biblioteca ? algunas variables de entorno

edu.red ? El uso de directivas facilita la portabilidad y la “paralelización incremental”.

En entornos que no usan OpenMP, las directivas son tratadas como simples comentarios e ignoradas. Introducción

edu.red ? Los lenguajes base con los que trabaja OpenMP son Fortran y C/C++.

? Las directivas de OpenMP se especifican de la siguiente manera:

para C: #pragma omp para Fortran !$omp Introducción

edu.red Introducción ? El modelo de programación paralela que aplica OpenMP es Fork – Join.

En un determinado momento, el thread master genera P threads que se ejecutan en paralelo. (Gp:) thread master

FORK JOIN (Gp:) región paralela

(Gp:) thread master

edu.red Introducción ? Todos los threads ejecutan la misma copia del código (SPMD). A cada thread se le asigna un identificador (tid). ? Para diferenciar las tareas ejecutadas por cada thread:

? if (tid == 0) then … else … ? constructores específicos de reparto de tareas (work sharing).

edu.red Ejemplo main () {

for (i=0; i<1000; i++) { A[i] = A[i] + 1; B = B + A[i]; } printf(“ B = %d n”, B);

} #pragma omp parallel private(tid) {

} tid = omp_get_thread_num(); printf (“ thread %d en marcha n”, tid); #pragma omp for schedule(static) reduction(+:B) if (tid==0)

edu.red Aspectos básicos a tratar en la paralelización de código: 1 Partiendo de un programa serie, hay que especificar qué partes del código pueden ejecutarse en paralelo (análisis de dependencias)

? estructuras de control paralelo ? reparto de tareas Introducción

edu.red Aspectos básicos a tratar en la paralelización de código:

2 Incluir la comunicación adecuada entre los diferentes threads que van a ejecutarse en paralelo. En este caso, a través de variables compartidas en el espacio común de memoria. ? ámbito de las variables Introducción

edu.red Aspectos básicos a tratar en la paralelización de código:

3 Sincronizar convenientemente la ejecución de los hilos. Las funciones principales de sincronización son las habituales: exclusión mutua y sincronización por eventos (por ejemplo, global mediante barreras). Introducción

edu.red ? En resumen, partiendo de un programa serie, para obtener un programa paralelo OpenMP hay que añadir: ? directivas que especifican una región paralela (código replicado), reparto de tareas (específicas para cada thread), o sincronización entre threads. ? funciones de biblioteca (include ): para gestionar o sincronizar los threads. Introducción

edu.red ? Una región paralela define un trozo de código que va a ser replicado y ejecutado en paralelo por varios threads. Regiones paralelas La directiva correspondiente es (C):

#pragma omp parallel [cláusulas] { código } El trozo de código que se define en una región paralela debe ser un bloque básico.

edu.red ? El número de threads que se generan para ejecutar una región paralela se controla: a. estáticamente, mediante una variable de entorno: > export OMP_NUM_THREADS=4

b. en ejecución, mediante una función de librería: omp_set_num_threads(4);

c. en ejecución, mediante una cláusula del “pragma parallel”: num_threads(4) Regiones paralelas

edu.red ? ¿Quién soy yo? ¿Cuántos somos? Cada proceso paralelo se identifica por un número de thread. El 0 es el thread máster.

Dos funciones de librería: nth = omp_get_num_threads(); devuelve el número de hilos generados. tid = omp_get_thread_num(); devuelve el identificador del thread. Regiones paralelas

edu.red Regiones paralelas > Un ejemplo sencillo: …

#define N 12 int i, tid, nth, A[N]; main ( ) { for (i=0; i Ejemplo: X = 2; Y = 1;

#pragma omp parallel shared(Y) private(X,Z) { Z = X * X + 3; X = Y * 3 + Z; }

printf(“X = %d n”, X); (Gp:) X no está inicializada!

(Gp:) X no mantiene el nuevo valor

R.P.: Cláusulas de ámbito

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente