#fortran #runtime-error #mpi
#fortran #ошибка во время выполнения #mpi
Вопрос:
Я привожу свой код ниже, но когда я его запускаю, я сталкиваюсь с этой ошибкой:
aborting job:
Fatal error in MPI_Waitall: Invalid MPI_Request, error stack:
MPI_Wait(171): MPI_Waitall(count=4, req_array=0x000001400E0DE0,status_array = 0x0000000000012FD8C) failed
MPI_Waitall(96). : Invalid MPI_Request
MPI_Waitall(96). : Invalid MPI_Request
Когда я использую блокирующую отправку и получение, мой код выдает правильный ответ, но когда я использую неблокирующую отправку и получение, я получаю ошибку.
Это мой код :
integer reqs(4) ! required variable for non-blocking calls
integer stats(MPI_status_SIZE,4) ! required variable for WAITALL routine
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, taskid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numtasks, ierr )
! Send data to the left neighbor
if ((taskid > 0) ) then
call MPI_ISEND(phi0(1,1),N_z,MPI_DOUBLE_PRECISION,taskid-1,11,MPI_COMM_WORLD,amp;
reqs(1),ierr)
end if
! Send data to the right neighbor
if (taskid < numtasks-1) then
call MPI_ISEND(phi0(1,cols),N_z,MPI_DOUBLE_PRECISION,taskid 1,10,MPI_COMM_WORLD,amp;
reqs(2),ierr)
end if
! Receives data from the neighbor on the left
if (taskid > 0) then
call MPI_IRECV(phi0(1,0),N_z,MPI_DOUBLE_PRECISION,taskid-1,10,MPI_COMM_WORLD,amp;
reqs(3),ierr)
end if
! From the right side of the neighbors to get the data
if (taskid < numtasks-1) then
call MPI_IRECV(phi0(1,cols 1),N_z,MPI_DOUBLE_PRECISION,taskid 1,11,MPI_COMM_WORLD,amp;
reqs(4),ierr)
end if
call MPI_WAITALL(4, reqs, status_array, ierr)
Комментарии:
1. Не все ранги имеют соседей слева или справа, поэтому в некоторых из них не все четыре элемента
reqs
установлены должным образом. Поместитеreqs = MPI_REQUEST_NULL
где-нибудь перед условными обозначениями, чтобы инициализировать все дескрипторы запросов значением, которое не сделаетMPI_WAITALL
несчастливым.2. спасибо за ваш ответ @HristoIliev … но я определил границу для каждой отправки и получения, и я не использую все ранги для отправки или получения с правой стороны или слева… возможно ли, чтобы показать мне в моем коде, чтобы я понял?
3. Просто поместите
reqs = MPI_REQUEST_NULL
в начале вашей программы / подпрограммы.4. спасибо за ответ @HristoIliev … я делаю это, и ошибка исчезает… но когда я запускаю свой код, загрузка моего процессора сначала составляет 100%, но через секунду будет равна нулю… я думаю, что когда он столкнется с waitall, он полностью остановится и будет ждать данных, а данные не передаются… я буду признателен, если вы скажете мне, в чем именно моя проблема?
5. кто-нибудь может мне сказать?