Асинхронный MPI - PullRequest
       9

Асинхронный MPI

3 голосов
/ 03 мая 2019

Я хотел бы отправить сообщение 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 не делает это правильно

1 Ответ

2 голосов
/ 03 мая 2019

Не напрямую, но вы могли бы MPI_Isend из процесса (b) обработать (a) непосредственно перед MPI_Recv на (b) и использовать MPI_Iprobe или аналогичный на (a), чтобы обнаружить, что

...