1 / 26

Titulo

Titulo. Introducción a MPI Clase 4. Marcelo Rozenberg (agradecimiento: Ruben Weht ruweht@cnea.gov.ar). Comunicaciones en más detalle (continuación). Scatterv/gatherv. MPI_Scatterv : Es similar a MPI_Scatter excepto que permite gaps entre los datos a transferir y longitud variable de datos.

calla
Télécharger la présentation

Titulo

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Titulo Introducción a MPI Clase 4 Marcelo Rozenberg (agradecimiento: Ruben Weht ruweht@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 i=1,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 < 100 anda mal rbuf 150 300 450

  5. Allgather/allgatherv Datos gather Proces. Datos Allgather/allgatherv allgather Proces. MPI_Allgather(datos-o, tam-o, tipo-o, datos-r, tam-r, tipo-r, comm, error)

  6. Alltoall Datos 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 < n m = n /nprocs • real a(n,m), b(m), c(m) • do i=1,n • sum = 0 • do j=1,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 scatter P0 P1 ... Pm reduce P0 P0 P1 P1 ... ... Pm Pm counts C C C (temp) A B A(n,n) m=n/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_contiguous(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 j+1 j+M 1 N A nuevo tipo de dato “columna” M columnas

  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 anterior:Permite 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 j+4 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 • Obtener un conjunto de IDs de un comunicador existente • Crear un grupo como un subconjunto de un dado grupo • 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 ID’s 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 (rank=0), tenía rank=ranks(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: • Obtener un conjunto de IDs de un comunicador existente • Crear un grupo como un subconjunto de un dado grupo • 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(maxpes=128)dimension iranks(maxpes)include “mpif.h”call 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 = (npes+1)/2do i=0, npes-1, 2 iranks((i+2)/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.MPI_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_rankMPI_Group_translate_ranks 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

More Related