Curso De Promoción Educativa Programación En El Supercomputador . - UM

1y ago
11 Views
2 Downloads
4.33 MB
90 Pages
Last View : 2m ago
Last Download : 3m ago
Upload by : Audrey Hope
Transcription

Curso de Promoción Educativa Programación en el Supercomputador Ben Arabi Programación con MPI Javier Cuenca Universidad de Murcia

Indice de la sesión Introducción Comunicaciones punto a punto Comunicaciones colectivas Agrupación de datos Comunicadores y topologías MPI-2 Uso de MPI en el supercomputador BenArabi Ejercicios prácticos Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 2

Indice de la sesión Introducción. Nociones básicas Ejemplo inicial Directivas Constructores Claúsulas de alcance de datos Funciones de librería Variables de entorno Ejemplos Tareas en OpenMP 3.0 Uso de OpenMP en el supercomputador Ben Arabi Ejercicios prácticos Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 3

Introducción Previamente PVM: Parallel Virtual Machine MPI: Message Passing Interface Una especificación para paso de mensajes La primera librería de paso de mensajes estándar y portable Por consenso MPI Forum. Participantes de unas 40 organizaciones Acabado y publicado en mayo 1994. Actualizado en junio 1995 MPI-2, HeteroMPI, FT-MPI Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 4

Introducción. ¿Qué ofrece? Estandarización Portabilidad: multiprocesadores, multicomputadores, redes, heterogéneos, . Buenas prestaciones, ., si están disponibles para el sistema Amplia funcionalidad Implementaciones libres (mpich, lam, .) Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 5

Introducción. Procesos Programa MPI: conjunto de procesos autónomos Cada proceso puede ejecutar codigo diferente Procesos comunican vía primitivas MPI Proceso: secuencial o multithreads MPI no proveé mecanismos para situar procesos en procesadores. Eso es misión de cada implementación en cada plataforma MPI 2.0: Es posible la creación/borrado de procesos dinámicamente durante ejecución Es posible el acceso a memoria remota Es posible la entrada/salida paralela Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 6

Introducción. Ejemplo: hello.c #include #include #include main(int stdio.h string.h "mpi.h" argc, char*argv[]) { int name, p, source, dest, tag 0; char message[100]; MPI Status status; MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&name); MPI Comm size(MPI COMM WORLD,&p); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 7

Introducción. Ejemplo: hello.c #include stdio.h #include string.h #include "mpi.h" main(int argc, char*argv[]) { if (name ! 0) int {name, p, source, dest, tag 0; printf("Processor %d of %d\n",name, p); char message[100]; sprintf(message,"greetings from process %d!", name); MPI Status status; dest 0; MPI Send(message, strlen(message) 1, MPI CHAR, dest, tag, MPI COMM WORLD); MPI Init(&argc,&argv); } MPI Comm rank(MPI COMM WORLD,&name); else MPI Comm size(MPI COMM WORLD,&p); { printf("processor 0, p %d \n",p); for(source 1; source p; source ) { MPI Recv(message,100, MPI CHAR, source, tag, MPI COMM WORLD, &status); printf("%s\n",message); } } MPI Finalize(); } Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 8

Introducción. Ejemplo FORTRAN: fortran hello CHARACTER*20 msg INTEGER myrank, ierr, status(MPI STATUS SIZE) INTEGER tag 99 CALL MPI COMM RANK( MPI COMM WORLD, myrank, ierr) IF (myrank .EQ. 0) THEN msg “Hello there” CALL MPI SEND( msg, 11, MPI CHARACTER, 1, tag, MPI COMM WORLD, ierr) ELSE IF (myrank .EQ. 1) THEN CALL MPI RECV( msg, 20, MPI CHARACTER, 0, tag, MPI COMM WORLD, status, ierr) END IF Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 9

Introducción. Ejemplo de uso Fichero cabecera: #include mpi.h Formato de las funciones: error MPI nombre(parámetros .) Inicialización: int MPI Init ( int *argc , char **argv ) Comunicador: Conjunto de procesos en que se hacen comunicaciones MPI COMM WORD , el mundo de los procesos MPI Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 10

