▶ 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. <<网络是怎样连接的>>笔记第2章用电信号传输Tcp/ip数据

    创建套接字: 协议栈的内部结构.套接字的实体,以及创建套接字的操作过程 连接服务器: “连接”具体是进行怎样的操作,在这个过程中协议栈到底是如何工作的, 以及客户端和服务器是如何进行交互的. 收发数据 ...

  2. java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor

    这种情况一般是jar包版本问题,pom导入的jar包存在一个2.5.6的,删掉即可.

  3. 个人知识管理系统Version1.0开发记录(09)

    MyBatis初试 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.   运用Mybatis框 ...

  4. 208. Implement Trie (Prefix Tree) -- 键树

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  5. javascript中new Date()会存在偏差一小时的bug

    事件回顾: 因为我们的产品会有与时间转换这部分,并且流量主要集中在小程序. emmm~  获取用户出生的年/月/日/时  我们和后台协商的是换算用户选择后的时间为  年/月/日/时/分/秒  所以我们 ...

  6. jQuery的无new创建方法

    一般我们去写一个框架,会采用什么样的设计呢?比如设计一个jQuery框架,一般我们会创建一个函数对象 function jQuery(params){ //构造函数 }jQuery.prototype ...

  7. GPU Memory Usage占满而GPU-Util却为0的调试

    最近使用github上的一个开源项目训练基于CNN的翻译模型,使用THEANO_FLAGS='floatX=float32,device=gpu2,lib.cnmem=1' python run_nn ...

  8. BZOJ4033: [HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3461  Solved: 1473[Submit][Stat ...

  9. ASP.NET MVC3默认提供了11种ActionResult的实现

      在System.Web.Mvc命名空间 ActionResult ContentResult EmptyResult FileResult HttpStatusCodeResult HttpNot ...

  10. .NET4.0中使用4.5中的 async/await 功能实现异步

    在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...