▶ MPI 中与数据打包传输有关的几个函数

● 函数 MPI_Pack() 与 MPI_Unpack() 的原型

 MPI_METHOD MPI_Pack(
_In_opt_ const void* inbuf, // 指向待打包数据的指针
_In_range_(>= , ) int incount, // 带打包数据元素个数
_In_ MPI_Datatype datatype, // 数据类型
_mpi_writes_bytes_(outsize) void* outbuf, // 指向打包输出缓冲区的指针
_In_range_(>= , ) int outsize, // 缓冲区大小(单位为 Byte)
_mpi_position_(outsize) int* position, // 输出缓冲区中第一个用于打包的位置(地址偏移量)
_In_ MPI_Comm comm // 通信子
); MPI_METHOD MPI_Unpack(
_mpi_reads_bytes_(insize) const void* inbuf,// 指向待解包缓冲区的指针
_In_range_(>= , ) int insize, // 缓冲区大小(单位为 Byte)
_mpi_position_(insize) int* position, // 输出缓冲区中第一个用于打包的位置(地址偏移量)
_When_(insize > , _Out_opt_) void* outbuf, // 指向解包后数据的指针
_In_range_(>= , ) int outcount, // 解包元素个数
_In_ MPI_Datatype datatype, // 数据类型
_In_ MPI_Comm comm // 通信子
);