Introducción. Ejemplo de uso Identificación de procesos: MPI Comm rank ( MPI Comm comm , int *rank) Procesos en el comunicador: MPI Comm size ( MPI Comm comm , int *size) Finalización: int MPI Finalize ( ) Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 11

Introducción. Ejemplo de uso MENSAJE: Formado por un cierto número de elementos de un tipo MPI Tipos MPI Básicos: MPI CHAR signed char MPI SHORT signed short int MPI INT signed int MPI LONG signed long int MPI UNSIGNED CHAR unsigned char MPI UNSIGNED SHOT unsigned short int MPI UNSIGNED unsigned int MPI UNSIGNED LONG unsigned long int MPI FLOAT float MPI DOUBLE double MPI LONG DOUBLE long double MPI BYTE MPI PACKED Tipos MPI Derivados: los construye el programador Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 12

Introducción. FORTRAN. Ejemplo de uso Tipos MPI Básicos MPI INTEGER MPI REAL MPI DOUBLE PRECISION MPI COMPLEX MPI LOGICAL MPI CHARACTER MPI BYTE INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER(1) MPI PACKED Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 13

Introducción. Ejemplo de uso Envío: int MPI Send ( void *buffer , int contador , MPI Datatype tipo , int destino , int tag , MPI Comm comunicador ) Recepción: int MPI Recv ( void *buffer , int contador , MPI Datatype tipo , int origen , int tag , MPI Comm comunicador , MPI Status *estado) MPI ANY TAG MPI ANY SOURCE Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 14

Indice de la sesión Introducción Comunicaciones punto a punto Comunicaciones colectivas Agrupación de datos Comunicadores y topologías MPI-2 Uso de MPI en el supercomputador BenArabi Ejercicios prácticos Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 15

Comunicaciones punto a punto. Tipos de comunicaciones sincronas Envío: Envío síncrono: MPI Ssend Acaba cuando la recepción empieza Envío con buffer: MPI Bsend Acaba siempre, independiente del receptor Envío estándar: MPI Send Síncrono o con buffer Envío “ready”: MPI Rsend Acaba independiente de que acabe la recepción Recepción: MPI Recv Acaba cuando se ha recibido un mensaje. Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 16

Comunicaciones punto a punto. Comunicación asíncrona (nonblocking) MPI Isend(buf, count, datatype, dest, tag, comm, request) MPI Irecv(buf, count, datatype, source, tag, comm, request) Parámetro request para saber si la operación ha acabado MPI Wait( ) vuelve si la operación se ha completado. Espera hasta que se completa MPI Test( ) devuelve un flag diciendo si la operación se ha completado Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 17

Comunicaciones punto a punto. Comunicación asíncrona (nonblocking). Ejemplo: hello nonblocking.c (1/2) MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&name); MPI Comm size(MPI COMM WORLD,&p); p requests (MPI Request *) malloc ( p * sizeof(MPI Request) ); if (name ! 0) { sprintf(message,"greetings from process %d!",name); dest 0; MPI Isend(message, strlen(message) 1, MPI CHAR, dest, tag, MPI COMM WORLD, &request); printf("Procesador %d ya ha hecho el ISEND al procesador 0\n",name); /* . Código por aquí enmedio */ MPI Wait(&request,&status); printf("Procesador %d ya ha pasado el WAIT tras envio\n",name); } Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 18

Comunicaciones punto a punto. Comunicación asíncrona (nonblocking). Ejemplo: hello nonblocking.c (2/2) else { for(source 1; source p; source ) { MPI Irecv(messages[source],100,MPI CHAR,MPI ANY SOURCE,tag, MPI COMM WORLD, &p requests[source]); printf("Proc. 0 ya ha hecho IRECV para recibir source %d\n\n",source); } de /* . Código por aquí enmedio */ for(source 1; source p; source ) { MPI Wait(&p requests[source],&status); printf("Tras el Wait del Receive: %s\n",messages[source]); } } free(p requests); MPI Finalize(); } Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 19

