Compartir a través de


función MPI_Gatherv

Recopila datos de variables de todos los miembros de un grupo a un miembro. La función MPI_Gatherv agrega flexibilidad a la función MPI_Gather permitiendo un recuento variable de datos de cada proceso.

Sintaxis

int MPIAPI MPI_Gatherv(
  _In_      void         *sendbuf,
            int          sendcount,
            MPI_Datatype sendtype,
  _Out_opt_ void         *recvbuf,
  _In_opt_  int          *recvcounts[],
  _In_opt_  int          *displs[],
            MPI_Datatype recvtype,
            int          root,
            MPI_Comm     comm
);

Parámetros

  • sendbuf [in]
    Identificador de un búfer que contiene los datos que se van a enviar al proceso raíz.

    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 y sendtype . Cada proceso escribe datos en el elemento de búfer de recepción correspondiente. El proceso envía datos al elemento del búfer de recepción. Se supone que los datos enviados por el proceso raíz están en el lugar correcto en el búfer de recepción.

  • sendcount
    Número de elementos del búfer de envío. Si sendcount es cero, la parte de datos del mensaje está vacía.

  • sendtype
    Tipo de datos de cada elemento del búfer.

  • recvbuf [out, optional]
    Identificador de un búfer en el proceso raíz que contiene los datos recibidos de cada proceso, incluidos los datos enviados por el proceso raíz. Este parámetro solo es significativo en el proceso raíz. El parámetro recvbuf se omite para todos los procesos no raíz.

  • recvcounts[] [in, optional]
    Número de elementos recibidos de cada proceso. Cada elemento de la matriz corresponde a la clasificación del proceso de envío. Si el recuento es cero, la parte de datos del mensaje está vacía. Este parámetro solo es significativo en el proceso raíz.

  • displs[] [ in, optional]
    Ubicación, relativa al parámetro recvbuf , de los datos de cada proceso del comunicador. Los datos recibidos del proceso j se colocan en el búfer de recepción de los elementos de desplazamiento del proceso raíz displs[j] del puntero sendbuf .

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

    Este parámetro solo es significativo en el proceso raíz.

  • recvtype
    Tipo de datos de cada elemento del búfer. Este parámetro solo es significativo en el proceso raíz.

  • root
    Rango del proceso receptor dentro del comunicador especificado.

  • 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_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
        <type> SENDBUF(*), RECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR

Comentarios

Todos los parámetros de función son significativos en el proceso raíz, solo los parámetros sendbuf, sendcount, sendtype, root y comm son significativos en los demás procesos. Los parámetros raíz y comm deben ser idénticos en todos los procesos.

Por lo general, los tipos de datos derivados se permiten para los parámetros sendtype y recvtype . La firma de tipo especificada por los parámetros sendtype y recvtype en cada proceso debe ser igual a la firma de tipo de los parámetros recvcount y sendcount en el proceso raíz. La cantidad de datos que se envían debe ser igual a la cantidad de datos que se reciben entre el proceso raíz y cada proceso individual. Todavía se permiten asignaciones de tipos distintas entre remitente y receptor.

La especificación de recuentos y tipos no debe hacer que ninguna ubicación de la raíz se escriba más de una vez. Esta llamada es errónea.

Si el parámetro comm hace referencia a un intracomunicador, todos los procesos envían el contenido de su búfer de envío al proceso raíz. El proceso raíz recibe los mensajes y los almacena en orden de clasificación. El resultado es como si cada uno de los n procesos del grupo que se ejecutan una llamada a MPI_Send(sendbuf, sendcount, sendtype, root, …); y la raíz había ejecutado n llamadas a MPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …). El valor de extent(recvtype) se obtiene mediante la función MPI_Type_get_extent . Una descripción alternativa de la función es que los n mensajes enviados por los procesos del grupo se concatenan en orden de clasificación y el mensaje resultante se recibe mediante la raíz como si fuera una llamada a MPI_RECV(recvbuf, recvcountn, recvtype, ...). El búfer de recepción se omite para todos los procesos no raíz.

Si el parámetro comm hace referencia a un intercomunicador, la llamada implica todos los procesos del intercomunicador, pero con un grupo, grupo A, que define el proceso raíz. Todos los procesos del otro grupo, grupo B, establecen el mismo valor en el parámetro raíz , es decir, la clasificación del proceso raíz del grupo A. El proceso raíz establece el valor MPI_ROOT en el parámetro raíz . Todos los demás procesos del grupo A establecen el valor MPI_PROC_NULL en el parámetro raíz . Los datos se transmiten desde el proceso raíz a todos los procesos del grupo B. Los parámetros de búfer de los procesos del grupo B deben ser coherentes con el parámetro de búfer del proceso raíz.

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_Gather