MPI 自定义通用结构和传输

这些天写了一个MPI程序,却总是出错,在百度和谷歌上也找不到对出错结果的解释,烦恼之极。后来想了一个笨办法,依次在每一个Send()和Recv()语句之后加上MPI_Abort()语句,逐次运行查看,终于发现错误所在。原来是自定义的结构体传输发生错误。找了一份正确的代码,学习之后写了一个试验程序,运行成功。

试验程序张贴如下:

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
void main(int argc,char *argv[])
{
 int size,rank;
 MPI_Status status;
 struct var {
  int i,n,size,rank;
  float mytmp,ml,mr,mlen,l,len;
 } ;
 struct var b;
 //下面构建一个自定义变量,利用MPI函数构建,若用C语言的结构体
 //则在Send和Recv是不能识别数据类型
 MPI_Datatype myvar;
 MPI_Datatype old_types[2];
 MPI_Aint indices[2]; 
 //指定每个块中的变量个数,这里只有2个块,其中包含4个MPI_INT,6个MPI_FLOAT
 int blocklens[2];
 MPI_Init(&argc,&argv);
 blocklens[0]=4;
 blocklens[1]=6;
 //指定原来旧的数据类型
 old_types[0]=MPI_INT;
 old_types[1]=MPI_FLOAT;  
 //指定每个块中变量的偏移量,需要依靠一个结构体的实例,这里是b。
 MPI_Address(&b,&indices[0]);
 MPI_Address(&b.mytmp,&indices[1]);
 indices[1] -= indices[0];
 indices[0]=0;
 //看来indices[0]也可以一开始就应当赋值为0

//创建新数据于var之中
 MPI_Type_struct(2,blocklens,indices,old_types,&myvar);
 //注册新数据
 MPI_Type_commit(&myvar);

MPI_Comm_size(MPI_COMM_WORLD,&size);
 MPI_Comm_rank(MPI_COMM_WORLD,&rank);

if(rank == 0)
 {
  struct var a={0};
  a.i=100;
  fprintf(stdout,"before sending the value i is %d\n",a.i);
  fflush(stdout);
  MPI_Send(&a,1,myvar,1,1,MPI_COMM_WORLD);
  fprintf(stdout,"after sending the value i is %d\n",a.i);
  fflush(stdout);
 }
 else if(rank == 1)
 { struct var t={0};
  fprintf(stdout,"before receiving the value i is %d\n",t.i);
  fflush(stdout);
  MPI_Recv(&t,1,myvar,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
  fprintf(stdout,"after receiving the value i is %d\n",t.i);
  fflush(stdout);
 }

MPI_Finalize();
}

需要加强的还有对于自定义数据的偏移量进行理解。若在程序中适当位置加入如下语句:

printf("the value of indices[1] is %d\n",indices[1]); 则输出结果为16,看来是4个int的长度。

MPI 自定义通用结构和传输相关推荐

  1. 文件上传控件 css,CSS3 自定义文件上传输入控件界面

    CSS 语言: CSSSCSS 确定 body{background: white;} .wrap { max-width: 60%; margin: 50px auto; } .file { pos ...

  2. linux主机ftp传输文件效率,FTP和TCP的文件传输效率对比测试分析

    前言 最近因项目需要,需要把一定数量的中等文件从开发板上传到电脑上,分别选择了FTP和TCP自定义协议两种方式进行传输,进行了简单的对比测试,故做如下记录. 测试环境 开发板:Linux,ARMv7 ...

  3. 【转】解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接...

    开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决 ...

  4. gRPC传输协议使用(python教程)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Gola ...

  5. python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验

    https://www.cnblogs.com/zaizai1573/p/10230973.html 一.TCP协议 粘包现象 和解决方案 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令 ...

  6. STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。

    是自定协议,用到一个bulk in ep1, 一个bulk out ep2 端点 用虚拟串口的优点显而易见,上位机的编写非常方便,就按照常规的串口功能编写就可以了,而速度确还是usb的速度  USB要 ...

  7. 华为设备二层协议透明传输命令

    华为设备二层协议透明传输命令 [Huawei]l2protocol-tunnel user-defined-protocol 1 protocol-mac --* encap-type etherne ...

  8. 企业远程文件传输工具

    利用远程文件传输的强大功能在全球计算机之间发送和接收文件或文件夹.从可执行文件到根证书,无需借助外部设备即可安全地共享任何格式的文件.文件共享可以通过两种方式完成:查看器到远程设备,反之亦然.Remo ...

  9. 浅谈HTTP FTP和P2P网络大文件传输的优劣势

    随着各种行业和硬件设备的发展,大文件越来越多,比如在媒体行业为了保证图片和视频的清晰,和以前的相比,都比较大,尤其是出版社等行业.确保文件能快速的传输,现在很多企业还是使用的硬盘邮寄的方式.如果使用网 ...

最新文章

  1. 用c语言循环语句,C语言中循环语句有哪些具体怎么用
  2. QDir::toNativeSeparators的使用
  3. ASP.NET中移除全部缓存
  4. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
  5. Python动态类和动态方法的创建和调用
  6. Microsoft Dynamics CRM server 2013 一般销售流程之 报价单功能详解
  7. python输出出现频率最高的字母_用Python实现搜索某一网页中出现频率最高的前N个英文单词 输入: 网址,N值 输出:按出现频率由高到低排...
  8. 35岁前把下面十件事做好
  9. 协议簇:TCP 解析: Sequence Number
  10. java反射 set_Java反射
  11. 设计模式之——策略(Strategy)模式
  12. Dicom修改图像内容重新生成dcm文件
  13. 电压跟随器的作用及特点
  14. android基础教程:多个页面时如何设置首页
  15. 【ThinkPHP】后台数组,赋值到前台模板HTML文件中的JS的变量,且以JSON对象形式存放
  16. 如何用 Node.js 实现一个简单的 Websocket 服务?
  17. 国家互联网信息办公室公布《互联网新闻信息服务单位内容管理从业人员管理办法》【软件网每日新闻播报│第10-31期】
  18. 外网如何连接学校服务器
  19. 20种让你更高效的科学学习方法
  20. MacOS Ventura 13.0 (22A380) 正式版带 OC 0.8.5 and winPE 双分区原版黑苹果镜像

热门文章

  1. 16进制在c语言中用来做什么,十六进制在代码中有什么用
  2. flutter 刷脸_支付宝刷脸认证 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. c语言 bcd码 16进制字符串 原理,ASCII码、HEX、字符、BCD 等等 基础知识思考
  4. java中factory_Java后台面试--Spring中FactoryBean与BeanFactory的使用及区别
  5. 和push的区别_RocketMQ的消息订阅push和pull的区别
  6. 【NOI2004】【洛谷P1486】郁闷的出纳员(Splay写法)
  7. vue-router组件重用 路由切换时的问题
  8. JVM笔记(一)数字在JVM中的表示
  9. Java Servlet的配置文件web.xml配置内容和具体含义
  10. Meteor 加入账户系统