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

Parallel processing 远程内存访问(RMA)的目的,parallel-processing,mpi,Parallel Processing,Mpi,我阅读了MPI标准,找到了一个包含MPI_Put和MPI_Get操作的部分。然而,对于我来说,RMA在这些函数的基础上产生了什么好处还不清楚。什么时候最好使用这样的函数而不是异步MPI_Isend、MPI_Irecv?什么是通用RMA(不在MPI上下文中)?单边通信的最大好处是能够在节点之间推送或获取数据,而无需发送/接收开销 想象一个有2个节点的场景。您希望将数据从节点1推送到节点2 当节点1使用MPI\u ISend或MPI\u Send向节点2发送数据时,节点2仍必须使用MPI\u Ire

我阅读了MPI标准,找到了一个包含MPI_Put和MPI_Get操作的部分。然而,对于我来说,RMA在这些函数的基础上产生了什么好处还不清楚。什么时候最好使用这样的函数而不是异步MPI_Isend、MPI_Irecv?什么是通用RMA(不在MPI上下文中)?

单边通信的最大好处是能够在节点之间推送或获取数据,而无需发送/接收开销

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

当节点1使用
MPI\u ISend
MPI\u Send
向节点2发送数据时,节点2仍必须使用
MPI\u Irecv
正式接收该数据。节点2将等待该接收,匹配MPI标记,然后允许您继续。这在理论上类似于插座,因为两侧必须协调。即使使用异步版本
MPI*
,仍然存在协调

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

我的一位同事有一个很好的类比
MPI\u Send
MPI\u Recv
就像邮件递送一样,收件人必须在邮件递送中签名才能拿到包裹。他们可以无限期地在门口等待(
MPI\u Send
),也可以留个便条让你回电话(
MPI\u ISend

MPI_Put
就像亚马逊送货员走进你的房子,把杂货放好
MPI_Get
就像你走进一家杂货店,当它关门的时候,你只是抓住你需要的东西

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


好的概述:

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

但是,将
MPI\u Put
MPI\u Get
操作视为真正的片面操作是不正确的。MPI设计用于不同的硬件。某些网络(如infiniband)支持真正的DRMA,因为它们不需要目标进程的参与(正如我所读到的,事实并非如此)。其他网络不支持RDMA,RMA标准的设计是为了在不违反本规范的情况下实现高效的RMA原语(相对于硬件功能)

正如书中所解释的,
MPI\u Put
不仅仅是一个不需要recv的发送,它类似于
MPI\u Isend
,它需要调用
MPI\u Wait
MPI\u Test
取得进展,即使发布了相应的
MPI\u recv
变体。 类似地,MPI RMA操作需要同步操作,例如对于可以取得进展的最基本操作,MPI Win\u fence。MPI标准只是说,这些操作最迟应该在调用一个这样的操作时完成,这意味着它可以在之前完成。行为取决于MPI实现,RMA操作实际上可能使用消息传递实现