我使用Fortran(使用gfortran)和MPI 2(OpenMPI)。通过MPI_Win_lock
和MPI_Win_unlock
以及put
和get
操作(在非重叠的内存区域中),所有进程都会更新主进程上的变量,该变量通过窗口。
在测试用例中,我注意到,在主服务器完成某项任务之前,非主服务器的解锁操作不会返回,在这种情况下会休眠几秒钟。
如果不是让主人睡觉,我会使用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与其他进程一样执行操作,因此它不可能连续锁定和解锁窗口。而且,在我看来相当浪费。
我的问题是如何减少这种延迟?
我是否真的需要为主人提供锁和解锁代码?还是有其他解决方案吗?这个编译器/实现依赖吗?
答案 0 :(得分:2)
该行为取决于实现。大多数MPI库不执行操作的异步进程,只有在通过调用MPI_Something
将执行控制显式转移到库时才会发生进展。相对轻量级和可移植的hack是定期调用MPI_Iprobe
,这应该使库能够处理用于实现RMA的任何未完成的非阻塞发送和接收操作。