MPI 自定义通用结构和传输

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的长度。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MPI需要支持自定义数据结构,因为MPI的通信操作是基于数据类型的,MPI中定义的数据类型不一定能满足用户的需求。自定义数据结构可以更好地描述用户的数据类型,从而更方便地进行通信操作。此外,自定义数据结构还可以提高通信效率,减少数据传输的次数和数据量,提高程序的性能。 ### 回答2: MPI(消息递接口)是一种用于并行计算的编程模型,用于在分布式内存系统中协调进程之间的数据通信和同步。MPI中支持自定义数据结构的原因如下: 1. 数据分布:MPI用于并行计算,通常需要将数据分布到不同的进程间进行处理。自定义数据结构可以帮助定义不同进程之间的数据结构和分布方式,以实现数据的高效递和处理。 2. 数据类型MPI中的基本数据类型(如整数、浮点数)不足以描述实际问题中的复杂数据结构自定义数据结构可以用来描述更复杂的数据类型,如结构体、数组或嵌套的数据结构,以满足实际问题的需求。 3. 数据递:MPI中的消息递是基于数据的,而不是函数调用。使用自定义数据结构可以将相关数据组织在一起,以便一次性递或接收。这样可以减少通信的开销,并提高并行计算的效率。 4. 内存布局:MPI中的进程可以在不同的计算节点上运行,每个节点都有自己的内存。自定义数据结构可以帮助描述数据在不同节点之间的布局方式,以确保数据访问的正确性和高效性。 5. 扩展性:MPI是一种通用的并行计算模型,可以应用于各种不同的应用领域和问题。通过支持自定义数据结构MPI可以更好地适应不同问题的需求,提高代码的灵活性和扩展性。 总之,MPI中支持自定义数据结构是为了满足并行计算中数据组织、递和处理的需求,提高并行计算的效率和灵活性。 ### 回答3: MPI(Message Passing Interface)是一种用于并行计算的通信库,能够在多个进程之间进行消息递。MPI中支持自定义数据结构的原因有以下几点: 1.适应不同的数据类型MPI的标准数据类型仅包括基本数据类型如整型、浮点型等,对于复杂的数据结构结构体、数组等无法直接支持。因此,需要支持自定义数据结构,以适应不同类型的数据。 2.提高性能和效率:MPI中消息通信是通过数据的递来实现的,采用自定义数据结构可以把相关的数据打包成一个整体,减少通信开销和数据传输次数,从而提高性能和效率。 3.提供灵活性和可扩展性:MPI是一个通用的通信库,可以用于各种不同类型的并行应用。为了满足不同应用的需求,需要能够自定义数据结构,以便在不同的场景中进行数据递和处理。 4.简化编程:使用自定义数据结构可以使程序员更方便地表示和处理复杂的数据类型。通过对数据进行封装和抽象,可以提高代码的可读性和可维护性,减少编程错误的可能性。 总之,MPI中支持自定义数据结构可以适应不同的数据类型,提高性能和效率,提供灵活性和可扩展性,简化编程。这些都是为了更好地满足并行应用的需求并提升程序的效果和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值