远程内存访问(RMA)的目的

时间:2018-03-02 19:32:16

标签: parallel-processing mpi

我阅读了MPI标准并找到了一个包含MPI_Put和MPI_Get操作的部分。但是,我不清楚RMA在这些功能的基础上有什么好处。什么时候更好地使用这些函数而不是异步MPI_Isend,MPI_Irecv?使用RMA的一般目的是什么(不在MPI上下文中)?

2 个答案:

答案 0 :(得分:2)

单面通信的最大好处是能够在节点之间推送或获取数据,而不会产生发送/接收的开销。

想象一下有2个节点的场景。您希望将数据从节点1推送到节点2.

当节点1使用MPI_ISendMPI_Send向节点2发送数据时,节点2仍必须使用MPI_Irecv正式接收该数据。节点2将等待该接收,匹配MPI标记,然后允许您继续。这在理论上类似于套接字,因为双方都必须协调。即使使用异步版本MPI_I*,仍然存在协调。

使用MPI_Put,您从节点1推送数据,而节点2将拥有它。有涉及的同步步骤,但重点是节点2将拥有它,而不需要正式接受。组中的所有节点都可以访问其他节点连接的内存缓冲区。

我的一位同事有一个很好的比喻。 MPI_SendMPI_Recv就像邮件投递一样,收件人必须签署该包裹。他们可以无限期地在门口等候(MPI_Send)或给你留言以便回电(MPI_ISend)。

MPI_Put就像亚马逊送货员走进你的房子并把杂货带走。 MPI_Get就像你在杂货店关闭时走进杂货店,只是抓住你需要的东西。

与此示例类似,MPI_PutMPI_Get依赖于信任和良好的设计。它们只应在共享内存和单向数据移动有效时使用。

良好的概述:https://www.cc.gatech.edu/~echow/ipcc/hpc-course/19_rma.pdf

答案 1 :(得分:2)

使用RMA编写某些应用程序更容易或更自然。 例如,考虑一个2D模拟应用程序,其中每个进程拥有网格的某些部分,但需要来自其他进程的数据才能计算其迭代。使用消息传递原语要求每个进程匹配发送/接收对和每个接收器以理解每条消息的含义(请在此处写入此数据)。 程序员必须小心避免使用协调发送和接收的死锁,或通常称为“异步”的#34; 清除操作。 使用RMA原语并不要求目标消息理解请求,因为暗示了其含义(请给我或写下这些数据)。

但是,将MPI_PutMPI_Get操作视为真正的片面操作是不正确的。 MPI旨在用于不同的硬件。某些网络(如infiniband)支持真正的DRMA,因为他们不需要目标流程的参与(当我阅读here时,情况并非如此)。其他网络不支持RDMA,RMA标准的设计使得可以实现高效的RMA原语(相对于硬件功能),而不会违反本规范。

正如Using advanced MPI一书中所述,MPI_Put不仅仅是一个不需要recv的发送,但它类似于需要调用的MPI_Isend即使已发布相应的MPI_Wait变体,也会MPI_TestMPI_Recv 取得进展。 类似地,MPI RMA操作需要同步操作,例如MPI_Win_fence,用于可以进行进度的最基本操作。 MPI标准只表示这些操作最迟应该在调用一个这样的操作时完成,这意味着它可以在之前完成。行为取决于MPI实现,RMA操作实际上可以使用消息传递来实现。