- Indice de pagina
- 1. Descripción breve
- 2. Sintaxis
- 2.1. En C
- 2.2. En C++
- 3. Parámetros
- 3.1. De entrada
- 3.2. De salida
- 4. Descripción
- 5. Errores
- 6. Véase también
Descripción breve
Recoge una serie de datos de varios procesos en un único proceso raíz (operación en la cual interviene también el propio proceso raíz).
Sintaxis
En C
En C++
#include <mpi.h>
void MPI::Comm::Gather(const void* sendbuf, int sendcount,
const MPI::Datatype& sendtype, void* recvbuf,
int recvcount, const MPI::Datatype& recvtype, int root,
const = 0
Parámetros
De entrada
sendbuf | Dirección inicial del buffer de envío.
|
sendcount | Número de elementos que va a enviar cada proceso individualmente, en general, el número de elementos del buffer de envío (int).
|
sendtype | Tipo de dato de cada elemento del buffer de envío.
|
recvcount | Número de elementos que se espera recibir de cada uno de los procesos (solo el proceso raíz tendrá este parámetro en cuenta) (int). Nótese que este valor es igual que sendcount siempre y cuando los tipos de envío y recepción sean los mismos.
|
recvtype | Tipo de dato que se espera recibir en el buffer de entrada (útil únicamente para el proceso raíz).
|
root | Rango del proceso raíz (el proceso receptor) (int).
|
comm | Comunicador por el que se realiza la transferencia de datos. |
De salida
recvbuf | Dirección inicial del buffer de recepción (útil solamente para el proceso raíz). |
Descripción
MPI_Gather es la operación inversa a MPI_Scatter.
Cada proceso (incluido el proceso raíz) envía el contenido de su buffer de salida al proceso raíz. El proceso raíz recibe los mensajes y los guarda por el orden del rango de cada proceso. El resultado final es que se reune en el proceso raíz el mensaje completo y ordenado.
De forma alternativa, podemos explicarlo como que los n mensajes son concatenados por el orden del rango, resultando en un único mensaje como si se tratara de una operación de recepción normal (MPI_Recv(recvbuf, recvcount* n, recvtype, ...)).
El buffer de recepción es ignorado por todos los procesos excepto por el proceso raíz. Esto implica que, como norma general, únicamente el proceso raíz debería reservar memoria para este.
Todos los argumentos son importantes para el proceso raíz, mientras que para el resto de procesos solo se tiene en cuenta los argumentos sendbuf, sendcount, sendtype, root, comm. El valor de los argumentos root y comm debe ser idéntico en todos los procesos.
Cabe destacar, una vez más, que el argumento recvcount indica la cantidad de elementos que se espera recibir individualmente de cada proceso, no el total de elementos que recibe.
(Pulsar sobre la imagen para ver la animación)
Errores
MPI_SUCCESS | No ha habido error, la función se ha completado satisfactoriamente.
|
MPI_ERR_COMM | Comunicador no válido. Un error común es usar un comunicador nulo.
|
MPI_ERR_COUNT | Valor no válido del argumento count. Debe ser un valor no negativo, a veces se permite un valor cero.
|
MPI_ERR_TYPE | Tipo de dato especificado no válido. Puede ser un tipo de dato (MPI_Datatype) para el que aún no se ha hecho commit (Véase MPI_Type_commit).
|
MPI_ERR_BUFFER | Puntero al buffer no válido. Generalmente sucede cuando se especifica un puntero a null, lo cual no está permitido.
|
MPI_ERR_ROOT | Proceso raíz (root) no válido. El proceso emisor debe ser especificado como un rango (rank) dentro del comunicador por el que se realiza la comunicación. Los rangos deben variar entre cero y el tamaño del comunicador menos uno. |
Véase también
MPI_Scatter