Indice de la sesión Introducción Comunicaciones punto a punto Comunicaciones colectivas Agrupación de datos Comunicadores y topologías MPI-2 Uso de MPI en el supercomputador BenArabi Ejercicios prácticos Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 20

Comunicaciones colectivas MPI Barrier( ) bloquea los procesos hasta que la llaman todos MPI Bcast( ) broadcast del proceso raíz a todos los demás MPI Gather( ) recibe valores de un grupo de procesos MPI Scatter( ) distribuye un buffer en partes a un grupo de procesos MPI Alltoall( ) envía datos de todos los procesos a todos MPI Reduce( ) combina valores de todos los procesos MPI Reduce scatter( ) combina valores de todos los procesos y distribuye MPI Scan( ) reducción prefija (0,.,i-1 a i) Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 21

Comunicaciones colectivas. broadcast.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); if(my rank 0) { printf("Introduce el dato: pintf("Introduce el scanf("%f",&b); printf("Introduce el scanf("%d",&n); } a (float): ");scanf("%f",&a); dato: b (float): "); dato: "); n (entero): MPI Bcast(&a,1,MPI FLOAT,root,MPI COMM WORLD); MPI Bcast(&b,1,MPI FLOAT,root,MPI COMM WORLD); MPI Bcast(&n,1,MPI INT,root,MPI COMM WORLD); if(my rank ! 0) { printf("En procesador %d, los datos recibidos son a:%f n:%d \n",my rank,a,b,n); } MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí b:%f 22

Comunicaciones colectivas. broadcast.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); MPI Bcast(&a,1,MPI FLOAT,root,MPI COMM WORLD); MPI Bcast(&a,1,MPI FLOAT,root,MPI COMM WORLD); if(my rank 0) { &a: dirección de buffer &a: printf("Introduce dirección el dato: de acomienzo comienzo (float):de de ");scanf("%f",&a); buffer pintf("Introduce el dato: b (float): número de elementos en buffer scanf("%f",&b); número de elementos en buffer printf("Introduce el dato: n (entero): MPI FLOAT: tipo scanf("%d",&n); MPI FLOAT: tipo de de datos datos del del buffer buffer } "); 1: 1: root: root: "); identif. identif. del del root root de de la la operación operación broadcast broadcast MPI Bcast(&a,1,MPI FLOAT,root,MPI COMM WORLD); MPI Bcast(&b,1,MPI FLOAT,root,MPI COMM WORLD); MPI COMM WORLD: comunicador MPI COMM WORLD: comunicador MPI Bcast(&n,1,MPI INT,root,MPI COMM WORLD); if(my rank ! 0) { printf("En procesador %d, los datos recibidos son a:%f n:%d \n",my rank,a,b,n); } MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí b:%f 23

Comunicaciones colectivas. broadcast.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); if(my rank 0) { printf("Introduce el dato: a (float): ");scanf("%f",&a); pintf("Introduce dato: b (float): Introduce el dato: aael (float): 4.2 Introduce el dato: (float): 4.2 scanf("%f",&b); Introduce (float): 5.3 printf("Introduce dato: n (entero): Introduce el el dato: dato: bbel (float): 5.3 scanf("%d",&n); Introduce el Introduce el dato: dato: nn (entero): (entero): 66 } En En procesador procesador 2, 2, los los datos datos recibidos recibidos son son a:4.200000 a:4.200000 MPI Bcast(&a,1,MPI FLOAT,root,MPI COMM WORLD); En En procesador procesador 1, 1, los los datos datos recibidos recibidos son son a:4.200000 a:4.200000 MPI Bcast(&b,1,MPI FLOAT,root,MPI COMM WORLD); En En procesador procesador 3, 3, los los datos datos recibidos recibidos son son a:4.200000 a:4.200000 MPI Bcast(&n,1,MPI INT,root,MPI COMM WORLD); Programación en el Supercomputador Supercomputador Ben Arabí "); b:5.300000 b:5.300000 b:5.300000 b:5.300000 n:6 n:6 n:6 n:6 b:5.300000 b:5.300000 n:6 n:6 if(my rank ! 0) { printf("En procesador %d, los datos recibidos son a:%f n:%d \n",my rank,a,b,n); } MPI Finalize(); Facultad de Informática. Universidad de Murcia "); b:%f 24