● 使用范例

 int main(int argc, char *argv[])
{
int rank, size, i, position;
char c[], buffer[];// 缓冲区大小 110,即 110 Byte MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank); position = ; // position 需要赋值为一个非负数,否则报错(?)
if (rank == ) // 0 号进程打包 1 个整形变量和 1 个字符型数组到同一片内存中,发送给 1 号进程
{
for (i = ; i < ; c[i] = i, i++);
i = ;
MPI_Pack(&i, , MPI_INT, buffer, , &position, MPI_COMM_WORLD);// 打包和解包缓冲区时要注明大小(单位为 Byte)
MPI_Pack(c, , MPI_CHAR, buffer, , &position, MPI_COMM_WORLD);
MPI_Send(buffer, position, MPI_PACKED, , , MPI_COMM_WORLD);
}
if (rank == )
{
MPI_Recv(buffer, , MPI_PACKED, , , MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Unpack(buffer, , &position, &i, , MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(buffer, , &position, c, , MPI_CHAR, MPI_COMM_WORLD);
printf("i=%d, c[0] = %d, c[99] = %d\n", i, (int)c[], (int)c[]);
fflush(stdout);
} MPI_Finalize();
return ;
}

● 输出结果

D:\Code\MPI\MPIProjectTemp\x64\Debug>mpiexec -n  -l MPIProjectTemp.exe
[]i=, c[] = , c[] =

▶ 函数 MPI_Size(),计算打包所需的缓冲区大小。上面的打包和解包过程中使用的是静态内存空间,对于较为复杂的数据类型,可以用 MPI 内建函数来计算需要的空间大小,防止缓冲区不足或者空间浪费。

● 函数原型

 MPI_METHOD MPI_Pack_size(
_In_range_(>= , ) int incount, // 数据数量
_In_ MPI_Datatype datatype, // 数据类型
_In_ MPI_Comm comm, // 通信子
_mpi_out_(size, MPI_UNDEFINED) int *size// 输出所需尺寸(单位为 Byte)
);

● 使用范例

 {
int size,a[];
char *buffer;
MPI_Datatype col;
MPI_Type_vector(, , , MPI_INT, &col);
MPI_Type_commit(&col); // 声明并提交一个数据类型
MPI_Pack_size(, col, MPI_COMM_WORLD, &size); // 计算打包一个这样的类型需要的空间大小
buffer = (char *)malloc((unsigned)size); // 动态声明一个缓冲区用于打包
MPI_Pack(a, , col, buffer, size, &position, MPI_COMM_WORLD);
}

▶ 函数 MPI_Pack_external(),MPI_Unpack_external(),MPI_Pack_external_size(),与上面的打包、解包、求大小函数类似,将需要打包的数据转换成连续的内存空间进行传递

● 函数原型,相比上面的打包、解包、求空间大小的函数,多了数据描述参数,少了通信子参数

 MPI_METHOD MPI_Pack_external(
_In_z_ const char* datarep, // 数据描述,与保存格式有关,不能随意写
_In_opt_ const void* inbuf,
_In_range_(>= , ) int incount,
_In_ MPI_Datatype datatype,
_mpi_writes_bytes_(outsize) void* outbuf,
_In_range_(>= , ) MPI_Aint outsize,
_mpi_position_(outsize) MPI_Aint* position
); MPI_METHOD MPI_Unpack_external(
_In_z_ const char* datarep,
_In_reads_bytes_opt_(insize) const void* inbuf,
_In_range_(>= , ) MPI_Aint insize,
_mpi_position_(insize) MPI_Aint* position,
_When_(insize > , _Out_opt_) void* outbuf,
_In_range_(>= , ) int outcount,
_In_ MPI_Datatype datatype
); MPI_METHOD MPI_Pack_external_size(
_In_z_ const char* datarep,
_In_range_(>= , ) int incount,
_In_ MPI_Datatype datatype,
_Out_ MPI_Aint* size
);

● 使用范例

 {
int comSize, comRank;
MPI_Aint dataSize, position;
double data[];
char *buf; MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &comRank); MPI_Pack_external_size("external32", , MPI_DOUBLE, &dataSize);
buf = (char *)malloc(dataSize); position = ;
if (comRank == )
{
MPI_Pack_external("external32", &data, , MPI_DOUBLE, buf, dataSize, &position);
MPI_Send(buf, position, MPI_PACKED, , , MPI_COMM_WORLD);
}
else
{
MPI_Recv(buf, dataSize, MPI_PACKED, , , MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Unpack_external("external32", buf, dataSize, &position, &data, , MPI_DOUBLE);
}
MPI_Finalize();
return ;
}

MPI 打包与解包函数 MPI_Pack(),MPI_Unpack()的更多相关文章

  1. lambda表达式,filter,map,reduce,curry,打包与解包和

    当然是函数式那一套黑魔法啦,且听我细细道来. lambda表达式 也就是匿名函数. 用法:lambda 参数列表 : 返回值 例: +1函数 f=lambda x:x+1 max函数(条件语句的写法如 ...

  2. struct:二进制数据结构的打包与解包

    介绍 struct模块包括一些函数,这些函数可以完成字节串与原生Python数据类型(如数字和字符串)之间的转换 函数与Struct类 struct提供了一组处理结构值的模块级函数,另外还有一个Str ...

  3. Lua学习教程之 可变參数数据打包与解包

    利用table的pack与unpack进行数据打包与解包.測试代码例如以下: print("Test table.pack()----------------"); functio ...

  4. web socket RFC6455 frame 打包、解包

    #ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...

  5. dpkg打包与解包

    1.打包 dpkg -b 2.解包 2.1 dpkg -X 解出包内容 2.2 dpkg -e 输出包控制信息

  6. CentOS7 tar打包工具 打包,解包,打包压缩,打包解压缩

    tar命令 選項與參數: -c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename) -t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了: -x :解打包或解壓縮的 ...

  7. SummerVocation_Learning--java的自动打包与解包

    Auto Boxing: 自动将基础类型转换成对象(JDK1.5之后支持) Auto UnBoxing:自动将对象转换成基础类型 如 Map中的put方法,如果要传入键值对<a,1>,&l ...

  8. Linux下文件打包与解包

    打包(.tar):  tar -cvf Pro.tar /home/lin/Pro   #将/home/lin/Pro文件夹下的所有文件打包成Pro.tar 打解包(.tar.gz)  tar -cv ...

  9. linux下的打包与解包的简单总结

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...

随机推荐

  1. Java IO流-随机访问流

    2017-11-05 19:45:51 RandomAccessFile类(随机访问流) RandomAccessFile类:是Object的子类,此类的实例支持对随机访问文件的读取和写入.随机访问文 ...

  2. PHP如何生成文章预览图

    PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...

  3. 使用Zend studio+WAMP来调试Wordpress后台的PHP程序的一些非常关键的信息(原创)

    一.Zend studio代码格式化快捷键:选中代码,Ctrl+Shift+F( 注意,在英文输入发状态下使用!) .Zend studio实用快捷键 :http://www.zendstudio.n ...

  4. 最短路径求解(Dijkstra)

    Dijkstra算法分析 题目分析参照<数据结构>(严蔚敏)7-6节 最短路径问题描述 参照日常生活中的公交查询系统.我们有选项: 少换乘/最少站数 价格最少/时间最短.... (ps:下 ...

  5. CentOS下安装docker,docker-compose

    1.查看系统发行版本: lsb_release -a 2.安装docker:Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行 ...

  6. Unsupported major.minor version 51.0解决办法(转)

    我使用的是Eclipse-jee-indigo + JDK 1.6.23环境,结果使用时出现Unsupported major.minor version 51.0错误提示,下面我来介绍Unsuppo ...

  7. Day41 openstack基础

    参考博客: http://www.cnblogs.com/linhaifeng/p/6264636.html

  8. prim和kruskal比较

    推荐:http://squirrelrao.iteye.com/blog/1044867  http://www.cnblogs.com/xwdreamer/archive/2011/06/16/22 ...

  9. Windows 7 IIS7.5上部署MVC实例

    这段时间在用MVC写一个导游网站,在Window7上部署的时候,遇到和处理了一些问题. 现将完整的过程整理出来,供大家参考: 一.部署准备: 1.安装Microsoft .net FrameWork ...

  10. vue.js中引入图片

    vue中引入图片 前言:vue中引入图片时,会显示不出来,除非在css中引入.而在template中或者js动态引入时,会显示不出图片. 解决一 图片通过后端返回引入网络图片路径即可. <div ...