【发布时间】:2019-09-22 00:07:01
【问题描述】:
我想从处理器 (a) 向 (b) 发送 MPI 消息,但是,何时发生取决于处理器 b。
让我解释一下我的情况。想象一下,我有两个不同的代码运行不同的时间循环。在每个案例的一个时间步之后,我需要双向交换某些数据。另外,我知道,例如与处理器 (a) 关联的代码比另一个 (b) 运行得更快。因此,我想利用这一事实,例如让处理器 (a) 使用与以前相同的数据运行相同的时间循环(为我提供更好的统计数据)。但我需要控制它,因为当且仅当处理器 (b) 尚未完成并更新处理器 (a) 需要及时推进的数据时,我需要处理器 (a) 运行重复的时间循环。
在时间循环完成后,我目前正在处理器 (a) 中使用 MPI_IPROBE,以检查数据是否准备好。虽然,我发现即使来自处理器 (b) 的数据准备就绪,MPI_IPROBE 仍然可以给出错误标志。
我从以下文章中了解到,由于该库例程的 MPI 定义,这种情况并不少见。
Why does MPI_Iprobe return false when message has definitely been sent?
到目前为止我做了什么
所以在接收程序中,我确实调用了 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
所以我的想法是释放最后一个 isend 并创建一个新的,以防在完成新迭代之前没有收到它。 似乎我的 mpi_request_free 正在做一些意想不到的事情。在我运行代码一段时间后,假设我的处理器 a 在每个处理器 b 的一次迭代中进行 10 次迭代,在某个时候它突然下降到 1 比 1 的迭代。这不是预期的 - 我希望 mpi_request_free 没有做对
【问题讨论】: