MPI - 处理 MPI_TYPE_CREATE_SUBARRAY 的零大小子数组的特殊情况
MPI - Deal with special case of zero sized subarray for MPI_TYPE_CREATE_SUBARRAY
我使用 MPI_TYPE_CREATE_SUBARRAY
创建一个类型,用于在笛卡尔拓扑中的相邻进程之间传递 3D 数组的部分。具体来说,每个进程分别沿着三个方向与两侧的两个进程通信。
为简单起见,参考一维网格,有两个参数 nL
和 nR
定义每个进程必须从左侧接收多少值并发送到右侧,以及每个人必须从右边接收多少并发送到左边。
不知道(或者可能只是忘记了)MPI_TYPE_CREATE_SUBARRAY
的 array_of_subsizes
数组参数的所有元素都必须为正,我编写的代码无法处理这种情况 nR = 0
(或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_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。
我使用 MPI_TYPE_CREATE_SUBARRAY
创建一个类型,用于在笛卡尔拓扑中的相邻进程之间传递 3D 数组的部分。具体来说,每个进程分别沿着三个方向与两侧的两个进程通信。
为简单起见,参考一维网格,有两个参数 nL
和 nR
定义每个进程必须从左侧接收多少值并发送到右侧,以及每个人必须从右边接收多少并发送到左边。
不知道(或者可能只是忘记了)MPI_TYPE_CREATE_SUBARRAY
的 array_of_subsizes
数组参数的所有元素都必须为正,我编写的代码无法处理这种情况 nR = 0
(或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_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。