MPI - 处理 MPI_TYPE_CREATE_SUBARRAY 的零大小子数组的特殊情况

MPI - Deal with special case of zero sized subarray for MPI_TYPE_CREATE_SUBARRAY

我使用 MPI_TYPE_CREATE_SUBARRAY 创建一个类型,用于在笛卡尔拓扑中的相邻进程之间传递 3D 数组的部分。具体来说,每个进程分别沿着三个方向与两侧的两个进程通信。

为简单起见,参考一维网格,有两个参数 nLnR 定义每个进程必须从左侧接收多少值并发送到右侧,以及每个人必须从右边接收多少并发送到左边。

不知道(或者可能只是忘记了)MPI_TYPE_CREATE_SUBARRAYarray_of_subsizes 数组参数的所有元素都必须为正,我编写的代码无法处理这种情况 nR = 0(或nL = 0,两者都可以)。

(顺便说一句,我看到 MPI_TYPE_VECTOR 确实 接受零个 countblocklength 参数,这令人难过 MPI_TYPE_CREATE_SUBARRAY 不能。)

你建议如何面对这个问题?我真的必须将对 MPI_TYPE_CREATE_SUBARRAY 的每个调用转换为链中调用的多个 MPI_TYPE_VECTOR 吗?

下面的代码是最小的,但不起作用(但它在较大的程序中有效,我没有时间提取最少数量的声明和打印),但它应该让我更好地了解我的内容我在说。

INTEGER :: ndims = 3, DBS, ierr, temp, sub3D
INTEGER, DIMENSION(ndims) :: aos, aoss

CALL MPI_TYPE_SIZE(MPI_DOUBLE_PRECISION, DBS, ierr)

! doesn't work if ANY(aoss == 0)
CALL MPI_TYPE_CREATE_SUBARRAY(ndims, aos, aoss, [0,0,0], MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, sub3D, ierr)

! does work if ANY(aoss == 0)
CALL MPI_TYPE_HVECTOR(aoss(2), aoss(1), DBS*aos(1),            MPI_DOUBLE_PRECISION, temp,  ierr)
CALL MPI_TYPE_HVECTOR(aoss(3), 1,       DBS*PRODUCT(aos(1:2)), temp,                 sub3D, ierr)

最后用两个 MPI_TYPE_HVECTOR 替换 MPI_TYPE_CREATE_SUBARRAY 并不难。也许这是最好的解决方案,毕竟。

从这个意义上说,我很自然地会想到一个附带问题:为什么 MPI_TYPE_CREATE_SUBARRAY 如此有限?在 MPI 标准中有很多例子可以正确地返回到 "do nothing"(当发送者或接收者是 MPI_PROC_NULL 时)或 "there's nothing in this"(当 aoss 有在我的示例中为零维)。我应该 post 在某处请求功能吗?

MPI 3.1 标准(第 4.1 章第 95 页)使其crystal明确

For any dimension i, it is erroneous to specify array_of_subsizes[i] < 1 [...].

您可以随意将您的评论发送至合适的Mailing List