Send / Recv Usage(2)

上一次尝试了使用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,还有待进一步验证。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值