mpi - MPI_Lock_win / 被动同步使用混乱
问题描述
我正在尝试将应用程序从使用标准点对点 MPI 调用(例如 , MPI_Isend
)MPI_Irecv
转换为使用 MPI-3 的单面调用。我的目标是提高我的硬件的性能,这是一个具有 Infiniband 硬件支持和针对 RDMA 调用优化的 MPI 实现的系统。有人告诉我,与主动同步(即Post-Start-Complete-Wait)相比,被动同步模式下的硬件性能特别好。
然而,即使在阅读了MPI 标准文档和示例之后,我仍然对如何实际使用这些调用感到困惑。对于上下文,我的程序有一个设置阶段,我将在其中了解通信模式,甚至了解发送数据的缓冲区和接收器的最终缓冲区。因此,设置一个窗口并使用它很简单。
具体来说,对于被动同步,我对“接收者”何时知道窗口中的数据已由发送者写入感到困惑。我想要做的是让发件人产生消息数据,然后MPI_Win_lock
在窗口上调用,然后做一个MPI_Put
,然后等待完成MPI_Win_Unlock
。但是,什么是数据的“接收者”(窗口目标)知道何时写入消息数据的有效/推荐方式?同样,考虑到通信模式是迭代的,并且多次使用相同的接收缓冲区(目标的缓冲区),我怎么知道接收器已经完成了对缓冲区的使用并且可以重复使用?
我可以设想几种方法:
我可以在 MPI_Win_unlock 之后和接收器访问数据之前使用 MPI_Barrier。(这似乎可行,但我怀疑这会比主动同步产生更好的性能。)
我可以在接收器(目标)上使用 MPI_Lock 和 MPI_Unlock,当目标实际使用数据时锁定窗口,因此访问时代无法从源开始(但是,它是这样工作的吗?我读过锁定和解锁不会创建传统意义上的关键部分)。
某种本土方法,接收者轮询某种要写入的随机数,知道发生这种情况时数据是可用的。
文档MPI_Win_lock
:https ://www.open-mpi.org/doc/v3.0/man3/MPI_Win_lock.3.php
一般来说,程序员如何以MPI_Lock
比主动同步方法更有效的方式与“MPI_Unlock”同步?感觉我只需要使用 post-start-complete-wait,但我希望你能帮助我找到一种方法来尝试被动同步。
解决方案
推荐阅读
- java - 如何从JSoup中的无序列表中获取img元素的绝对url
- python - astropy.match_coordinates_sky 混乱
- ruby-on-rails - Rails ActiveRecord 迁移以添加带有“NOT VALID”参数的外键
- python - 遍历数据库中表的列并打印其中的记录数
- node.js - 从 module.export 调用;同一个 module.export 中的函数
- c++ - 我得到一个 Intellisence “没有重载函数的实例 rotate() 与参数列表匹配。我该如何解决
- automated-tests - nightwatch.js / Saucelabs - click() 不工作 [在运行 .click() 命令时发生错误
] - python - 设置 Plotly 热图范围
- azure - 是否可以检索存储队列中的所有消息,即使是分批?
- sql - ORA-01403: 在 oracle 中在线重新定义表期间未找到数据