Titulo - PowerPoint PPT Presentation

About This Presentation
Title:

Titulo

Description:

Titulo Introducci n a MPI Clase 4 Marcelo Rozenberg (agradecimiento: Ruben Weht ruweht_at_cnea.gov.ar) Comunicaciones en m s detalle (continuaci n) MPI_Reduce_scatter ... – PowerPoint PPT presentation

Number of Views:75
Avg rating:3.0/5.0
Slides: 27
Provided by: Ruben96
Category:
Tags: titulo

less

Transcript and Presenter's Notes

Title: Titulo


1
Titulo
Introducción a MPI Clase 4
Marcelo Rozenberg (agradecimiento Ruben Weht
ruweht_at_cnea.gov.ar)
2
Comunicaciones en más detalle (continuación)
3
Scatterv/gatherv
MPI_Scatterv Es similar a MPI_Scatter excepto
que permite gaps entre los datos a transferir y
longitud variable de datos
MPI_Gatherv Operación inversa a MPI_Scatterv
(una generalización de MPI_Gather)
4
Scatterv/gatherv, ej.
MPI_Scatterv(datos-o, tam-o, desplaz, tipo-o,
datos-r, tam-r, tipo-r,
raíz, comm, error)
MPI_Gatherv(datos-o, tam-o, tipo-o, datos-r,
tam-r, desplaz, tipo-r,
raíz,comm, error)
Ej real a(100), rbuf(MAX) integer displace(NX),
rcounts(NX) interval 150 do i1,nsize
displace(i) i interval rcounts(i)
100 enddo call mpi_gatherv(a, 100, MPI_REAL,
rbuf, rcounts, displace, MPI_REAL, root, comm,
ierr)
100
a
Ojo si interval lt 100 anda mal
rbuf
150
300
450
5
Allgather/allgatherv
Datos
Ao
A1
A2
A3
Ao A1 A2 A3



gather
Proces.
Datos
Ao
A1
A2
A3
Ao A1 A2 A3
Ao A1 A2 A3
Ao A1 A2 A3
Ao A1 A2 A3
Allgather/allgatherv
allgather
Proces.
MPI_Allgather(datos-o, tam-o, tipo-o, datos-r,
tam-r, tipo-r, comm,
error)
6
Alltoall
Datos
A0 A1 A2 A3
B0 B1 B2 B3
C0 C1 C2 C3
D0 D1 D2 D3
Ao B0 C0 D0
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
alltoall
Proces.
MPI_Alltoall(datos-o, tam-o, tipo-o, datos-r,
tam-r, tipo-r, comm,
error)
7
Reduce
3) Rutinas de cálculo
MPI_Reduce (dato-o, dato-r, tam-o, tipo,
operación, destino, comm, ierr)
Algunas operaciones posibles (hay
mas) MPI_MAX máximo MPI_MIN mínimo MPI_SUM
suma MPI_PROD producto MPI_LAND (logical
and) Y (lógico) MPI_LOR (logical or) O
(lógico) MPI_LXOR O exclusivo
(lógico) MPI_MAXLOC valor máximo y
ubicación MPI_MINLOC valor mínimo y
ubicación MPI_Scan suma hasta su myid
8
Reduce-2
MPI_Allreduce (dato-o, dato-r, tam-o, tipo-o,
operación, comm, error) Igual que MPI_Reduce,
pero el resultado va a todos los
procesos MPI_Reduce_scatter (dato-o, dato-r,
tam-o, tipo-o, operación, comm, error) Ej m
lt n m n /nprocs real a(n,m),
b(m), c(m) do i1,n sum 0 do
j1,m sum sum a(i,j)b(j) enddo
tmp(i) sum enddo call MPI_Reduce_scatter (tmp,
c, counts, MPI_Real, MPI_Sum, comm, ierr) end
El usuario puede crear sus propias operaciones
MPI_Op_create
9
MPI_Reduce_scatter para multiplicación de matriz
por vector
...
P0
P1
Pm
P0
P1
...
Pm
scatter
reduce
P0
P0
P1
P1
...
...
Pm
Pm
counts
A
B
C (temp)
C
C
A(n,n) mn/nprocs
10
Aspectos más avanzados
  • Tipos de datos (Data type)
  • Comunicadores (manipulación de grupos de procesos)

11
cómo se definen y envían los datos?
  • Ej
  • MPI_SEND(datos, cuantos, tipo_de_dato, destino,
    tag, comm, ierr)
  • MPI_SEND(a,5,MPI_REAL,4,1,MPI_COMM_WORLD,ierr)
  • envia los 5 numeros reales del vector a(5) al
    proceso 4 de comm_world
  • Esto sirve para datos contiguos

12
Tipo de datos basicos
Tipos de Datos
El usuario puede construir otros tipos de
datos. MPI soporta arquitecturas heterogéneas, la
definición del tipode datos a intercambiar hace
que sean compatibles.
13
Tipos de datos derivados
  • Tipo contiguo
  • Tipo vector
  • Tipo indexado

14
Tipo contiguo
Tipo contiguo
Es el más simple de los tipo de datos. Define un
nuevo tipo de datos, replicando una secuencia de
datos contigua de un tipo existente MPI_Type_conti
guous(icount, oldtype, newtype, ierr) Ejemplo
quiero definir y enviar M columnas, a partir de
la j-ésima, de una matriz A de NxN a otro proceso.
call mpi_type_contiguous( N, MPI_REAL, columna,
ierr) call mpi_type_commit( columna, ierr) call
mpi_send(A(1,j), M, columna, dest, tag, comm,
ierr)
15
MPI_Type_contiguous( N, MPI_REAL, columna,
ierr) MPI_Send(A(1,j), M, columna, dest, tag,
comm, ierr)
A(1,j) (comienzo)
j
jM
j1
1
N
A
M columnas
nuevo tipo de dato columna
16
La respuesta es sí, es lo mismo!
  • MPI_Send ( a , count , datatype , dest , tag ,
    comm )
  • Es idéntico a
  • MPI_Type_contiguous( count , datatype , newtype )
  • MPI_Type_commit( newtype )
  • MPI_Send( a , 1 , newtype , dest , tag , comm )
  • MPI_Type_free( newtype)

