MPI_PACK(inbuf, incount, datatype, outbuf, outcount, position, comm )
IN inbuf 输入缓冲区起始地址(可选数据类型)
IN incount 输入数据项个数(整型)
IN datatype 每个输入数据项的类型(句柄)
OUT outbuf 输出缓冲区开始地址(可选数据类型)
IN outcount 输出缓冲区大小(整型)
INOUT position 缓冲区当前位置(整型)
IN comm 通信域(句柄)
int MPI_Pack(void* inbuf, int incount, MPI_datatype, void *outbuf, int outcount, int
*position, MPI_Comm comm)
MPI_PACK(INBUF,INCOUNT,DATATYPE,OUTBUF,OUTCOUNT,POSITION,COMM,
IERROR)
INBUF(*),OUTBUF(*)
INTEGER INCOUNT,DATATYPE,OUTCOUNT,POSITION,COMM,IERROR

打包(Pack)和解包(Unpack)操作是为了发送不连续的数据,在发送前显式地把数据包装到一个连续的缓冲区,在接收之后从连续缓冲区中解包。
MPI_PACK把由inbuf,incount,datatype指定的发送缓冲区中的inbount个datatype类型的消息放到起始为outbuf的连续空间,该空间共有outcount个字节。输入缓冲区可以是MPI_SEND允许的任何通信缓冲区。入口参数position的值是输出缓冲区中用于打包的起始地址,打包后它的值根据打包消息的大小来增加,出口参数position的值是被打包的消息占用的输出缓冲区后面的第一个地址。通过连续几次对不同位置的消息调用打包操作,就将不连续的消息放到了一个连续的空间。comm参数是将在后面用于发送打包的消息时用的通信域。

MPI_UNPACK(inbuf, insize, position, outbuf, outcount, datatype, comm )
IN inbuf 输入缓冲区起始(选择)
IN insize 输入数据项数目(整型)
INOUT position 缓冲区当前位置, 字节(整型)
OUT outbuf 输出缓冲区开始(选择)
IN outcount 输出缓冲区大小, 字节(整型)
IN datatype 每个输入数据项的类型(句柄)
IN comm 打包的消息的通信域(句柄)
int MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, int
outcount, MPI_Datatype datatype, MPI_Comm comm)
MPI_UNPACK(INBUF,INSIZE, POSITION,OUTBUF,OUTCOUNT, DATATYPE,
COMM, IERROR)
INBUF(*),OUTBUF(*)
INTEGER INSIZE, POSITION,OUTCOUNT, , DATATYPE COMM,IERROR

MPI_UNPACK和MPI_PACK对应,它从inbuf和insize指定的缓冲区空间将不连续的消息解开,放到outbuf,outcount,datatype指定的缓冲区中。输出缓冲区可以是MPI_RECV允许的任何通信缓冲区。输入缓冲区是一个连续的存储空间,大小为insize字节,开始地址为inbuf。入口参数position的初始值是输出缓冲区中被打包消息占用的起始地址,解包后它的值根据打包消息的大小来增加,因此出口参数position的值是输出缓冲区中被解包的消息占用空间后面的第一个地址。通过连续几次对已打包的消息调用与打包时相应的解包操作,就可以将连续的消息解开放到一个不连续的空间。comm参数是用于接收消息的通信域。
注意MPI_RECV和MPI_UNPACK的区别: 在MPI_RECV中,count参数指明的是可以接收的最大项数。实际接收的项数是由接收的消息的长度来决定的。在MPI_UNPACK中,count参数指明实际打包的项数,相应消息的大小是参数position的增加值。

MPI_PACK_SIZE( incount, datatype, comm, size )
IN incount 指定数据类型的个数(整型)
IN datatype 数据类型(句柄)
IN comm 通信域(句柄)
OUT size 以字节为单位,incount个datatype数据类型需要的空间(整型)
int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size)
MPI_PACK_SIZE(INCOUNT,DATATYPE,COMM,SIZE,IERROR)
INTEGER INCOUNT,DATATYPE,COMM,SIZE,IERROR

MPI_PACK_SIZE调用的返回值是size,表示incount个datatype数据类型需要的空间的大小。该调用返回的是上界,而不是一个精确界,这是因为包装一个消息所需要的精确空间可能依赖于上下文(例如,第一个打包单元中包装的消息可能占用相对更多的空间)。

下面的例子将两个不同的整型数打包后一次以MPI_PACKED类型发送,而接收进程以整数类型MPI_INT接收到一个包含两个整数的数组中。

int position , i,j,a[2];
char buff[1000];
...
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
if (myrank ==0) { /* 进程0发送消息*/
position =0;/*打包的起始位置*/
MPI_Pack(&i,1,MPI_INT,buff,1000,&position, MPI_COMM_WORLD);
/*将整数i打包*/
MPI_Pack(&j,1,MPI_INT,buff,1000,&position, MPI_COMM_WORLD);
/*将整数j打包*/
MPI_Send(buff,position, MPI_PACKED,1,0,MPI_COMM_WORLD); }
/*将打包后的数据发送出去*/
else if(myrank==1) {
/* 进程1接收消息 */
MPI_Recv(a,2, MPI_INT,0,0,MPI_COMM_WORLD)/*以整型从进程0接收消息*/
}