Dada un paquete de memoria continua saca los tipos de datos.
#include <mpi.h> int MPI_Unpack(void *inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm)
#include <mpi.h> void Datatype::Unpack(const void* inbuf, int insize, void *outbuf, int outcount, int& position, const Comm& comm) const
inbuf | Inicio del buffer de entrada. |
outcount | Numero de elementos de datos de salida. |
datatype | Tipo de dato de cada elemento de datos de salida. |
insize | Tamaño del buffer de entrada, en bytes. |
comm | Comunicador para el mensaje empaquetado. |
position | Posición actual del buffer, en bytes. |
position | Posición actual del buffer, en bytes. |
outbuf | Inicio del buffer de salida. |
Proceso contrario de MPI_Pack.
Un sencillo ejemplo del uso de MPI_Unpack con su opuesto MPI_Pack 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. |