上一次尝试了使用Send/Recv传递简单的build-in类型的数据。
有时候人们需要一次性传递多种不同类型不同数量的build-in类型数据,通常将数据组织成struct或class来实现。对于这种需求MPI提供了多种支持方式,如MPI_Type_vector、MPI_Type_indexed和MPI_Type_struct等。MPI_Type_struct可能是最通用的自定义类型生成器,因此下文主要是描述如何使用这种方式进行数据传递。
首先,展示一下需要传递的自定义数据
如果要传递这样一个自定义类型的数据,MPI要求注册一个新的数据类型,注册时必须详细描述CTestSendRecv的数据结构及其成员对应的MPI类型定义(MPI_INT、MPI_DOUBLE等)。相关的函数调用和数据定义代码如下
blockLength数组是用来描述CTestSendRecv中各个成员对应的build-in数据个数。
oldTypes数组是用来描述CTestSendRecv中各个成员对应的build-in数据的MPI类型定义。
addressOffsets是用来描述CTestSendRecv中各个成员离该CTestSendRecv类的首地址的偏移量,这里涉及到编译器的字节对齐的知识。当然MPI提供了MPI_Get_address这样的函数来计算偏移量,但使用起来较为麻烦。
MPI::Datatype::Create_struct为CTestSendRecv创建新的MPI类型。
newType.Commit();提交注册新的MPI数据类型。对应的注销数据类型的函数是newType.Free();
下面是完整的代码示例
这样就可以达到了传递自定义数据类型的目的。
从以上的代码看来,MPI必须以静态的方式了解自定义数据结构的组成,所以可能不支持模板类型的自定义数据。
还有一个遗留问题就是,MPI能否支持如下方式的嵌套自定义数据CNestTestData,还有待进一步验证。