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. Notas
  11. 6. Errores
  12. 7. Véase también

MPI_Pack

Descripción breve

Empaqueta distintos tipos de datos en memoria continua.

Sintaxis

En C

#include <mpi.h>
int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype,
            void *outbuf, int outsize, int *position, MPI_Comm comm)

En C++

#include <mpi.h>
void Datatype::Pack(const void* inbuf, int incount, void *outbuf,
                int outsize, int& position, const Comm &comm) const

Parámetros

De entrada

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.

De salida

position Actual posición del buffer, en bytes.
outbuf Inicio del buffer de salida.

Descripción

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.

Notas

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();
}

Errores

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.

Véase también

MPI_Unpack

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

Valid HTML 4.01 Transitional