Professional Documents
Culture Documents
MPI Y OPENMP
EN EL CLUSTER EULER
____________________________________________
Angelines Alberto Morillas
Telf. +34 91 346 6025
Divisn de Supercomputacin y Desarrollo Grid
CEMAT
Avenida Complutense, 22
28040 Madrid
____________________________________________
NDICE
i. PROGRAMACN EN ENTORNO CLUSTER EULER
ii. PROGRAMACN CON PASO DE MENSAJES (MP)
iii. PROGRAMACN CON PARALELSMO MPLCTO
(OpenMP)
NDICE
i. PROGRAMACN EN ENTORNO CLUSTER EULER
ii. PROGRAMACN CON PASO DE MENSAJES (MP)
iii. PROGRAMACN CON PARALELSMO MPLCTO
(OpenMP)
NDICE
I. PROGRAMACIN EN ENTORNO CLUSTER EULER
Caractersticas
Conexin a EULER
So!t"are en EULER
Co#$i%a&ores
O$ti#i'acin
Pro)ra#acin $ara%e%a
E*ec(cin $ara%e%a
I. CLUSTER EULER
Caractersticas.
Existen dos nodos que actan como frontend para que los
usuarios puedan conectarse en forma interactiva.
Siste#a O$erati0o
Co#$i%a&ores
Si se usa bash
source /opt/intel/cce/10.1.015/bin/iccvars.sh
source /opt/intel/fce/10.1.015/bin/ifortvars.sh
Si se usa tcsh
source /opt/intel/cce/10.1.015/bin/iccvars.csh
source /opt/intel/fce/10.1.015/bin/ifortvars.csh
I. CLUSTER EULER
O$ti#i'acin &e Inte%
En este ltimo caso, sin embargo, debe tenerse en cuenta que los
resultados pueden cambiar ligeramente debido a diferencias en los
redondeos. Adems aumentar el tiempo de compilacin, por lo que
no conviene utilizar estos flags cuando se est desarrollando.
I. CLUSTER EULER
O$ti#i'acin &e Inte%
O$enMP
MPI
MPI
MPI
MPI
MPI
MPI
Ejemplos:
mpif90 -o prog.exe prog.f90 (Fortran)
mpicc -o prog.exe prog.c (C)
mpicxx -o prog.exe prog.cc (C++)
Ejemplos:
mpirun -np 8 prog.exe
mpiexec -n 8 prog.exe
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
NDICE
II. PROGRAMACIN CON PASO DE MENSAFES 5MPI8
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Intro&(ccin. Para%e%is#o
Paralelismo:
Procesos lgicos.
Diferentes tareas
Tipos de paralelismo
Hbrido (Shared/Distributed).
Reglas generales
Beneficios:
Desventajas:
Las tareas que se ejecutan en cada procesador solo operan sobre datos
locales, por lo que si se requieren datos remotos, se debe realizar una
comunicacin con otros procesadores.
o
Tiempo para construir y enviar un mensaje.
o
Tiempo para recibir y desempaquetar el mensaje.
II. MPI
Intro&(ccin. Me#oria &istri2(i&a
Taxonoma de Flynn
Me#oria
II. MPI
Intro&(ccin. Taxono#a &e 6%Ann
Me#oria A $rocesa&ores
II. MPI
Intro&(ccin. HI(J es MPIK
MPCH2 (http://www.mcs.anl.gov/research/projects/mpich2)
II. MPI
Intro&(ccin. HI(J es MPIK
No se requiere paralelismo.
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Gettin) starte&
MP_COMM_SZE
MP_COMM_RANK
MP_COMM_WORLD
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Co#(nicacin $(nto a $(nto.
bsico(basic)
sncrono (synchronous)
listo (ready).
II. MPI
Co#(nicacin $(nto a $(nto.
Preguntas:
Ta) es una etiqueta que se puede poner al mensaje. Suele emplearse para
distinguir entre diferentes clases de mensajes. El receptor puede elegir
entre recibir slo los mensajes que tengan una etiqueta dada, o aceptar
cualquier etiqueta (MP_ANY_TAG).
Programa greetings
/* Envo de un mensaje desde todos los procesos con rank!= 0 al proceso 0.
El proces 0 imprime los mensajes */
#include <stdio.h>
#include <string.h>
#include "mpi.h"
main(int argc, char* argv[]) {
int my_rank;
int p;
int source; /* origen */
int dest; /* destino */
int tag = 0;
char message[100];
MP_Status status;
MP_nit(&argc,&argv);
MP_Comm_size(MP_COMM_WORLD, &p);
MP_Comm_rank(MP_COMM_WORLD, &my_rank);
II. MPI
E*e#$%os.
if (my_rank != 0) {
/* Creamos el mensaje */
sprintf(message, "Greetings from process %d!", my_rank);
dest = 0;
/* Longitud strlen+1 porque en C se aade al final de una cadena '\0' */
MP_Send(message, strlen(message)+1, MP_CHAR, dest, tag, MP_COMM_WORLD);
}
else { /* my_rank == 0 */
for (source = 1; source < p; source++) {
MP_Recv(message, 100, MP_CHAR, source, tag, MP_COMM_WORLD, &status);
printf("%s\n", message);
}
}
MP_Finalize();
}
II. MPI
E*e#$%os.
Co#$i%ar
#$icc Qo )reetin)s )reetin)s.c
E*ec(tar
#$ir(n .n$ > )reetin)s
SECUENCAL
#include <math.h>
#include <stdio.h>
float integral(float ai, float h, int n);
void main(void) {
int n, p, i, j, ierr;
float h, integral_sum, a, ai, b, pi, my_int;
pi = acos(-1.0); /* = 3.14159... */
a = 0.; /*lower limit of integration */
b = pi*1./2.; /*upper limit of integration */
p = 4; /*number of processes (partitions) */
n = 500; /*number of increment within each process */
h = (b-a)/n/p; /*length of increment */
integral_sum = 0.0; /*sum of integrals over all processes */
II. MPI
E*e#$%os. Inte)racin n(#Jrica
SECUENCAL
for (i=0; i<p; i++)
{
ai = a + i*n*h; /* lower limit of integration for partition i */
integral_sum += integral(ai,h,n);
}
printf("The integral sum =%f\n",integral_sum);
}
II. MPI
E*e#$%os. Inte)racin n(#Jrica
SECUENCAL
float integral(float ai, float h, int n)
{
int j;
float aij, integ;
integ = 0.0; /* initialize */
for (j=0;j<n;j++)
{ /* sum integrals */
aij = ai + (j+0.5)*h; /* mid-point */
integ += cos(aij)*h;
}
return integ;
}
II. MPI
E*e#$%os. Inte)racin n(#Jrica
Estndar.
MP_Send MP_send
Estndar.
MP_Recv MP_recv
II. MPI
Ti$o &e &atos e%e#enta%es
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Co#(nicaciones co%ecti0as
Barreras de sincronizacin
Broadcast (difusin)
Gather (recoleccin)
Scatter (distribucin)
Sin embargo, todos los procesos (raz incluido) tienen que facilitar
valores vlidos para sen&2(!, sen&co(nt y sen&tA$e.
II. MPI
Co#(nicaciones co%ecti0as.
Reco%eccin 5)at-er8
MP_MAX (mximo)
MP_MN (mnimo)
MP_SUM (suma)
MP_PROD (producto)
...
II. MPI
Co#(nicaciones co%ecti0as.
Re&(ccin
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
Co#(nica&ores A )r($os
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Ti$os &e &atos &eri0a&os
Veamos un ejemplo.
Si B = {2, 1, 3}
D = {0, 16, 26} y
T = {MP_FLOAT, MP_NT, MP_CHAR}
entonces MP_Type_struct(3, B, D, T, newtype) devuelve un tipo que en
memoria tiene este aspecto.
La primera columna hace referencia a la posicin de memoria que ocupa
cada campo de una instancia de este tipo de datos, relativa al origen del
dato.
II. MPI
E*e#$%os. conti)(o(s.c
#include <stdio.h>
#include<mpi.h>
/* Run with four processes */
void main(int argc, char *argv[]) {
int rank;
MP_Status status;
struct { int x; int y; int z; } point;
MP_Datatype ptype;
MP_nit(&argc,&argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
MP_Type_contiguous(3,MP_NT,&ptype);
MP_Type_commit(&ptype);
if(rank==3){
point.x=15; point.y=23; point.z=6;
MP_Send(&point,1,ptype,1,52,MP_COMM_WORLD);
} else if(rank==1) {
MP_Recv(&point,1,ptype,3,52,MP_COMM_WORLD,&status);
printf("P:%dreceived coordsare (%d,%d,%d) \n",rank,point.x,point.y,point.z);
}
MP_Finalize();
}
II. MPI
E*e#$%os. 0ector.c
#include <mpi.h>
#include <math.h>
#include <stdio.h>
void main(int argc, char *argv[]) {
int rank,i,j;
MP_Status status;
double x[4][8];
MP_Datatype coltype;
MP_nit(&argc, &argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
MP_Type_vector(4,1,8,MP_DOUBLE,&coltype);
MP_Type_commit(&coltype);
if(rank==3){
for(i=0;i<4;++i)
for(j=0;j<8;++j) x[i][j]=pow(10.0,i+1)+j; MP_Send(&x[0]
[7],1,coltype,1,52,MP_COMM_WORLD);
} else if(rank==1) {
MP_Recv(&x[0][2],1,coltype,3,52,MP_COMM_WORLD,&status);
for(i=0;i<4;++i) printf("P:%d my x[%d][2]=%1f\n",rank,i,x[i][2]);
}
MP_Finalize();
}
II. MPI
E*e#$%os. extent.c
#include <stdio.h>
#include<mpi.h>
void main(intargc, char *argv[]) {
int rank,i;
MP_Status status;
struct{ int num; float x; double data[4]; } a;
int blocklengths[3]={1,1,4};
MP_Datatype types[3]={MP_NT,MP_FLOAT,MP_DOUBLE};
MP_Aint displacements[3];
MP_Datatype restype;
MP_Aint intex,floatex;
MP_nit(&argc,&argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
MP_Type_extent(MP_NT,&intex);
MP_Type_extent(MP_FLOAT,&floatex);
II. MPI
E*e#$%os
displacements[0]= (MP_Aint)0;
displacements[1]=intex;
displacements[2]=intex+floatex;
MP_Type_struct(3,blocklengths,displacements,types,&restype);
MP_Type_commit(&restype);
if (rank==3){
a.num=6;
a.x=3.14;
for(i=0;i<4;++i)
a.data[i]=(double) i;
MP_Send(&a,1,restype,1,52,MP_COMM_WORLD);
} else
if(rank==1) {
MP_Recv(&a,1,restype,3,52,MP_COMM_WORLD,&status);
printf("P:%dmy a is %d %f %lf %lf %lf %lf\n",
rank,a.num,a.x,a.data[0],a.data[1],a.data[2],a.data[3]);
}
MP_Finalize();
}
II. MPI
E*e#$%os. 2cast.c
#include<mpi.h>
#include <stdio.h>
void main (int argc, char *argv[]) {
int rank;
double param;
MP_nit(&argc, &argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
if(rank==5)
param=23.0;
MP_Bcast(¶m,1,MP_DOUBLE,5,MP_COMM_WORLD);
printf("P:%d after broadcast parameter is %f\n",rank,param);
MP_Finalize();
}
II. MPI
E*e#$%os. scatter&os.c
#include <mpi.h>
#include <stdio.h>
void main (int argc, char *argv[]) {
int rank,size,i,j;
double param[4],mine;
int sndcnt,revcnt;
MP_nit(&argc, &argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
MP_Comm_size(MP_COMM_WORLD,&size);
revcnt=1;
if(rank==3){
for(i=0;i<4;i++)
param[i]=23.0+i;
sndcnt=1;
}
MP_Scatter(param,sndcnt,MP_DOUBLE,&mine,revcnt,MP_DOUBLE,3,MP_COMM_WORLD);
printf("P:%dmine is %f\n",rank,mine);
MP_Finalize();
}
II. MPI
E*e#$%os. re&(ce&os.c
#include <mpi.h>
#include <stdio.h>
void main (int argc, char *argv[]) {
int rank;
struct{ double value; int rank;} in, out;
int root;
MP_nit(&argc, &argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
in.value=rank+1;
in.rank=rank;
root=7;
MP_Reduce(&in,&out,1,MP_DOUBLE_NT,MP_MAXLOC,root,MP_COMM_WORLD);
if(rank==root)
printf("PE:%dmax=%lf at rank %d\n",rank,out.value,out.rank);
MP_Reduce(&in,&out,1,MP_DOUBLE_NT,MP_MNLOC,root,MP_COMM_WORLD);
if(rank==root)
printf("PE:%dmin=%lf at rank %d\n",rank,out.value,out.rank);
MP_Finalize();
}
II. MPI
E*e#$%os. create.c
#include <mpi.h>
#include <stdio.h>
/*Con 4 procesadores*/
#define TRUE 1
typedef struct{
double real,imag;
} complex;
void cprod(complex *in, complex *inout, int *len, MP_Datatype *dptr)
{
int i;
complex c;
for (i=0; i<*len; ++i) {
c.real=(*in).real * (*inout).real-(*in).imag* (*inout).imag;
c.imag=(*in).real * (*inout).imag+ (*in).imag* (*inout).real;
*inout=c;
in++;
inout++;
}
}
II. MPI
E*e#$%os. create.c
void main (int argc, char *argv[]) {
int rank;
int root;
complex source,result;
MP_Op myop;
MP_Datatypectype;
MP_nit(&argc, &argv);
MP_Comm_rank(MP_COMM_WORLD,&rank);
MP_Type_contiguous(2,MP_DOUBLE,&ctype);
MP_Type_commit(&ctype);
MP_Op_create(cprod,TRUE,&myop);
root=2;
source.real=rank+1;
source.imag=rank+2;
MP_Reduce(&source,&result,1,ctype,myop,root,MP_COMM_WORLD);
if(rank==root)
printf("PE:%d result is %lf + %lfi\n",rank, result.real, result.imag);
MP_Finalize();
}
--------------------------------------------
P:2 result is -185.000000 + -180.000000i
NDICE
II. PROGRAMACIN CON PASO DE MENSAFES 5MPI8
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Mo&(%ari&a&
Todos los procesos de los dos comunicadores que quieren interconectarse deben
hacer una llamada a MP_ntercomm_create() con argumentos compatibles.
Con esto ya se tiene tendido un "puente entre los dos comunicadores. Tambin
hay que facilitar un nmero de etiqueta (ta)) que est libre y que el programador
no debe emplear para ningn otro propsito.
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
To$o%o)as 0irt(a%es
Ejemplo:
.
int dims[2]={4,4}, periods[2]={0,0};
MP-Comm comm2d;
MP-Cart-create(MP-COMM-WORLD,2,dims, periods, 1, comm2d);
.
II. MPI
To$o%o)as 0irt(a%es
Intro&(ccin
Gettin) starte&
Co#(nicaciones co%ecti0as
To$o%o)as 0it(a%es
Intro&(ccin a MPI.>
II. MPI
Intro&(ccin a MPI.>
Intro&(ccin
Entrada/Salida paralela
.
II. MPI
Intro&(ccin a MPI.>
E,S Para%e%a
E/S no bloqueante
&iberar una "entana. '#lo debe llamarse cuando (an terminado todas las
operaciones )*+.
int MPI@+in@!ree(MP_Win *win);
Ambas son operaciones colectivas, deben ser llamadas por todos los
procesos involucrados.
II. MPI
Intro&(ccin a MPI.>
Acceso re#oto a #e#oria
Moviendo datos
Moviendo datos
Filosofa cliente/servidor
II. MPI
Intro&(ccin a MPI.>
Gestin &inC#ica &e $rocesos
Filosofa cliente/servidor
II. MPI
Intro&(ccin a MPI.>
Entorno &e e*ec(cin
Lam
Mvapich
Openmpi
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
NDICE
III. PROGRAMACIN CON PARALELISMO IMPLCITO
5OMP8
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
III. O$enMP
Intro&(ccin
Fujitsu
Hewlett Packard
ntel Corporation
NEC Corporation
Sun Microsystems
Clusulas de datos
Clusulas de comportamiento
Clusulas de sincrona
III. O$enMP
Intro&(ccin
Ventajas de OpenMP:
Elevada portabilidad
III. O$enMP
Intro&(ccin
nconvenientes de OpenMP:
SG MPSpro
BM XL
Sun Studio
Lahey/Fujitsu Fortran 95
PathScale
HP
III. O$enMP
Intro&(ccin
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
Ejemplos:
for (i=first;i<size;i += prime) marked[i]=1
for (i=1;i<=n;i++) suma += suma + v[i]
III. O$enMP
Conce$tos 2Csicos
III. O$enMP
Conce$tos 2Csicos
DO , !or iteraciones compartidas
de un bucle por el equipo.
Representa un tipo de
"paralelismo de datos".
SECTIONS particiona el trabajo en
secciones separadas.
Cada seccin es ejecutada por un hilo.
Se puede utilizar para implementar un
tipo de "paralelismo funcional
SINGLE serializa una
seccin de cdigo
La sintaxis es
#pragma omp <el resto de la pragma>
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 informacin necesaria para
llevar a cabo las iteraciones
III. O$enMP
Conce$tos 2Csicos
Ejemplo
#include <omp.h>
#include <stdio.h>
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 %d\n", th_id);
}
return 0;
}
III. O$enMP
Conce$tos 2Csicos
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
III. O$enMP
Para%e%is#o &e &atos
La clusula SDARED
La clusula SDARED
La clusula PRIEATE
La clusula PRIEATE
Variables privadas
for (i = 0; i < BLOCK_SIZE(id,p,n); i++)
for (j = 0; j < n; j++)
a[i][j] = MI(a[i][j],a[i][!]+"#p[j]);
Variables privadas
S$ra)#a o#$ $ara%%e% !or $ri0ate5*8 S$ra)#a o#$ $ara%%e% !or $ri0ate5*8
for (i = 0; i < BLOCK_SIZE(id,p,n); i++)
for (j = 0; j < n; j++)
a[i][j] = MI(a[i][j],a[i][!]+"#p[j]);
La clusula DE6AULT
La clusula DE6AULT
Caractersticas de la clusula:
o
Slo puede aparecer una nica vez en cada directiva
o
Admite tres opciones: PRVATE, SHARED y NONE
o
Con NONE todas las variables deben ser definidas
o
Slo afecta a las variables directamente visibles:
o
Las variables definidas dentro de la subrutina ejemplo no se ven
afectadas por la clusula DEFAULT
!irst$ri0ate58
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.
!irst$ri0ate58
x[0] = complex_function();
for (i-0;j<n;i++)
{
for (j=1;j<4;j++)
x[j]=g(,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 iteracin del bucle interior.
III. O$enMP
Conce$tos 2Csicos
!irst$ri0ate58
Se podra mover la inicializacin 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<n;i++)
{
for (j=1;j<4;j++)
x[j]=g(,x[j-1]);
answer[i] = x[i] x[j];
}
III. O$enMP
Conce$tos 2Csicos
III. O$enMP
Para%e%is#o &e &atos
La clusula 6IRSTPRIEATE
La clusula LASTPRIEATE
La clusula se usa para copiar el valor privado del hilo que ejecut la
ltima iteracin a la copia del hilo maestro
III. O$enMP
Conce$tos 2Csicos
III. O$enMP
Para%e%is#o &e &atos
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
Caractersticas de la directiva:
o
Distribuye la carga de un bucle entre las tareas
o
La descomposicin se hace en el espacio de iteraciones
o
El contador es implcitamente declarado PRVATE
Restricciones :
o
En C, el bucle debe ser de un tipo determinado
o
En Fortran, el bucle no puede ser del tipo do while
o
El contador debe ser el mismo para todas las tareas
o
Slo admite bloques estructurados de cdigo
o
Las variables SHARED slo se actualizan al final
La sintaxis:
S$ra)#a o#$ $ara%%e% sections
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
v = alpha();
w = beta();
x = gamma(v, w);
y = delta();
printf ("%6.2f\n", epsilon(x,y));
a l p h a b e t a
g a m m a d e l t a
e p s i l o n
Se puede ejecutar
alpha, beta, and delta
en paralelo.
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
La sintaxis:
$pra%#a o#p &'("ion
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
Restricciones de la directiva:
o
La manera de asignar secciones a tareas no est
definida
o
Cada seccin debe ser un bloque estructurado de
cdigo
o
No se crean nuevas tareas, se usan las existentes
o
Las variables SHARED slo se actualizan al final
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
$pra%#a o#p para))')
*
$pra%#a o#p &'("ion&
*
- = a)p.a();
$pra%#a o#p &'("ion
/ = 0'"a();
2
$pra%#a o#p &'("ion&
*
3 = %a##a(-, /);
$pra%#a o#p &'("ion
1 = d')"a();
2
2
prin"f (45678f9n4, 'p&i)on(3,1));
III. O$enMP
Directi0as &istri2(cin &e tra2a*o
NDICE
III. PROGRAMACIN CON PARALELISMO IMPLCITO
5OMP8
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
III. O$enMP
Re)iones $ara%e%as
La subrutina omp_set_num_threads
void omp_set_num_threads(int t);
La clusula NUM_THREADS:
#PRAGMA OMP PARALLEL NUM_THREADS (4)
Caractersticas de la clusula F:
Intro&(ccin
Conce$tos 2Csicos
Directi0as OMP
Re)iones $ara%e%as
R(n.Ti#e %i2rarA
RUTNAS DE CONTROL
Funcin omp_get_num_procs
o
Devuelve el nmero de procesadores fisicos que estn
dispondible para el uso del programa paralelo
in" o#p_%'"_n:#_pro(&(-oid)
Funcin omp_set_num_threads
o
Se usa para asignar el nmero de hilos a ser activos en
secciones paralelas del cdigo
o
Se puede llamar en varios puntos del programa
-oid o#p_&'"_n:#_".r'ad&(in" ")
III. O$enMP
R(n.Ti#e Li2rarA
Funcin omp_get_num_procs
o
Devuelve el nmero de procesadores fisicos que estn dispondible para
el uso del programa paralelo
in" o#p_%'"_n:#_pro(&(-oid)
Funcin omp_set_num_threads
o
Se usa para asignar el nmero de hilos a ser activos en secciones
paralelas del cdigo
o
Se puede llamar en varios puntos del programa
-oid o#p_&'"_n:#_".r'ad&(in" ")
Funcin omp_get_thread_num
o
Todo hilo tiene una identificacin que es el nmero del hilo
omp_get_thread_num()
devuelve el nmero del hilo
III. O$enMP
R(n.Ti#e Li2rarA
III. O$enMP
R(n.Ti#e Li2rarA
Rutinas cerrojo
Rutinas de cronometraje
Recomendaciones
Oscar Flores
Universidad Politcnica de Madrid
Miguel Hermanns
Universidad Politcnica de Madrid
Mario Storti
Centro nternacional de Mtodos Numricos en
ngeniera CMEC Argentina
Guillermo Marshall
Laboratorio de Sistemas Complejos, Departamento de
Computacion, FCEyN, UBA.
http://www.intel.com/software/products
http://www.openmp.org/drupal/
http://www-unix.mcs.anl.gov/mpi/
http://www.gnu.org/
http://www.gnu.org/manual/ddd/
http://www.fing.edu.uy
PROGRAMACIN CON
MPI Y OPENMP
EN EL CLUSTER EULER
____________________________________________
Angelines Alberto Morillas
Telf. +34 91 346 6025
Divisn de Supercomputacin y Desarrollo Grid
CEMAT
Avenida Complutense, 22
28040 Madrid
____________________________________________