简述

在很多并行计算问题中,最消耗时间的其实是在进程间交互的情况。
所以,如果能降低在进程间的交互速度,那绝对是有帮助的。这就是学MPI派生数据类型的原因。

派生数据类型

  • 非常繁琐… 但是也没办法啦

派生部分的代码和注释

// 创建自定义数据类型// { int[3], double[5], char };// MPI_Aint 存地址MPI_Aint intarr_p, doublearr_p, c_p; int intarr[3]; double doublearr[5];char c;// 获取各个元素之间的相对地址MPI_Get_address(intarr, &intarr_p);MPI_Get_address(doublearr, &doublearr_p);MPI_Get_address(&c, &c_p);  // 注意注意使用指针// 计算偏移值数组MPI_Aint displacement[3] = {0, // 第一个偏移值为0doublearr_p - intarr_p,c_p - intarr_p};// 定义各个部分的类型int types[3] = { MPI_INT, MPI_DOUBLE, MPI_CHAR };// 每个部分的长度int blockLength[3] = { 3, 5, 1 };// 新定义类型MPI_Datatype newtype;MPI_Type_create_struct(3,  // 三个元素 { int[3], double[5], char };blockLength, // 分块长度displacement, // 偏移值types, // 类型&newtype // 类型指针);// 提交新类型MPI_Type_commit(&newtype);

但是再用完之后,记得free掉,会占用空间的

// 释放类型空间
MPI_Type_free(&newtype);

这里,我们在0号进程生成数据,然后发给1号进程。

 // Testif (my_rank == 0) {for (int i = 0; i < 3; ++i) intarr[i] = i + 1;for (int i = 0; i < 5; ++i) doublearr[i] = i * 0.1;c = 'c';MPI_Send(intarr, 1, newtype, 1, 0, MPI_COMM_WORLD);}else {MPI_Recv(intarr, 1, newtype, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);for (int i = 0; i < 3; ++i) cout << intarr[i] << " ";cout << endl;for (int i = 0; i < 5; ++i) cout << doublearr[i] << " ";cout << endl;cout << c << endl;}

效果也确实如我们所预料的那样

PS D:\Code\C++\repo\MPITest\x64\Debug> mpiexec -n 2 ./MPITest.exe
1 2 3
0 0.1 0.2 0.3 0.4
c
PS D:\Code\C++\repo\MPITest\x64\Debug>

完整代码

#include <mpi.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
const int MAX_STRING = 100;#define FUN(x) (x * x)int main(int argc, char **argv) {int comm_sz;int my_rank;MPI_Init(NULL, NULL);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if (comm_sz != 2) return 0;// 创建自定义数据类型// { int[3], double[5], char };// MPI_Aint 存地址MPI_Aint intarr_p, doublearr_p, c_p; int intarr[3]; double doublearr[5];char c;// 获取各个元素之间的相对地址MPI_Get_address(intarr, &intarr_p);MPI_Get_address(doublearr, &doublearr_p);MPI_Get_address(&c, &c_p);  // 注意注意使用指针// 计算偏移值数组MPI_Aint displacement[3] = {0, // 第一个偏移值为0doublearr_p - intarr_p,c_p - intarr_p};// 定义各个部分的类型int types[3] = { MPI_INT, MPI_DOUBLE, MPI_CHAR };// 每个部分的长度int blockLength[3] = { 3, 5, 1 };// 新定义类型MPI_Datatype newtype;MPI_Type_create_struct(3,  // 三个元素 { int[3], double[5], char };blockLength, // 分块长度displacement, // 偏移值types, // 类型&newtype // 类型指针);// 提交新类型MPI_Type_commit(&newtype);// Testif (my_rank == 0) {for (int i = 0; i < 3; ++i) intarr[i] = i + 1;for (int i = 0; i < 5; ++i) doublearr[i] = i * 0.1;c = 'c';MPI_Send(intarr, 1, newtype, 1, 0, MPI_COMM_WORLD);}else {MPI_Recv(intarr, 1, newtype, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);for (int i = 0; i < 3; ++i) cout << intarr[i] << " ";cout << endl;for (int i = 0; i < 5; ++i) cout << doublearr[i] << " ";cout << endl;cout << c << endl;}// 释放类型空间MPI_Type_free(&newtype);MPI_Finalize();
}

