Empaqueta distintos tipos de datos en memoria continua.
#include <mpi.h> int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outsize, int *position, MPI_Comm comm)
#include <mpi.h> void Datatype::Pack(const void* inbuf, int incount, void *outbuf, int outsize, int& position, const Comm &comm) const
inbuf | Inicio del buffer de entrada. |
incount | Numero de datos de entrada. |
datatype | Tipo de dato de los datos de entrada. |
outsize | Tamaño del buffer de salida, en bytes. |
comm | Comunicador para el mensaje empaquetado. |
position | Actual posición del buffer, en bytes. |
position | Actual posición del buffer, en bytes. |
outbuf | Inicio del buffer de salida. |
Para formar un paquete se tiene un buffer de entrada (inbuf), el tipo de datos que contiene (datatype), el numero de datos dentro del buffer, otro buffer de salida (outsize) con gran capacidad para todos los datos(outsize), indicador de posición ocupada dentro del buffer de salida (position), y el comunicador por donde se transmitirá el paquete.
El parámetro "position" incrementa de tamaño con cada llamada.
Un sencillo ejemplo del uso de MPI_Pack con su opuesto MPI_Unpack es:
#define TAM_BUFFER 100 #define TAG 0 #define DEST 1 #define SOURCE 0 main(int argc, char* argv[]) { int my_rank; char buffer[TAM_BUFFER]; int posicion; MPI_Status status; float a, b; int n; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); if ( rank == SOURCE ) { a = 10.3; b = 11.2 n = 4; posicion = 0; MPI_Pack(&a,1,MPI_FLOAT,buffer,TAM_BUFFER,&posicion,MPI_COMM_WORLD); MPI_Pack(&b,1,MPI_FLOAT,buffer,TAM_BUFFER,&posicion,MPI_COMM_WORLD); MPI_Pack(&n,1,MPI_INT,buffer,TAM_BUFFER,&posicion,MPI_COMM_WORLD); MPI_Send(buffer,TAM_BUFFER,MPI_PACKED,DEST,TAG,MPI_COMM_WORLD); } else { MPI_Recv(buffer,TAM_BUFFER,MPI_PACKED,SOURCE,TAG,MPI_COMM_WORLD,&status); posicion = 0; MPI_Unpack(buffer,TAM_BUFFER,&posicion,&a,1,MPI_FLOAT,MPI_COMM_WORLD); printf(" a = %f\n",a); MPI_Unpack(buffer,TAM_BUFFER,&posicion,&b,1,MPI_FLOAT,MPI_COMM_WORLD); printf(" b = %f\n",b); MPI_Unpack(buffer,TAM_BUFFER,&posicion,&n,1,MPI_INT,MPI_COMM_WORLD); printf(" n = %d\n",n); } MPI_Finalize(); }
MPI_SUCCESS | No ha habido error, la función se ha completado satisfactoriamente. |
MPI_ERR_COMM | El comunicador seleccionado no es válido. Un error común es usar un comunicador nulo. |
MPI_ERR_COUNT | Valor de count no válido. El argumento count debe ser un valor no negativo, es posible utilizar el valor cero. |
MPI_ERR_TYPE | Argumento datatype no válido. Puede ocurrir cuando no se hace commit del tipo de dato (Véase MPI_Type_commit). |
MPI_ERR_ARG | Valor de argumento no válido. |