Comunicaciones colectivas. gather.c inicializa(my rank,mis datos,TAMA); if(my rank 0) { datos (int*)malloc(sizeof(int)*TAMA*p); } MPI Gather(mis datos,TAMA,MPI INT,datos,TAMA,MPI INT,root,MPI C OMM WORLD); if(my rank 0) { printf("\n TODOS LOS DATOS RECIBIDOS EN PROCESO ROOT SON:\n"); escribe(datos,TAMA*p); free(datos); } Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 25

Comunicaciones colectivas. gather.c inicializa(my rank,mis datos,TAMA); if(my rank 0) { datos (int*)malloc(sizeof(int)*TAMA*p); MPI Gather(mis datos,TAMA,MPI INT,datos,TAMA,MPI INT,root,MPI COMM WORLD); MPI Gather(mis datos,TAMA,MPI INT,datos,TAMA,MPI INT,root,MPI COMM WORLD); } Mis datos: Mis datos: dirección dirección buffer buffer de de envío envío (en (en cada cada nodo nodo emisor) emisor) MPI Gather(mis datos,TAMA,MPI INT,datos,TAMA,MPI INT,root,MPI C TAMA: OMM WORLD);número TAMA: número de de elementos elementos aa enviar enviar desde desde cada cada proceso proceso if(my rank 0) MPI INT: tipo MPI INT: tipo de de datos datos de de los los elementos elementos del del buffer buffer de de envio envio { datos: datos: dirección buffer de (en nodo printf("\n TODOS LOS DATOS EN PROCESO dirección buffer de recepción recepción (en RECIBIDOS nodo receptor) receptor) ROOT SON:\n"); número de número de elementos elementos de de cada cada recepción recepción individual individual escribe(datos,TAMA*p); free(datos); MPI INT: tipo MPI INT: tipo de de datos datos del del buffer buffer de de recepción recepción } TAMA: TAMA: root: root: identificador identificador del del proceso proceso que que recibe recibe los los datos datos MPI COMM WORLD: MPI COMM WORLD: comunicador comunicador Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 26

Comunicaciones colectivas . 1: Datos Datos iniciales iniciales en en el el proceso proceso 1: gather.c 10000 10001 10002 10003 10004 10000 10001 10002 10003 10004 10008 10009 10008 10009 inicializa(my rank,mis datos,TAMA); 10005 10005 10006 10006 10007 10007 if(my rank 0) Datos Datos iniciales iniciales en en el el proceso proceso 2: 2: { 20000 20001 20002 20003 20004 20005 20006 20007 20000 20001 datos (int*)malloc(sizeof(int)*TAMA*p); 20002 20003 20004 20005 20006 20007 20009 20009 } 20008 20008 Datos Datos iniciales iniciales en en el el proceso proceso 3: 3: MPI Gather(mis datos,TAMA,MPI INT,datos,TAMA,MPI INT,root,MPI C OMM WORLD); 30000 30001 30000 30001 if(my rank 0) 30009 30009 30002 30002 30003 30003 30004 30004 30005 30005 30006 30006 30007 30007 30008 30008 { printf("\n TODOS LOS DATOS RECIBIDOS EN PROCESO Datos iniciales en el proceso 0: Datos iniciales en el proceso 0: ROOT SON:\n"); 00 11 22 escribe(datos,TAMA*p); 33 44 55 66 77 88 free(datos); 99 TODOS }LOS DATOS TODOS LOS DATOS RECIBIDOS RECIBIDOS EN EN PROCESO PROCESO ROOT ROOT SON: SON: 00 11 10003 10003 20002 20002 30001 30001 22 33 44 55 66 10004 10005 10006 10004 10005 10006 20003 20004 20005 20003 20004 20005 30002 30003 30004 30002 30003 30004 Facultad de Informática. Universidad de Murcia 77 88 10007 10007 20006 20006 30005 30005 99 10000 10001 10002 10000 10001 10002 10008 10009 20000 20001 10008 10009 20000 20001 20007 20008 20009 30000 20007 20008 20009 30000 30006 30007 30008 30009 30006 30007 30008 30009 Programación en el Supercomputador Supercomputador Ben Arabí 27

Comunicaciones colectivas. scatter.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); if(my rank 0) { datos (int*)malloc(sizeof(int)*TAMA*p); inicializa(my rank,datos,TAMA*p); } MPI Scatter(datos,TAMA,MPI INT,mis datos,TAMA,MPI INT,root,MPI CO MM WORLD) printf("Datos recibidos por proceso %d son:\n", my rank); escribe(mis datos,TAMA); if(my rank 0) { free(datos); } MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 28

