Использование MPI_Isend с подмассивами mpi_f08 для многомерных массивов в ifort портит данные
Я пытаюсь использовать 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
)
ifort 2017 с Intel MPI 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]
Несмотря на это, обмен гало отлично работает для массивов ранга 4 и -5. Однако, когда дело доходит до массивов ранга 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_Isend
а такжеMPI_Irecv
что вызывает предупреждения? Как я могу это исправить, чтобы предупреждения больше не срабатывали? - Является ли это предупреждение причиной повреждения массива, который я вижу с массивами ранга 6?
- Как я могу избежать повреждения массивов ранга 6?
Я привел неудачный пример в эту суть.