结构数据类型

MPI_TYPE_STRUCT(count,array_of_blocklengths,array_of_displacemets,array_of_types,newtype)
IN count 块的数量 (整数)
IN array_of_blocklengths 每个块中所含元素个数(整数数组)
IN array_of_displacements 各块偏移字节数(整数数组)
IN array_of_types 每个块中元素的类型(句柄数组)
OUT newtypr 新数据类型(句柄)
int MPI_Type_struct(int count,int *array_of_blocklengths, MPI_Aint *array_of_displacements, MPI_Datatype array_of_types , MPI_Datatype *newtype)
MPI_TYPE_STRUCT(COUNT,ARRAY_OF_BLOCKLENGTHS,ARRAY_OF_DISPLACEMENTS, ARRAY_OF_TYPES (*),NEWTYPE,IERROR)
INTEGER COUNT, ARRAY_OF_BLOCKLENGTHS(*),
ARRAY_OF_DISPLACEMENTS(*),ARRAY_OF_TYPES (*),NEWTYPE, IERROR

MPI_TYPE_STRUCT是最通用的类型生成器,它能够在上面介绍的基础上进一步允许每个块包含不同数据类型的拷贝。

设type1的类型映像为
{(double,0),(char,8)}, extent=16.
令B=(2,1,3),D=(0,16,26),T=(MPI_FLOAT, type1,
MPI_CHAR).则MPI_TYPE_STRUCT(3,B,D,T,newtype)返回
{(float,0),(float,4),(double,16),(char,24),(char,26),(char,27),(char,28)}.

图13-5 用MPI_TYPE_STRUCT生成的新类型

即两个起始于0的MPI_FLOAT拷贝后面跟一个起始于16的type1,再跟三个起始于26的MPI_CHAR拷贝。(我们假设一个浮点数占4个字节)。

新类型的递交和释放
MPI_TYPE_COMMIT(datatype)
INOUT datatype 递交的数据类型(句柄)
int MPI_Type_commit(MPI_Datatype *datatype)
MPI_TYPE_COMMIT(DATATYPE,IERROR)
INTEGER DATATYPE,IERROR

新定义的数据类型在使用之前,必须先递交给MPI系统。一个递交后的数据类型,可以作为一个基本类型,用在数据类型生成器中产生新的数据类型。预定义数据类型不需要递交,就可以直接使用。
递交操作用于递交新定义的数据类型。注意这里的参数是指向该类型的指针(或句柄),而不是,定义该类型的缓冲区的内容。

MPI_TYPE_FREE(datatype)
INOUT datatype 释放的数据类型(句柄)
int MPI_Type_free(MPI_Datatype *datatype)
MPI_TYPE_FREE(DATATYPE,IERROR)
INTEGER DATATYPE,IERROR

MPI_TYPE_FREE调用将以前已递交的数据类型释放,并且设该数据类型指针或句柄为空MPI_DATATYPE_NULL。由该派生类型定义的新派生类型不受当前派生类型释放的影响。
释放一个数据类型并不影响另一个根据这个被释放的数据类型定义的其它数据类型。

例子:新数据类型的递交与释放
INTEGER type1, type2
CALL MPI_TYPE_CNTIGUOUS(5, MPI_REAL, type1, ierr)
C 创建新的类型目标
CALL MPI_TYPE_COMMIT(type1, ierr)
C 此时type1可以用于通信
type2 = type1
C type2可以用于通信,它是一个和type1指向同一个目标的句柄
CALL MPI_TYPE_VECTOR(3,5,4,MPI_REAL,type1,ierr)
C 创建新的数据类型type1
CALL MPI_TYPE_COMMIT(type1,ierr)
C 此时type1可作为新类型用于通信之中

与数据类型有关的MPI调用

MPI_ADDRESS(location,address)
IN location内存地址(可选数据类型)
OUT address相对于位置MPI_BOTTOM的偏移(整型)
int MPI_ADdress(void* location, MPI_Aint *address)
MPI_ADDRESS(LOCATION,ADDRESS,IERROR) <type> LOCATION(*)
INTEGER ADDRESS,IERROR

一个MPI提供的地址调用MPI_ADDRESS可以返回某一个变量在内存中相对于预定义的地址MPI_BOTTOM的偏移地址。


下面的例子根据地址函数得到数组中两个不同元素在内存中的距离。

REAL A(100,100)
INTEGER I1, I2, DIFF
CALL MPI_ADDRESS(A(1,1), I1, IERROR)
CALL MPI_ADDRESS(A(10,10), I2, IERROR)
DIFF = I2 - I1

MPI_TYPE_EXTENT(datatype,extent)
IN datatype 数据类型(句柄)
OUT extent 数据类型extent(整型)
int MPI_Type_extent(MPI_Datatype datatype, int *extent)
MPI_TYPE_EXTENT(DATATYPE,SIZE,IERROR)
INTEGER DATATYPE,EXTENT,IERROR

MPI_TYPE_EXTENT以字节为单位返回一个数据类型的跨度extent。

MPI_TYPE_SIZE(datatype,size)
IN datatype 数据类型(句柄)
OUT size 数据类型大小(整型)
int MPI_Type_size(MPI_Datatype datatype, int *size)
MPI_TYPE_SIZE(DATATYPE,SIZE,IERROR)
INTEGER DATATYPE,SIZE,IERROR

MPI_TYPE_SIZE以字节为单位,返回给定数据类型有用部分所占空间的大小,即跨度减去类型中的空隙后的空间大小。和MPI_TYPE_EXTENT相比,MPI_TYPE_SIZE不包括由于对齐等原因导致数据类型中的空隙所占的空间。