Comunicaciones colectivas. scatter.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); MPI Scatter(datos,TAMA,MPI INT,mis datos,TAMA,MPI INT,root,MPI COMM WORLD) MPI Scatter(datos,TAMA,MPI INT,mis datos,TAMA,MPI INT,root,MPI COMM WORLD) if(my rank 0)dirección buffer de envío datos: datos: dirección buffer de envío { datos (int*)malloc(sizeof(int)*TAMA*p); TAMA: número TAMA: número de de elementos elementos aa enviar enviar aa cada cada proceso proceso inicializa(my rank,datos,TAMA*p); MPI INT: } MPI INT: tipo tipo de de datos datos de de los los elementos elementos del del buffer buffer de de envio envio mis datos: dirección mis datos: dirección buffer buffer de de recepción recepción MPI Scatter(datos,TAMA,MPI INT,mis datos,TAMA,MPI INT,root,MPI CO MM WORLD) TAMA: TAMA: número número de de elementos elementos en en buffer buffer de de recepción recepción printf("Datos recibidos por proceso %d son:\n", my rank); MPI INT: tipo MPI INT: tipo de de datos datos del del buffer buffer de de recepción recepción escribe(mis datos,TAMA); root: root: identificador identificador del del proceso proceso que que envia envia datos datos MPI COMM WORLD: MPI COMM WORLD: comunicador if(my rank 0)comunicador { free(datos); } MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 29

Comunicaciones colectivas. scatter.c MPI Init(&argc,&argv); Datos iniciales en proceso 0 son: MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); 0 1 2 14 15 16 if(my rank 0) 27 28 29 { 3 17 30 4 5 18 31 6 19 32 7 20 33 8 21 34 9 22 35 10 23 36 18 19 11 24 37 12 25 38 13 26 39 datos (int*)malloc(sizeof(int)*TAMA*p); Datos recibidos por proceso 1 son: inicializa(my rank,datos,TAMA*p); } 10 11 12 13 14 15 16 17 MPI Scatter(datos,TAMA,MPI INT,mis datos,TAMA,MPI INT,root,MPI CO Datos recibidos por proceso 0 son: MM WORLD) 0 1 2 3 4 5 6 7 8 9 printf("Datos recibidos por proceso %d son:\n", my rank); escribe(mis datos,TAMA); Datos recibidos por proceso 2 son: 20 21 22 23 24 25 if(my rank 0) { Datos recibidos por proceso 3 son: free(datos); 31 32 33 34 35 } 30 26 36 27 37 28 38 29 39 MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 30

