Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

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




Enviado por Pablo Turmero



Partes: 1, 2, 3

Monografias.com
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

Monografias.com
? 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

Monografias.com
? 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

Monografias.com
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

Monografias.com
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).

Monografias.com
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)

Monografias.com
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

Monografias.com
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

Monografias.com
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

Monografias.com
? 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

Monografias.com
? 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.

Monografias.com
? 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

Monografias.com
? ¿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

Monografias.com
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 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter