RMA MPI window 访问延迟

RMA MPI window access latency

我使用 Fortran(带有 gfortran)和 MPI 2 (OpenMPI)。通过 MPI_Win_lockMPI_Win_unlock 以及 putget 操作(在内存的非重叠区域中)所有进程更新我的主进程上的变量,该变量通过window.

然而,在一个测试案例中,我注意到,来自非主进程的解锁操作不会return直到主进程完成一些任务,在这种情况下休眠几秒钟。

如果我不让主机休眠,而是使用 while 循环和计时器让它等待几秒钟,同时我让主机锁定和解锁 window,一切都会快得多:

call start_time(time_left)
do while (time_left .gt. 0)
    call MPI_Win_lock(...)
    call MPI_Win_unlock(...)
    call update_time(time_left)
end do

但是,在我的真实代码中,master 和其他进程一样执行操作,所以它不可能不断地锁定和解锁 window。此外,在我看来,这相当浪费。

因此我的问题是如何减少这种延迟?

我真的需要为主程序添加锁定和解锁代码吗?或者还有其他解决方案吗?这个编译器/实现依赖吗?

行为依赖于实现。大多数 MPI 库不执行操作的异步进展,并且进展仅在执行控制通过调用 MPI_Something 显式转移到库时发生。一个相对轻量级和可移植的 hack 是定期调用 MPI_Iprobe,这应该使库能够处理用于实现 RMA 的任何未完成的非阻塞发送和接收操作。