MPI学习六 具有不连续数据发送的MPI程序设计

本文介绍了MPI中处理不连续数据的方法,包括自定义派生数据类型和数据打包解包。重点讲解了如何通过连续复制、向量、索引和结构数据类型生成新数据,以及如何利用MPI提供的函数进行数据类型的递交、释放、地址计算和相关调用。
摘要由CSDN通过智能技术生成

处理不连续的数据基本方法 
一是允许用户自定义新的数据类型 又称派生数据类型 
二是数据的打包与解包

派生数据类型

 数据类型描述方法--类型图 
 类型图的二元组为如下形式 <基类型 偏移>,则类型图为 
  类型图={<基类型0 偏移0>,<基类型1 偏移1>,...,<基类型n-1 偏移n-1>} 
 基类型可以是预定义类型或派生类型   
 偏移可正可负,没有递增或递减的顺序要求。 
 数据类型的跨度被定义为该数据类型的类型图中从第一个基类型到最后一个基类型间的距离。 
 即如果某一个类型的类型图为 
   typemap={ (type0,disp0), ..., (typen-1,dispn-1) }, 
 则该类型图的下界定义为 
  lb(typemap)=min { dispj }, 0 =< j <= n-1 
 则该类型图的上界定义为 
  ub(typemap)=max (dispj+sizeof(typej) ), 0 =< j <= n-1 
 该类型图的跨度定义为 
  extent(typemap)=ub( typemap )-lb( typemap )+e 
 由于不同的类型有不同的对齐位置的要求, e 就是能够使类型图的跨度满足该类型的类型表中的所有的类型都能达到下一个对齐要求所需要的最小非负整数值。

新数据类型的定义

连续复制的类型生成

得到的新类型是将一个已有的数据类型按顺序依次连续进行复制后的结果

函数接口:

int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype) 
 IN count 复制个数(非负整数) 
 IN oldtype 旧数据类型 
 OUT newtype 新数据类型

向量数据类型的生成

允许复制一个数据类型到含有相等大小块的空间 每个块通过连接相同数量的旧数据类型的拷贝来获得。块与块之间的空间是旧数据类型的extent的倍数

函数接口:

int MPI_Type_vector(int count,int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype) 
 IN count 块的数量(非负整数) 
 IN blocklength 每个块中所含元素个数(非负整数) 
 IN stride 各块第一个元素之间相隔的元素个数(整数) 
 IN oldtype 旧数据类型 
 OUT newtype新数据类型

函数 MPI_Type_hvector 和 MPI_Type_vector 基本相同,只是 stride 不再是元素个数,而是字节数

int MPI_Type_hvector(int count,int blocklength,MPI_Aint stride,MPI_Datatype oldtype, MPI_Datatype *newtype) 
 IN count 块的数量(非负整数) 
 IN blocklength 每个块中所含元素个数(非负整数) 
 IN stride 各块起始位置之间相隔的字节数(整数) 
 IN oldtype 旧数据类型 
 OUT newtype 新数据类型

索引数据类型的生成

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值