Compartir a través de


MPI_Alltoallw función

Recopila datos de y dispersos a todos los miembros de un grupo. La función MPI_Alltoallw es la forma más general de intercambio de datos completo en esta API. MPI_Alltoallw habilita una especificación independiente del recuento, el desplazamiento y el tipo de datos.

Sintaxis

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        MPI_Comm     comm
);

Parámetros

  • sendbuf [in]
    Puntero a los datos que se van a enviar a todos los procesos del grupo. El número y el tipo de datos de los elementos del búfer se especifican en los parámetros sendcount y sendtype . Cada elemento del búfer corresponde a un proceso del grupo.

    Si el parámetro comm hace referencia a un intracomunicador, puede especificar una opción local especificando MPI_IN_PLACE en todos los procesos. Se omiten los parámetros sendcount, sdispls y sendtype . Cada proceso escribe datos en el elemento de búfer de recepción correspondiente.

    Los datos que se envían y reciben deben tener la misma asignación de tipos, especificada por la matriz recvcounts y el parámetro recvtype , y se leen desde las ubicaciones del búfer de recepción según lo especificado por el parámetro rdispls .

  • sendcounts [in]
    Número de elementos de datos que este proceso envía en el búfer tal y como se especifica en el parámetro sendbuf . Si un elemento de sendcount es cero, la parte de datos del mensaje de ese proceso está vacía.

  • sdispls [in]
    La ubicación, en bytes, relativa al parámetro sendbuf , de los datos de cada proceso de comunicador.

    Entry j especifica el desplazamiento relativo al parámetro sendbuf del que se van a tomar los datos salientes destinados al proceso j.

  • sendtypes [in]
    Tipo de datos para cada uno de los elementos del búfer de envío. Entry j especifica el tipo de datos que se envían para procesar j en el grupo.

  • recvbuf [out]
    Puntero a un búfer que contiene los datos que se reciben de cada proceso. El número y el tipo de datos de los elementos del búfer se especifican en los parámetros recvcount y recvtype .

  • recvcounts [in]
    Número de elementos de datos de cada proceso de comunicador en el búfer de recepción.

  • rdispls [in]
    La ubicación, en bytes, relativa al parámetro recvbuf , de los datos de cada proceso del comunicador. Entry i especifica el desplazamiento relativo al parámetro recvbuf en el que se colocan los datos entrantes del proceso i.

    En las matrices de parámetrosrecvbuf, recvcounts y rdispls, el elemento de cada matriz hace referencia a los datos recibidos del proceso de comunicador n.

  • recvtypes [in]
    Tipo de datos de cada elemento del búfer. Entry i especifica el tipo de datos recibidos del proceso i.

  • comm
    Identificador del comunicador MPI_Comm.

Valor devuelto

Devuelve MPI_SUCCESS si se realiza correctamente. De lo contrario, el valor devuelto es un código de error.

En Fortran, el valor devuelto se almacena en el parámetro IERROR .

Fortran

    MPI_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

Comentarios

Importante

Para permitir la máxima flexibilidad, el desplazamiento de bloques dentro de los búferes de envío y recepción se especifica en bytes. 

Todos los parámetros son significativos en todos los procesos. El parámetro comm debe ser idéntico en todos los procesos.

Si el parámetro comm hace referencia a un intracomunicador, el bloque jque se envía desde el proceso i se recibe mediante process j y se coloca en el bloque idel búfer de recepción. Estos bloques no tienen que tener el mismo tamaño.

La firma de tipo especificada por los parámetros sendcounts[j] y sendtypes[j] para process i debe ser igual a la firma de tipo asociada a recvcounts[i] y recvtypes[i] en process j. Por lo tanto, la cantidad de datos enviados debe ser igual a la cantidad de datos que se reciben entre cualquier par de procesos. Se siguen permitiendo asignaciones de tipos distintos entre remitente y receptor.

El resultado de una llamada a la función MPI_Alltoallw es como si cada proceso enviara un mensaje a cada otro proceso con MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)y recibiera un mensaje de cada otro proceso con una llamada a MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...).

Si se especifica la opción local, se indica que se envía y recibe la misma cantidad y tipo de datos entre dos procesos en el grupo del comunicador. Diferentes pares de procesos pueden intercambiar diferentes cantidades de datos. Los usuarios deben asegurarse de que recvcounts[j] y recvtype en el proceso i match recvcounts[i] y recvtype en el proceso j.

Si el parámetro comm hace referencia a un intercomunicador, el resultado es como si cada proceso del grupo A envía un mensaje a cada proceso del grupo B y viceversa. El búfer de envío jdel proceso i del grupo A debe ser coherente con el búfer de recepción idel proceso j en el grupo B, y viceversa.

Requisitos

Producto

Paquete redistribuible DE HPC Pack 2012 MS-MPI, HPC Pack 2008 R2 MS-MPI Redistributable Package, HPC Pack 2008 MS-MPI Redistributable Package o HPC Pack 2008 Client Utilities

Encabezado

Mpi.h; Mpif.h

Biblioteca

Msmpi.lib

Archivo DLL

Msmpi.dll

Consulte también

Funciones colectivas de MPI

MPI_Datatype

MPI_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv