MPI - 处理MPI_TYPE_CREATE_SUBARRAY的零大小子阵列的特殊情况

时间:2018-03-27 11:15:49

标签: multidimensional-array mpi

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

为了简化为一维网格,有两个参数nLnR,用于定义每个进程必须从左侧接收并向右发送的值,以及有多少每个人都必须从右边接收并发送到左边。

不知道(或者只是忘记)array_of_subsizes MPI_TYPE_CREATE_SUBARRAY nR = 0数组参数的所有元素都必须为正,我编写的代码无法处理{{1 (或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_CREATE_SUBARRAY替换MPI_TYPE_HVECTOR并不困难。毕竟,这可能是最好的解决方案。

从这个意义上来说,一方面的问题对我来说很自然:为什么MPI_TYPE_CREATE_SUBARRAY如此有限?在MPI标准的东西中有很多例子正确地依赖于“什么都不做”(当发送者或接收者是MPI_PROC_NULL时)或“这里没有任何东西”(当aoss有一个时我的例子中的零维度)。我应该在某个地方发布功能请求吗?

1 个答案:

答案 0 :(得分:1)

MPI 3.1标准(第4.1章,第95页)清晰明了

  

对于任何维度i,指定array_of_subsizes [i]<是错误的。 1 [...]。

您可以将评论发送到相应的Mailing List