asigna
libera
17
Tipo vector
Tipo vector
Es una pequeña generalización del
anteriorPermite definir un tipo de dato de
bloques igualmente espaciados de datos
contiguos MPI_Type_vector(cuantos, largobloque,
desplazamiento, oldtype, newtype,
ierr) Ejemplo definir y enviar una matrix de 3x4
embebida en una matriz A de NxN a partir del
sitio A(i,j).
call mpi_type_vector( 3, 4, N, MPI_REAL, submat,
ierr) call mpi_type_commit( submat, ierr) call
mpi_send(A(i,j), 1, submat, idest, itag, icomm,
ierr)
18
MPI_Type_vector( 3, 4, N, MPI_REAL, submat,
ierr) MPI_Send(A(i,j), 1, submat, idest, itag,
icomm, ierr)
A(i,j) (comienzo)
j
j4
1
N
A(N,N)
nuevo tipo de dato submat
19
Tipo indexado
Generaliza al anterior, permitiendo bloques de
largo variable y con desplazamientos
variables MPI_Type_indexed(cuantos,
vec-largobloque, vec-desplazamiento, oldtype,
newtype, ierr) vec-largobloque y
vec-desplazamiento don vectores que contienen la
informacion sobre como ir variando los largos y
el desplazamiento. Permiten mucha flexibilidad.
Finalmente recordar al final hay que liberar la
asignación MPI_Type_free (newtype)
20
Definir y manipular comunicadores
  1. Obtener un conjunto de IDs de un comunicador
    existente
  2. Crear un grupo como un subconjunto de un dado
    grupo
  3. Definir un nuevo comunicador para el grupo.

21
1. Obtener un conjunto de IDs de un comunicador
existente MPI_Comm_group ( comm, group,
ierr) el comunicador comm es el input y como
output obtengo group que es un conjunto de
IDs group es un tipo de dato MPI_Group
(declaración)
22
2. Crear un grupo como un subconjunto de un dado
grupo MPI_Group_incl ( oldgrp, count, ranks,
newgrp, ierr)MPI_Group_excl ( oldgrp, count,
ranks, newgrp, ierr) estas son funciones sobre
datos tipo MPI_Group (oldgrp) que como resultado
dan un nuevo dato tipo MPI_Group, i.e. un nuevo
grupo (newgrp). count indica cuantos IDs serán
incluídos o excluídos. la lista de IDs a incluir
o excluir están en el vector de enteros ranks P0
en el newgrp (rank0), tenía rankranks(0) en el
oldgrp el proceso Pranks(0) sera el proceso P0
en el newgrp el proceso Pranks(1) sera el
proceso P1 en el newgrp
23
3. Crear un nuevo comunicador para el
grupo. MPI_Comm_create ( comm, newgrp,
newcomm, ierr) comm (input) es el comunicador
sobre el cual el grupo de IDs ha sido
definido. newcomm (output) es un nuevo
comunicador que contiene solamente a los miembros
del nuevo grupo (newgrp)(input). al invocar
newcomm sólo se incluyen los procesos del
newgroup.
24
En síntesis, para crear un nuevo comunicador
realizo 3 pasos
  1. Obtener un conjunto de IDs de un comunicador
    existente
  2. Crear un grupo como un subconjunto de un dado
    grupo
  3. Definir un nuevo comunicador para el grupo.

Y cuando el nuevo comunicador no sea más
necesario se liberan los recursos con llamados a
las funciones MPI_Group_free( newgroup
) MPI_Comm_free( newcomm )
25
Ejemplo
parameter(maxpes128)dimension
iranks(maxpes)include mpif.hcall
mpi_init(ierr)call mpi_comm_size(MPI_COMM_WORLD,
npes, ierr)call mpi_comm_rank(MPI_COMM_WORLD,myid
, ierr)call mpi_comm_group(MPI_COMM_WORLD,
iwgroup, ierr)neven (npes1)/2do i0, npes-1,
2 iranks((i2)/2) ienddocall
mpi_group_incl(iwgroup, neven, iranks, iegroup,
ierr)call mpi_group_excl(iwgroup, neven, iranks,
iogroup, ierr)call mpi_comm_create(MPI_COMM_WORLD
, iegroup, iecomm, ierr)call mpi_comm_create(MPI_
COMM_WORLD, iogroup, iocomm, ierr)call
mpi_group_rank(iegroup, iegid, ierr)if(iegid.ne.M
PI_UNDEFINED) then print, my world id is
,myid, my even group id , iegidelse call
mpi_group_rank(iogroup, iogid, ierr) print,
my world id is , myid, my odd group id ,
iogidendifend
26
Rutinas que actúan sobre grupos grupos
MPI_Group_size como MPI_Comm_sizeMPI_Group_rank
como MPI_Comm_rank MPI_Group_translate_ran
ks sirve para averiguar a que ID le
corresponde un dado ID de comm_world en otro
comunicador MPI_Group_compare
MPI_Group_union MPI_Group_difference no son muy
usadas MPI_Group_dup MPI_Group_split
Write a Comment
User Comments (0)
About PowerShow.com