5

我正在尝试使用该mpi_f08模块在一系列 4、5 和 6 级阵列上进行光环交换。以前我为此使用了子数组类型,但最终结果如此之多,以至于 ifort 无法跟踪所有这些类型,并在使用-ipo.

我正在使用以下代码

call MPI_Isend(Array(1:kthird, ksizex_l, 1:ksizey_l, 1:ksizet_l, 1:size5, 1:size6), size, MPI_Double_Complex, ip_xup, 0 + tag_offset, comm, reqs(1))
call MPI_Irecv(Array(1:kthird, 0, 1:ksizey_l, 1:ksizet_l, 1:size5, 1:size6), size, MPI_Double_Complex, ip_xdn, 0 + tag_offset, comm, reqs(2))

(然后打电话给MPI_WaitAll

带有 Intel MPI 2017 的 ifort 2017 为每个此类行提供以下警告:

test_mpif08.F90(51): warning #8100: The actual argument is an array section or assumed-shape array, corresponding dummy argument that has either the VOLATILE or ASYNCHRONOUS attribute shall be an assumed-shape array.   [ARRAY]

尽管如此,halo 交换对于 rank-4 和 -5 阵列都可以正常工作。然而,当涉及到 rank-6 数组时,数组数据的去向和来自完全错误的地方,发送过程中的光环数据(不在传入的数组段MPI_Isend中)出现在接收的大部分中进程(未传递到MPI_Irecv)。

使用 ifort 2018 和 Intel MPI 2019 预览版会产生额外的错误(非警告):

test_halo_6_aio.F90(60): warning #8100: The actual argument is an array section or assumed-shape array, corresponding dummy argument that has either the VOLATILE or ASYNCHRONOUS attribute shall be an assumed-shape array.   [ARRAY]
call MPI_Isend(Array(1:kthird, ksizex_l, 1:ksizey_l, 1:ksizet_l, 1:size5, 1:size6), size, MPI_Double_Complex, ip_xup, 0 + tag_offset, comm, reqs(1))
-------------------^
test_halo_6_aio.F90(60): error #7505: If an actual argument is an array section with vector subscript and corresponding dummy argument does not have VALUE attribute, it must not have ASYNCHRONOUS / VOLATILE attribute.   [BUF]
call MPI_Isend(Array(1:kthird, ksizex_l, 1:ksizey_l, 1:ksizet_l, 1:size5, 1:size6), size, MPI_Double_Complex, ip_xup, 0 + tag_offset, comm, reqs(1))
^

三个相互关联的问题:

  • 调用中我的语法是否有错误MPI_IsendMPI_Irecv导致警告?如何修复它以便不再触发警告?
  • 这个警告是我在 rank-6 数组中看到的数组损坏的原因吗?
  • 如何避免损坏 rank-6 数组?

我在这个 gist中放了一个失败的例子。

4

0 回答 0