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是打包,不是压缩!) ---------------------- ...
随机推荐
- PrestaShop 1.7 订单生成后下载服务器出现 505 的错误
PrestaShop 生成订单后下载,服务器上有 505 的错误. 经查看应该是服务器上的错误: Allowed memory size of 134217728 bytes exhausted (t ...
- IOS-适配iOS10以及Xcode8
现在在苹果的官网上,我们已经可以下载到Xcode8的GM版本了,加上9.14日凌晨,苹果就要正式推出iOS10系统的推送了,在此之际,iOS10的适配已经迫在眉睫啦,不知道Xcode8 beat版本, ...
- Holt-Winters模型原理分析
Holt-Winters模型原理分析及代码实现(python) from:https://blog.csdn.net/u010665216/article/details/78051192 引言 最近 ...
- 获取div的高度
1.获取div的文档总高度(必须DOM操作): var scrollHeight=document.getElementById("inner").scrollHeight; // ...
- IAR使用notice
1.IAR中无法程序跳转问题 在工程的C编译器选项里的预编译添加$TOOLKIT_DIR$\inc解决,需要clean一下工程再make即可.($TOOLKIT_DIR$:这个语法表示包含文件的路径在 ...
- 054——VUE中vue-router之实例讲解定义一下单页面路由
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Sizzle源码分析:三 筛选和编译
好了有了之前的词法分析过程,现在我们来到select函数来,这个函数的整体流程,前面也大概说过: 1. 先做词法分析获得token列表 2. 如果有种子集合直接到编译过程 3. 如果没有种子集合并且是 ...
- ISE创建Microblaze软核(一)
在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...
- 16款最受关注的智能手表 苹果iWatch领衔
智能手表逐渐成为科技行业的新宠,而传闻中的苹果iWatch以及已经确认即将推出的三星Galaxy Gear,显然让这股热潮达到了顶峰,也预示着大牌厂商将逐渐进入该领域,推出更多成熟的产品.以下便是16 ...
- Centos安装Chrome浏览器失败解决办法
最近因为项目需要使用到Centos,自己经常使用Chrome,所有的书签以及信息都是同步在Google,所以尝试在Centos上安装Chrome,按照网上的资料都是安装失败,显示缺少资源,不过最终还是 ...