Fortran RMA MPI窗口访问延迟

Fortran RMA MPI窗口访问延迟,fortran,mpi,latency,Fortran,Mpi,Latency,我使用Fortran(带gfortran)和MPI 2(OpenMPI)。通过MPI\u Win\u lock和MPI\u Win\u unlock以及put和get操作(在内存的非重叠区域中),所有进程都会更新主进程上的一个变量,该变量通过窗口公开 然而,在一个测试用例中,我注意到,来自非主进程的解锁操作在主进程完成某些任务之前不会返回,在这种情况下,会休眠几秒钟 如果我没有让主机休眠,而是使用while循环和计时器让它等待几秒钟,同时让主机锁定和解锁窗口,一切都会变得更快: call sta

我使用Fortran(带gfortran)和MPI 2(OpenMPI)。通过
MPI\u Win\u lock
MPI\u Win\u 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
然而,在我的真实代码中,主进程执行的操作与其他进程一样,因此它不可能连续锁定和解锁窗口。而且,在我看来,这相当浪费

因此,我的问题是如何减少延迟


我真的需要为我的代码添加锁和解锁吗?还是有其他解决办法?此编译器/实现依赖吗?

此行为依赖于实现。大多数MPI库不执行操作的异步进程,只有在通过调用
MPI\u Something
将执行控制显式传输到库时,才会执行进程。一个相对轻量级和可移植的黑客是定期调用MPI_Iprobe,这应该使库能够处理用于实施RMA的任何未完成的非阻塞发送和接收操作。

该行为取决于实现。大多数MPI库不执行操作的异步进程,只有在通过调用
MPI\u Something
将执行控制显式传输到库时,才会执行进程。一个相对轻量级和可移植的hack是定期调用
MPI_Iprobe
,这将使库能够处理用于实施RMA的任何未完成的非阻塞发送和接收操作。

这对我很有用。您是否有参考资料解释了
MPI\u Something
执行异步进程?我想多读一点。不,谢谢,因为这是不允许的。这对我有用。您是否有参考资料解释了
MPI\u Something
执行异步进程?我想多读一点。不,谢谢,因为这是不允许的。