Comunicaciones colectivas. reduce.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); inicializa(my rank,mis datos,TAMA); if(my rank 0) { datos (int*)malloc(sizeof(int)*TAMA); } MPI Reduce(mis datos,datos,TAMA,MPI INT,MPI SUM,root,MPI COMM WORLD); if(my rank 0) { printf("\n LOS DATOS, TRAS REDUCCION, escribe(datos,TAMA); free(datos); } EN PROCESO ROOT SON:\n"); MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 31

Comunicaciones colectivas. reduce.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); MPI Reduce(mis datos,datos,TAMA,MPI INT,MPI SUM,root,MPI COMM WORLD); MPI Reduce(mis datos,datos,TAMA,MPI INT,MPI SUM,root,MPI COMM WORLD); inicializa(my rank,mis datos,TAMA); mis datos: mis datos: dirección dirección buffer buffer de de envío envío if(my rank 0)dirección buffer de recepción dirección buffer de recepción datos (int*)malloc(sizeof(int)*TAMA); TAMA: número TAMA: número de de elementos elementos en en buffer buffer de de envío envío } datos: datos: { MPI INT: MPI INT: tipo tipo de de elementos elementos de de buffer buffer de de envío envío MPI Reduce(mis datos,datos,TAMA,MPI INT,MPI SUM,root,MPI COMM WORLD); MPI SUM: operación MPI SUM: operación aa realizar realizar durante durante la la reducción reducción root: if(my rank 0)identificador root: identificador del del proceso proceso root root { MPI COMM WORLD:comunicador printf("\n LOS DATOS, TRAS REDUCCION, MPI COMM WORLD:comunicador EN PROCESO ROOT SON:\n"); escribe(datos,TAMA); free(datos); } MPI Finalize(); Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 32

Comunicaciones colectivas. reduce.c MPI Init(&argc,&argv); MPI Comm rank(MPI COMM WORLD,&my rank); MPI Comm size(MPI COMM WORLD,&p); En En proceso proceso 22 los los datos datos son: son: inicializa(my rank,mis datos,TAMA); 20000 20001 20000 20001 if(my rank 0) 20008 20009 20008 20009 20002 20002 20003 20003 20004 20004 20005 20005 20006 20006 20007 20007 { datos (int*)malloc(sizeof(int)*TAMA); } En En proceso proceso 00 los los datos datos son: son: 00 11 22 33 44 55 66 77 88 99 MPI Reduce(mis datos,datos,TAMA,MPI INT,MPI SUM,root,MPI COMM WORLD); En proceso 1 los datos son: En proceso 1 los datos son: if(my rank 0) 10007 10000 10001 10002 10003 10004 10005 10006 { 10007 10000 10001 10002 10003 10004 10005 10006 10008 10009 10008 10009 printf("\n LOS DATOS, TRAS REDUCCION, EN PROCESO ROOT SON:\n"); escribe(datos,TAMA); free(datos); LOS LOS DATOS, DATOS, TRAS TRAS REDUCCION, REDUCCION, EN EN PROCESO PROCESO ROOT ROOT SON: SON: } 30000 30003 30000 30003 30024 30027 MPI Finalize(); 30024 30027 Facultad de Informática. Universidad de Murcia 30006 30006 30009 30009 30012 30012 Programación en el Supercomputador Supercomputador Ben Arabí 30015 30015 30018 30018 30021 30021 33

Comunicaciones colectivas. Operaciones de reducción MPI Operator Operation ------------MPI MAX maximum MPI MIN minimum MPI SUM sum MPI PROD product MPI LAND logical and MPI BAND bitwise and MPI LOR logical or MPI BOR bitwise or MPI LXOR logical exclusive or MPI BXOR bitwise exclusive or MPI MAXLOC max value and location MPI MINLOC min value and location Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 34

Comunicaciones colectivas. FORTRAN MPI BCAST(BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR) type BUFFER(*) INTEGER COUNT, DATATYPE, ROOT, COMM, IERROR MPI GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR) type SENDBUF(*), RECVBUF(*) INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR MPI SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR) type SENDBUF(*), RECVBUF(*) INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR MPI REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, COMM, IERROR) type SENDBUF(*), RECVBUF(*) INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí OP, ROOT, 35

Indice de la sesión Introducción Comunicaciones punto a punto Comunicaciones colectivas Agrupación de datos Comunicadores y topologías MPI-2 Uso de MPI en el supercomputador BenArabi Ejercicios prácticos Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 36

Agrupación de datos Con contador en rutinas de envío y recepción: agrupar los datos a enviar Con tipos derivados Con empaquetamiento Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 37

Agrupación de datos. Tipos derivados Se crean en tiempo de ejecución Se especifica la disposición de los datos en el tipo: Int MPI Type Struct ( int int MPI Aint MPI Datatype MPI Datatype ) count, *array of block lengths, *array of displacements, *array of types, *newtype Se pueden construir tipos de manera recursiva La creación de tipos requiere trabajo adicional Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 38

