Неустранимая ошибка в MPI_Waitall: недопустимый MPI_Request

#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. кто-нибудь может мне сказать?