1. Indice de pagina
  2. 1. Descripción breve
  3. 2. Sintaxis
  4. 2.1. En C
  5. 2.2. En C++
  6. 3. Parámetros
  7. 3.1. De entrada
  8. 3.2. De salida
  9. 4. Descripción
  10. 5. Errores
  11. 6. Véase también

MPI_Gather

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

#include <mpi.h>
int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
	void *recvbuf, int recvcount, MPI_Datatype recvtype, int root,
	MPI_Comm comm)

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.

Imagen MPI_Gather (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

Creado por: Daniel Guerrero Martínez y Sergio Rodríguez Lumley 2010

Valid HTML 4.01 Transitional