MPI派生数据类型发送接收,降低发送时间相关推荐

  1. erp5开源制造业erp短信发送接收机制

    erp5开源制造业erp短信发送接收机制 发送就是直接sendsms,调用运营商的短信发送接口,也可以建立一个定时任务,选择联系人列表批量发送 接收是建立一个定时任务,轮询运营商短信接收接口,将接收的 ...

  2. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

  3. 关于语音发送/接收 方法和装置发明专利正式发布

    北京时间,6月1日,三星电子申请专利:<语音发送方法和装置以及语音接收方法和装置.电子设备>,正式发布! 该专利的发布旨在解决现有技术中,终端发送和接收语音时进行采样率转换的效果较差,无法 ...

  4. 【计算机网络】数据链路层 : 后退 N 帧协议 GBN ( 滑动窗口 | 发送窗口长度 | “发送方“ 累计确认、超时机制 | “接收方“ 按序接收、确认帧发送机制 | 计算示例 )★

    文章目录 一. 滑动窗口协议引入 二. 后退 N 帧协议 ( GBN ) 滑动窗口 三. 后退 N 帧协议 ( GBN ) 运行过程 四. 后退 N 帧协议 ( GBN ) 发送方数据分类 五. 后退 ...

  5. JavaWeb聊天(Redis+环信) 一、发送接收消息、聊天记录拉取

    公司有需求做一个聊天功能. APP端,跟网页端互相聊天 android端直接嵌入了环信提供的DEMO.聊天记录.都是存储在本地自己进行维护. 所以本次只需要维护网页端的聊天记录~还有接收发送的消息就好 ...

  6. TCP性能和发送接收Buffer的关系

    本文希望解析清楚,当我们在代码中写下 socket.setSendBufferSize 和 sysctl 看到的rmem/wmem系统参数以及最终我们在TCP常常谈到的接收发送窗口的关系,以及他们怎样 ...

  7. 单片机IO口模拟串口程序(发送+接收

    单片机IO口模拟串口程序(发送+接收)[转] qcmc 发表于 - 2011-6-23 0:42:00 前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些 ...

  8. akka 消息发送接收_Akka型演员:探索接收器模式

    akka 消息发送接收 在上一篇文章中,我们研究了Akka Typed提供的一些基本功能. 在本文和下一篇文章中,我们将更进一步地了解一些其他功能,并通过查看Akka Typed提供的两种不同模式来做 ...

  9. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

最新文章

  1. 【网络安全】一些webshell免杀的技巧
  2. Akka之在IoT系统中使用Actor(一)
  3. leetcode182. 查找重复的电子邮箱(SQL)
  4. PHP Warning: date() [function.date]解决方案
  5. Cocos Creator -构建打包 所有版本测试
  6. HLSL-高级着色语言简介【转】
  7. 漂亮实用的loading(加载)封装
  8. Jmeter插件监控服务器性能
  9. treeview实例
  10. CSS:淘宝商品展示样式
  11. KVM: Guest CPU doesn’t match specification: missing features: hle,rtm 无法启动虚拟机,解决方法
  12. 中国电信路由器设置虚拟服务器,中国电信天翼宽带无线路由器设置方法
  13. rx590 黑苹果 无货_RX 590显卡在Mojave黑苹果系统中识别为RX 480问题的解决一例。...
  14. 如何做好企业SWOT分析?用这个企业项目设计工具就足够了!
  15. VSCode运行Java报错No delegateCommandHandler for vscode.java.resolveMainMethod
  16. 什么是properties文件
  17. 繁体字转换为中文python
  18. [backtrack教程]从零开始,教你如何破解WEP、WPA无线网络
  19. jQuery 手风琴案例
  20. 社区物联网医院解决方案(智慧医疗)

热门文章

  1. 关键字static、const、volatile的作用
  2. 生态篇-HBase 生态介绍
  3. 阿里云PyODPS 0.7.18发布,针对聚合函数进行优化同时新增对Python 3.7支持
  4. 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
  5. 使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序
  6. android HOME键的监听
  7. ubuntu 设置root启动
  8. 新建Web网站与新建Web应用程序的区别
  9. 严重: Dispatcher initialization failed java.lang.RuntimeException
  10. aspnet_merge.exe”已退出,代码为1的错误的解决方法