Agrupación de datos. Tipos derivados: derivados.c (1/2) typedef struct { float float int } INDATA TYPE; INDATA TYPE MPI Datatype a; b; n; indata; message type; if(my rank 0) { printf("Introduce el dato:a (float): ");scanf("%f",&(indata.a)); printf("Introduce el dato:b (float): ");scanf("%f",&(indata.b)); printf("Introduce el dato:n(entero): ");scanf("%d",&(indata.n)); } Build derived type(&indata,&message type); MPI Bcast(&indata,count,message type,root,MPI COMM WORLD); if(my rank ! 0) printf("En procesador %d, los datos recibidos son a:%f n:%d \n",my rank,indata.a,indata.b,indata.n) Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí b:%f 39

Agrupación de datos. Tipos derivados: derivados.c (2/2) void Build derived type(INDATA TYPE *indata, MPI Datatype *message type ptr) { int block lenghts[3]; /*.continuación.*/ /*.continuación.*/ MPI Aint dis[3]; dis[0] addresses[1]-addresses[0]; dis[0] addresses[1]-addresses[0]; MPI Aint addresses[4]; dis[1] addresses[2]-addresses[0]; dis[1] addresses[2]-addresses[0]; MPI Datatype typelist[3]; dis[2] addresses[3]-addresses[0]; dis[2] addresses[3]-addresses[0]; typelist[0] MPI FLOAT; typelist[1] MPI FLOAT; MPI Type struct(3,block lenghts,dis, MPI Type struct(3,block lenghts,dis, typelist[2] MPI INT; typelist,message type ptr); typelist,message type ptr); block lenghts[0] 1; block lenghts[1] 1; block lenghts[2] 1; MPI Type commit(message type ptr); MPI Type commit(message type ptr); }} MPI Address(indata,&addresses[0]); MPI Address(&(indata- a),&addresses[1]); MPI Address(&(indata- b),&addresses[2]); MPI Address(&(indata- n),&addresses[3]); /*.continua.*/ Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 40

Agrupación de datos. Tipos derivados Si los datos que constituyen el nuevo tipo son un subconjunto de entradas hay mecanismos especiales para construirlos (1/3): int MPI Type contiguous ( int count, MPI Datatype oldtype, MPI Datatype *newtype ) Crea un tipo derivado formado por count elementos del tipo oldtype contiguos en memoria. Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 41

Agrupación de datos. Tipos derivados Si los datos que constituyen el nuevo tipo son un subconjunto de entradas hay mecanismos especiales para construirlos (2/3): int MPI Type vector ( int count, int block lenght, int stride, MPI Datatype element type, MPI Datatype *newtype ) Crea un tipo derivado formado por count elementos, cada uno de ellos con block lenght elementos del tipo element type. stride es el número de elementos del tipo element type entre elementos sucesivos del tipo new type. De este modo, los elementos pueden ser entradas igualmente espaciadas en un array. Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 42

Agrupación de datos. Tipos derivados Si los datos que constituyen el nuevo tipo son un subconjunto de entradas hay mecanismos especiales para construirlos (3/3): int MPI Type indexed ( int count, int *array of block lengths, int *array of displacements, MPI Datatype element type, MPI Datatype *newtype ) Crea un tipo derivado con count elementos, habiendo en cada elemento array of block lengths[i] entradas de tipo element type, y el desplazamiento array of displacements[i] unidades de tipo element type desde el comienzo de newtype Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 43

Agrupación de datos. Empaquetamiento Los datos se pueden empaquetar para ser enviados, int MPI Pack int MPI Pack y desempaquetarse tras ser recibidos. ( ( void void int Se empaquetan in count datos de tipo datatype, y int pack data referencia los datos a empaquetar en el MPI Datatype MPI Datatype void buffer, que debe consistir de size bytes (puede ser void int int una cantidad mayor a la que se va a ocupar). int int MPI Comm MPI Comm )) *pack data, *pack data, in count, in count, datatype, datatype, *buffer, *buffer, size, size, *position ptr, *position ptr, comm comm El parámetro position ptr es de E/S: Como entrada, el dato se copia en la posición buffer *position ptr. Como salida, referencia la siguiente posición en el buffer después del dato empaquetado. El cálculo de dónde se sitúa en el buffer el siguiente elemento a empaquetar lo hace MPI automáticamente. Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí 44

