Я хотел бы отправить сообщение MPI от процессора (a) к (b), однако, когда это происходит, зависит от процессора b.
Позвольте мне объяснить мой сценарий. Представьте, что у меня есть два разных кода, работающих в разных временных циклах. После каждого шага времени от каждого случая мне нужно обмениваться определенными данными в обоих направлениях. Кроме того, я знаю, что, например, код, связанный с процессором (а), работает быстрее, чем другой (б). Следовательно, я хочу использовать этот факт, например, позволяя процессору (a) запускать тот же цикл времени с теми же данными, что и раньше (Дает лучшую статистику для меня). Но мне нужно контролировать его, в том смысле, что мне нужен процессор (a) для запуска повторных циклов времени, если и только если процессор (b) не завершил и не обновил данные, которые процессор (a) должен был бы выполнить вовремя.
В настоящее время я использую MPI_IPROBE в процессоре (a) после завершения цикла времени, чтобы проверить, готовы ли данные. Хотя я обнаружил, что даже когда данные от процессора (b) готовы, MPI_IPROBE все равно может выдавать ложный флаг.
Из следующей статьи я узнал, что это не редкость из-за определения MPI этой библиотечной подпрограммы.
Почему MPI_Iprobe возвращает false, когда сообщение определенно было отправлено?
Что я сделал, софар
Так что в процедуре получения у меня есть вызов mpi_iprobe, скажем 10 раз
do i = 1, 10
call mpi_iprobe( dest, tag, comm_world, updated, status_, mpierr )
if(updated)exit
enddo
if(updated) call mpi_recv(buf, size_buf, mpi_real, src, tag, comm_world, status, mpierr)
В том месте, куда я отправляю свои данные, у меня есть следующее
if(updated)then
call mpi_wait( req, status, mpierr) ! this corresponds to the mpi_isend from last time step
call mpi_isend(buf, size_buf, src, tag, req, comm_world, mpierr)
else
call mpi_request_free(req, mpierr) ! deletes the isend I had last time
call mpi_send(buf, size_buf, src, tag, req, comm_world, mpierr) ! the new send
endif
Так что для меня идея состоит в том, чтобы освободить последний конец и сделать новый, если он не был получен до того, как вы завершили новую итерацию.
Кажется, однако, что мой mpi_request_free делает что-то неожиданно. После того, как я немного запустил код и сказал, что мой процессор a выполняет 10 итераций на одну итерацию процессора b, в какой-то момент он внезапно падает до 1: 1. Этого не ожидается - и я ожидаю, что mpi_request_free не делает это правильно