Использование 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?

Я привел неудачный пример в эту суть.

0 ответов

Другие вопросы по тегам