RMA MPI窗口访问延迟



我使用Fortran(与gfortran)和MPI 2 (OpenMPI)。通过MPI_Win_lockMPI_Win_unlock以及putget操作(在内存的非重叠区域),所有进程更新我的主进程上的一个变量,该变量通过一个窗口暴露。

在一个测试用例中,我注意到,来自非主进程的解锁操作直到主进程完成某些任务才返回,在这种情况下,休眠几秒钟。

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

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添加锁和锁吗?还是有别的解决办法?这个编译器/实现依赖吗?

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

最新更新