Title: Comunicadores Colectivos
1Comunicadores Colectivos
BARRIER Esta es una de las primeras que ya vimos.
Bloquea todos los procesos hasta que todos los
procesos del Comm la llaman. MPI_BARRIER(
MPI_COMM_WORLD)
BROADCAST un mensaje para todos los procesos
(incluido el mismo) del COMM definido MPI_BCAST(
a/buffer, count, MPI_FLOAT/datatype, root,
comm) a/buffer en donde se almacena lo
enviado count numeros de envios (INT)
MPI_FLOAT/datatype tipo de dato enviado (handle)
root rango del que envia (INT) comm
communicador (handle)
2Comunicadores Colectivos
REDUCE al buffer datos de todos los procesos al
root utilizando un tipo definido de
operación MPI_REDUCE(integral/sendbuffer,
total/recvbuffer, count, datatype, op, root,
comm) sendbuffer dirección de inicio recvbuffer
dirección de recepción count número de datos
enviados datatype tipo de datos enviados op
tipo de operación (handle) MPI_MAX MPI_MIN
MPI_SUM MPI_ PROD MPI_LAND MPI_LOR
etc.
3(I/O en MPI)
if(my_rank0) a0 b1
n1000
void GeneraVectores(
if (my_rank 0) in
fopen("datos.txt","r")
Truco Generador de vectores/matrices/datos
interno
4Trapecio con Send-Recive
- if (my_rank ! 0)
- source 0
- MPI_Recv(a, 1, MPI_FLOAT, source,
tag, MPI_COMM_WORLD,status) - MPI_Recv(b, 1, MPI_FLOAT, source,
tag, MPI_COMM_WORLD,status) - MPI_Recv(n, 1, MPI_INT, source, tag,
MPI_COMM_WORLD,status) - else
- for (dest 1 dest lt p dest)
- MPI_Send(a, 1, MPI_FLOAT, dest,
tag,MPI_COMM_WORLD) - MPI_Send(b, 1, MPI_FLOAT, dest,
tag,MPI_COMM_WORLD) - MPI_Send(n, 1, MPI_INT, dest,
tag,MPI_COMM_WORLD) - h (b-a)/(np)
- local_n n
- local_a a my_rank (local_nh)
- local_b local_a (local_nh)
- integral_local Trap(local_a, local_b, local_n,
h) - error_local Error_Trap(local_a, local_b,
local_n, h) - if (my_rank ! 0)
- dest 0
- MPI_Send(integral_local, 1, MPI_FLOAT,
dest, tag,MPI_COMM_WORLD)
5Trapecio con Broadcast-Reduce
MPI_Bcast(a,1,MPI_FLOAT, 0,MPI_COMM_WORLD)
MPI_Bcast(b,1,MPI_FLOAT, 0,MPI_COMM_WORLD)
MPI_Bcast(n,1,MPI_LONG, 0,MPI_COMM_WORLD)
h (b-a)/(np) local_n n local_a a
my_rank (local_nh) local_b
local_a (local_nh) integral
Trap(local_a, local_b, local_n, h) error
Error_Trap(local_a, local_b, local_n, h)
MPI_Reduce(integral, total, 1, MPI_FLOAT,
MPI_SUM, 0, MPI_COMM_WORLD)
MPI_Reduce(error, totalError, 1, MPI_FLOAT,
MPI_SUM, 0, MPI_COMM_WORLD)
6Comunicadores Colectivos
MPI_GATHER(sendbuffer, sendcount, sendtype,
recvbuffer, recvcount, recvtype, root,
comm) sendbuffer Dirección inicial de los datos
de envio. sendcount Numero de datos
enviados sendtype Tipo de datos enviado
recvbuffer Dirección inicial de los datos
recibidos recvcount Número de datos
recibidos recvtype Tipo de datos recibidos root
rango del proceso que recibe comm
Comunicador Cada proceso envía el contenido
almacenado en sendbuffer al root Quien lo guarda
en el orden del rango
7Comunicadores Colectivos
- MPI_SCATTER( sendbuffer, sendcount, sendtype,
recvbuffer, recvcount, recvtype, root, comm) - sendbuffer Dirección inicial de los datos de
envio. - sendcount Numero de datos enviados
- sendtype Tipo de datos enviado
- recvbuffer Dirección inicial de los
datos recibidos - recvcount Número de datos recibidos
- recvtype Tipo de datos recibidos
- root rango del proceso que recibe
- comm Comunicador
- Es la operación inversa del
- MPI GATHER.
- Una operación en la que cada
- proceso se queda con un grupo
- diferente de datos
8Ejemplo
- MPI_Comm comm
- int myrank,nprocs,root,iarray100
- int rbuff
- MPI_Comm_rank(comm, myrank) // define el rango
- MPI_Comm_size(comm, nprocs) // define numero
de procesos - if (myrank root) // crea un buffer receptor
del tamaño adecuado - rbuff (int )malloc(nprocs100sizeof(int))
- MPI_Gather(iarray,100,MPI_INT,rbuff,100,MPI_INT,ro
ot,comm)
9Comunicadores Colectivos
- MPI_ALLGATHER( sendbuffer, sendcount, sendtype,
recvbuffer, recvcount, recvtype, root, comm) - sendbuffer Dirección inicial de los datos de
envio. - sendcount Numero de datos enviados
- sendtype Tipo de datos enviado
- recvbuffer Dirección inicial de los datos
recibidos - recvcount Número de datos recibidos
- recvtype Tipo de datos recibidos
- root rango del proceso que recibe
- comm Comunicador
- Con esta función, una variante de
- MPI GATHER, todos los procesos
- en el comm obtienen los mismos
- Resultados (GATHER BCAST).
10Comunicadores Colectivos
- MPI_ALLTOALL( sendbuffer, sendcount, sendtype,
recvbuffer, recvcount,recvtype, root, comm) - sendbuffer Dirección inicial de los datos de
envio. - sendcount Numero de datos enviados
- sendtype Tipo de datos enviado
- recvbuffer Dirección inicial de los datos
recibidos - recvcount Número de datos recibidos
- recvtype Tipo de datos recibidos
- root rango del proceso que recibe
- comm Comunicador
- Es una extensión de MPI ALLGATHER
- para el caso en que cada proceso
- envié diferentes datos a cada receptor
- El bloque j que viene del proceso i es
- recibido por el proceso j y ubicado
- en la posición i
11Comunicadores Colectivos
int MPI_Gatherv ( void sendbuf, int sendcnt,
MPI_Datatype sendtype, void recvbuf, int
recvcnts, int displs,
MPI_Datatype recvtype, int root, MPI_Comm comm
) A diferencia de MPI_Gather, esta función
permite que el tamaño de los subarreglos sea
diferente en cada nodo. Tiene dos parámetros
diferentes recvcnts y displs recvcntsi es
un arreglo de enteros de tamaño size que posee en
cada celda el tamaño del subarreglo respectivo
al nodo i. displsi es un arreglo de enteros
de tamaño size que posee en cada celda el offset
del subarreglo i en el arreglo global.
En forma similar se define MPI_Scatherv
12Comunicadores Colectivos
- MPI ALLREDUCE Esta función reduce en el buffer de
recepción elementos de todos los procesos con la
operación marcada y lo almacena en todos los
procesos del comm - El usuario puede imaginar sus propias operaciones
de reducción y programarlas. - Un ejemplo MPI_REDUCE_SCATTER una combinación de
MPI_REDUCE y MPI_SCATTERV. Que reduce un conjunto
de datos y luego lo posiciona en partes en todos
los procesos - OJO como se almacenan los datos en C y FORTRAN!
13Comunicadores Colectivos ejemplos
- Producto Interno PI A100 B100
- p procesos. Es 100 divisible por p.
- Posibilidades Truco np (vale en trapecios)
- Completar con ceros
- 2) Leo en p0 y distribuyo
PI_Local Local_A25 LocalB25
SCATTER
14Comunicadores Colectivos ejemplos
4) PI_Local Local_A25 LocalB25 5) Reducir
al master, imprimir, etc
REDUCE
15Comunicadores Colectivos ejemplos
Multiplicar Matrices (cuadradas)
A100100B100100C100100 Hay diversas
soluciones. Un algoritmo interesante FOX. Está
en el capitulo 7 del Pacheco.
C1 A1B1 A2B5 A3B9 A4B13
16Comunicadores Colectivos ejemplos
SCATTER
A
B
0 1 2 3
0 1 2 3
17Comunicadores Colectivos ejemplos
Send-Recv
A
B
0 1 2 3
0 1 2 3
18Comunicadores Colectivos ejemplos
0 1 2 3
Gather al master
19MPI_Barrier MPI_Broadcast MPI_Reduce MPI_ALLReduce
MPI_Scatter MPI_Gather MPI_AllGather MPI_AlltoALL
MPI_Gatherv MPI_Scatterv
MPI INIT MPI COMM SIZE MPI COMM RANK MPI SEND MPI
RECEIVE MPI FINALIZE
MPI_Wtime
17
20Varios
Todo el material esta en el sitio
web www.lsc.dc.uba.ar\courses\...
Acceso a Clusters Herramienta BCCD http//bccd.c
s.uni.edu
lorito.exp.dc.uba.ar hpci i1,10 password
mpi2007 Windows hpci i1,16 password
a123456Z
21SPEEDY SCRIPT.SH http//lsc.dc.uba.ar/hp
c-grid/cluster-speedy 1) cuenta hpci i1,12
pass mpi2007 2) Acceso ssh
hpc1_at_master.fiscmp.lab.dc.uba.ar 3)
transferencia de información al cluster sftp
4) COMPILACION Transferir el programa fuente al
cluster Conectarse al cluster con ssh Compilar
el fuente con el comando correspondiente según
las bibliotecas utilizadas. Por ejemplo,
utilizando MPI mpicc -o
prog_fuente_linux prog_fuente_linux.c
225) EJECUCION qsub encolador de procesos. El
comando qsub necesita como parámetro un script.
Típicamente este script contiene los parámetros
propios del qsub (entre ellos la selección de
nodos a utilizar) la invocación al programa que
se quiere ejecutar en batch Ejemplos de scripts
según las bibliotecas utilizadas MPI mpich.sh
PVM pvm.sh LAM MPI lam.sh 6) cola de procesos
qstat Uno de los campos de la tabla
de salida de este comando es el estado del
proceso, el mismo puede ser E - Exiting H -
Held Q - Queued R - Running T - el job se esta
cambiando de nodo W - Waiting S - Suspend
7) eliminar un proceso de la cola qstat Tomar
el ID del proceso a eliminar y ejecutar qdel
Job_id
23-------------------------------------------------
-----------------------
Speedy UBA Host
master.speedy.dc.uba.ar Archivo
/usr/local/speedy/mpich.sh Creacion
20030520 - Carolina Leon Carri -
mcarri_at_dc.uba.ar Revision Titulo
Ejemplo de script PBS para MPICH Descripcion
Este script se utiliza para enviar a ejecutar
programas en batch que utilizan
las bibliotecas MPICH el comando
'qsub' El comando 'qsub' acepta
parametros por linea de comando o
bien pueden definirse dentro de este script. Las
lineas que comienzan con 'PBS'
son los parametros que tomara el
comando 'qsub', NO son comentarios.
Para mas informacion puede ver los manuales
man qsub Lea
atentamente los comentarios del script y
modifique con lo que corresponda
donde encuentre la palabra COMPLETAR
Ejecucion qsub mpich.sh
------------------------------------------------
------------------------ La opcion -l permite
definir los recursos del sistema que se quieren
utilizar. Para ver todos los tipos de recursos
que se pueden definir ver 'man pbs_resources'
El recurso mas utilizado es la especificacion de
los nodos que se quieren utilizar. Ejemplo
por cantidad de nodos -l nodesltcant_nodosgt
Ejemplo por nombre de maquina -l
nodesltnombre1gtltnombre2gt...
24PBS -l nodesCOMPLETAR ------------------------
------------------------------------------------
El comando 'qsub' deja la salida de 'standard
output' y 'standard error' en diferentes
archivos. Para que guarde todo en un unico
archivo se define la opcion -j donde oe
'std output' y 'std error' como output (.o)
eo 'std output' y 'std error' como error
(.e) PBS -j oe -----------------------------
------------------------------------------- El
'qsub' envia un mail segun el/los evento/s
definido/s a abort b begin e
end n never PBS -m ba ------------------
--------------------------------------------------
---- Especificar direccion de e-mail donde se
enviara el mail PBS -M COMPLETAR --------------
--------------------------------------------------
-------- La variable PBS_NODEFILE es una
variable de entorno del PBS, hace referencia
al archivo que contiene la lista de nodos que se
utilizara para esta corrida dependiendo de la
definicion anterior '-l nodes...' La variable
NP guardara la cantidad de nodos
elegidos NP(wc -l PBS_NODEFILE awk 'print
1') ------------------------------------------
------------------------------ Las siguientes
lineas imprimiran en el archivo de output los
nodos que fueron utilizados en la corrida. echo
"nodes (NP cpu total)" sort PBS_NODEFILE
uniq echo ---------------------------------------
--------------------------------- La variable
PBS_O_WORKDIR es una variable de entorno del PBS,
indica el PATH absoluto del directorio de
trabajo corriente y es en este directorio donde
quedaran los archivos de salida. cd
PBS_O_WORKDIR ----------------------------------
-------------------------------------- Linea
de ejecucion del mpirun mpirun -machinefile
PBS_NODEFILE -np NP COMPLETAR exit
0 -----------------------------------------------
-------------------------