Agrupación de datos. Empaquetamiento Copia count elementos de tipo datatype en unpack data, tomándolos de la posición buffer *position ptr del buffer. int int MPI Unpack MPI Unpack (( void void int int int El tamaño del buffer (size) en bytes, y position ptr int Void es manejado por MPI de manera similar a como lo Void int int hace en MPI Pack. MPI Datatype MPI Datatype MPI Comm MPI Comm )) Facultad de Informática. Universidad de Murcia Programación en el Supercomputador Supercomputador Ben Arabí *buffer, *buffer, size, size, *position ptr, *position ptr, *unpack data, *unpack data, count, count, datatype, datatype, comm comm 45

Agrupación de datos. Empaquetamiento: empaquetados.c if(my rank 0) { printf("Introduce el dato: a (float): scanf("%f",&a); printf("Introduce el dato: b (float): scanf("%f",&b); printf("Introduce el dat

Curso de Promoción Educativa Programación en el Supercomputador Ben Arabi Programación con MPI Javier Cuenca Universidad de Murcia

Related Documents:

Sistema de control DeltaV 7009 Curso básico 4.5 2-6 4-8 5-9 7017 Curso avanzado 4.5 16-20 18-22 2-6 7016 Curso batch 4,5 20-24 19-23 7018 Curso mantenimiento 4 23-26 8-11 16-19 7012 Curso operación 3 13-15 14-16 1-3 Sistema de Control Ovation OV-010 Curso de Operación 3 2-4 11-13 21-23 OV-100-WIN Curso de Ingenieria 4.5 23-27 22-26 26-30

Libro 3. Las tecnologías de la información y la comunicación (TIC): Avances, retos y desafíos en la transformación educativa Toda comunicación dirigirla al Consejo de Transformación Educativa: Instituto de Higiene núm. 56, Col. Popotla, CP 11400, México, D.F. Teléfono/Fax: 5341-8012 www.transformacion-educativa.com

El Modelo de Gestión Educativa Estratégica es una propuesta de la Dirección Gene-ral de Desarrollo de la Gestión e Innovación Educativa de la Subsecretaría de Educación Básica, como parte de la política educativa para la transformación y el funcionamiento de

El Modelo de Gestión Educativa Estratégica es una propuesta de la Dirección General de Desarrollo de la Gestión e Innovación Educativa de la Subsecretaría de Educación Básica, como parte de la política educativa para la transformación de la gestión escolar y la mejora del logro educativo.

nÚmero de horas y crÉditos. i curso. 21 nÚmero de horas y crÉditos ii curso 22 mapa curricular 23 rÉgimen acadÉmico. 24 i curso : descripciÓn sintÉtica de las asignaturas del programa 33 primer curso. programa. 33 primer curso. asignaturas teÓricas. nÚmero de horas

respectivo curso). Até o limite de 25% da carga horária para Atividades Complementares exigida pelo curso. Diretamente pela Coordenação de Curso via lista de presença ou pelo aluno, via requerimento dirigido à Coordenação de Curso, com a devida documentação comprobatória, p

TÍPO DE CURSO N. DE HORAS PREÇO por pessoa CURSO REGULAR (2 meses) 32 300 CURSO INTENSIVO 80 650 AULAS PARA GRUPOS PEQUENOS 2 estudantes 1 30 de 3 a 5 estudantes 1 25 CURSO DE CONVERSAÇÃO 12 165 AULAS INDIVIDUAIS 1 50 Curso de preparação para o exame PL

CURSO AUTOCAD CIVIL 3D AVANZADO Autodesk Civil 3D tiene funcionalidades específicas que permiten administrar de manera eficiente los . www.darco.com.mx con los datos de; nombre del curso, horario, documentación que debes revisar previo al inicio del curso. 3. Este curso es 100% práctico, a medida que el instructor vaya avanzando con la .