处理不连续的数据基本方法
一是允许用户自定义新的数据类型 又称派生数据类型
二是数据的打包与解包
派生数据类型
数据类型描述方法--类型图
类型图的二元组为如下形式 <基类型 偏移>,则类型图为
类型图={<基类型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 新数据类型