RMA MPI window 访问延迟
RMA MPI window access latency
我使用 Fortran(带有 gfortran)和 MPI 2 (OpenMPI)。通过 MPI_Win_lock
和 MPI_Win_unlock
以及 put
和 get
操作(在内存的非重叠区域中)所有进程更新我的主进程上的变量,该变量通过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 的任何未完成的非阻塞发送和接收操作。
我使用 Fortran(带有 gfortran)和 MPI 2 (OpenMPI)。通过 MPI_Win_lock
和 MPI_Win_unlock
以及 put
和 get
操作(在内存的非重叠区域中)所有进程更新我的主进程上的变量,该变量通过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 的任何未完成的非阻塞发送和接收操作。