首页 > 解决方案 > MPI_Lock_win / 被动同步使用混乱

问题描述

我正在尝试将应用程序从使用标准点对点 MPI 调用(例如 , MPI_IsendMPI_Irecv转换为使用 MPI-3 的单面调用。我的目标是提高我的硬件的性能,这是一个具有 Infiniband 硬件支持和针对 RDMA 调用优化的 MPI 实现的系统。有人告诉我,与主动同步(即Post-Start-Complete-Wait)相比,被动同步模式下的硬件性能特别好。

然而,即使在阅读了MPI 标准文档和示例之后,我仍然对如何实际使用这些调用感到困惑。对于上下文,我的程序有一个设置阶段,我将在其中了解通信模式,甚至了解发送数据的缓冲区和接收器的最终缓冲区。因此,设置一个窗口并使用它很简单。

具体来说,对于被动同步,我对“接收者”何时知道窗口中的数据已由发送者写入感到困惑。我想要做的是让发件人产生消息数据,然后MPI_Win_lock在窗口上调用,然后做一个MPI_Put,然后等待完成MPI_Win_Unlock。但是,什么是数据的“接收者”(窗口目标)知道何时写入消息数据的有效/推荐方式?同样,考虑到通信模式是迭代的,并且多次使用相同的接收缓冲区(目标的缓冲区),我怎么知道接收器已经完成了对缓冲区的使用并且可以重复使用?

我可以设想几种方法:

  1. 我可以在 MPI_Win_unlock 之后和接收器访问数据之前使用 MPI_Barrier。(这似乎可行,但我怀疑这会比主动同步产生更好的性能。)

  2. 我可以在接收器(目标)上使用 MPI_Lock 和 MPI_Unlock,当目标实际使用数据时锁定窗口,因此访问时代无法从源开始(但是,它是这样工作的吗?我读过锁定和解锁不会创建传统意义上的关键部分)。

  3. 某种本土方法,接收者轮询某种要写入的随机数,知道发生这种情况时数据是可用的。

文档MPI_Win_lockhttps ://www.open-mpi.org/doc/v3.0/man3/MPI_Win_lock.3.php

一般来说,程序员如何以MPI_Lock比主动同步方法更有效的方式与“MPI_Unlock”同步?感觉我只需要使用 post-start-complete-wait,但我希望你能帮助我找到一种方法来尝试被动同步。

标签: mpi

解决方案


推荐阅读