MPI 打包与解包函数 MPI_Pack(),MPI_Unpack()
▶ 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()的更多相关文章
- lambda表达式,filter,map,reduce,curry,打包与解包和
当然是函数式那一套黑魔法啦,且听我细细道来. lambda表达式 也就是匿名函数. 用法:lambda 参数列表 : 返回值 例: +1函数 f=lambda x:x+1 max函数(条件语句的写法如 ...
- struct:二进制数据结构的打包与解包
介绍 struct模块包括一些函数,这些函数可以完成字节串与原生Python数据类型(如数字和字符串)之间的转换 函数与Struct类 struct提供了一组处理结构值的模块级函数,另外还有一个Str ...
- Lua学习教程之 可变參数数据打包与解包
利用table的pack与unpack进行数据打包与解包.測试代码例如以下: print("Test table.pack()----------------"); functio ...
- web socket RFC6455 frame 打包、解包
#ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" ...
- dpkg打包与解包
1.打包 dpkg -b 2.解包 2.1 dpkg -X 解出包内容 2.2 dpkg -e 输出包控制信息
- CentOS7 tar打包工具 打包,解包,打包压缩,打包解压缩
tar命令 選項與參數: -c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename) -t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了: -x :解打包或解壓縮的 ...
- SummerVocation_Learning--java的自动打包与解包
Auto Boxing: 自动将基础类型转换成对象(JDK1.5之后支持) Auto UnBoxing:自动将对象转换成基础类型 如 Map中的put方法,如果要传入键值对<a,1>,&l ...
- Linux下文件打包与解包
打包(.tar): tar -cvf Pro.tar /home/lin/Pro #将/home/lin/Pro文件夹下的所有文件打包成Pro.tar 打解包(.tar.gz) tar -cv ...
- linux下的打包与解包的简单总结
.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...
随机推荐
- Java IO流-随机访问流
2017-11-05 19:45:51 RandomAccessFile类(随机访问流) RandomAccessFile类:是Object的子类,此类的实例支持对随机访问文件的读取和写入.随机访问文 ...
- PHP如何生成文章预览图
PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...
- 使用Zend studio+WAMP来调试Wordpress后台的PHP程序的一些非常关键的信息(原创)
一.Zend studio代码格式化快捷键:选中代码,Ctrl+Shift+F( 注意,在英文输入发状态下使用!) .Zend studio实用快捷键 :http://www.zendstudio.n ...
- 最短路径求解(Dijkstra)
Dijkstra算法分析 题目分析参照<数据结构>(严蔚敏)7-6节 最短路径问题描述 参照日常生活中的公交查询系统.我们有选项: 少换乘/最少站数 价格最少/时间最短.... (ps:下 ...
- CentOS下安装docker,docker-compose
1.查看系统发行版本: lsb_release -a 2.安装docker:Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行 ...
- Unsupported major.minor version 51.0解决办法(转)
我使用的是Eclipse-jee-indigo + JDK 1.6.23环境,结果使用时出现Unsupported major.minor version 51.0错误提示,下面我来介绍Unsuppo ...
- Day41 openstack基础
参考博客: http://www.cnblogs.com/linhaifeng/p/6264636.html
- prim和kruskal比较
推荐:http://squirrelrao.iteye.com/blog/1044867 http://www.cnblogs.com/xwdreamer/archive/2011/06/16/22 ...
- Windows 7 IIS7.5上部署MVC实例
这段时间在用MVC写一个导游网站,在Window7上部署的时候,遇到和处理了一些问题. 现将完整的过程整理出来,供大家参考: 一.部署准备: 1.安装Microsoft .net FrameWork ...
- vue.js中引入图片
vue中引入图片 前言:vue中引入图片时,会显示不出来,除非在css中引入.而在template中或者js动态引入时,会显示不出图片. 解决一 图片通过后端返回引入网络图片路径即可. <div ...