我使用MPI_TYPE_CREATE_SUBARRAY
创建一个类型,用于在笛卡尔拓扑中的相邻进程之间传递部分3D数组。具体来说,每个过程沿着三个方向中的每个方向与两侧的两个过程进行通信。
为了简化为一维网格,有两个参数nL
和nR
,用于定义每个进程必须从左侧接收并向右发送的值,以及有多少每个人都必须从右边接收并发送到左边。
不知道(或者只是忘记)array_of_subsizes
MPI_TYPE_CREATE_SUBARRAY
nR = 0
数组参数的所有元素都必须为正,我编写的代码无法处理{{1 (或nL = 0
,或者可以)。
(顺便说一句,我看到MPI_TYPE_VECTOR
确实接受零count
和blocklength
个参数,而且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
有一个时我的例子中的零维度)。我应该在某个地方发布功能请求吗?
答案 0 :(得分:1)
MPI 3.1标准(第4.1章,第95页)清晰明了
对于任何维度i,指定array_of_subsizes [i]<是错误的。 1 [...]。
您可以将评论发送到相应的Mailing List。