gpt4 book ai didi

c++ - 在 MPI 进程之间交换数据(晕)

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:06:35 26 4
gpt4 key购买 nike

给定以下场景,我有 N 个 MPI 进程,每个进程都有一个对象。当通信阶段到来时,将交换来自这些对象的“通常很小”的数据。一般来说,任意两个节点之间都存在数据交换。

什么是最好的策略?:

  • 在任何节点 X 中,为与该节点 X 连接的每个其他节点创建两个缓冲区,然后在对等基础上进行发送/接收。
  • 在每个节点 X 中,创建一个缓冲区来收集所有要通信的光环数据。然后“广播”该缓冲区。

  • 还有其他我不知道的策略吗?

最佳答案

对于最近邻样式的光环交换,通常最有效的实现之一是使用一组 MPI_Sendrecv 调用,通常每个维度两个:

半步一 - 正向传输数据:每个等级从其左侧的等级接收数据并进入其左侧光环,并将数据发送至其右侧的等级

    +-+-+---------+-+-+     +-+-+---------+-+-+     +-+-+---------+-+-+
--> |R| | (i,j-1) |S| | --> |R| | (i,j) |S| | --> |R| | (i,j+1) |S| | -->
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+

(S 指定正在通信的本地数据部分,而 R 指定正在接收数据的光环,(i,j)是进程网格中rank的坐标)

半步二 - 负向传输数据:每个等级从其右侧的等级接收数据并进入其右侧光环,并将数据发送至其左侧的等级

    +-+-+---------+-+-+     +-+-+---------+-+-+     +-+-+---------+-+-+
<-- |X|S| (i,j-1) | |R| <-- |X|S| (i,j) | |R| <-- |X|S| (i,j+1) | |R| <--
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+

(X 是在前半步中已经填充的那部分光环区域)

大多数交换网络支持多个同时双向(全双工)通信,整个交换的延迟为

上述两个半步的重复次数与域分解的维数一样多。

该过程在标准的 3.0 版中更加简化,它引入了所谓的邻里集体通信。整个多维光环交换可以使用对 MPI_Neighbor_alltoallw 的单个调用来执行。

关于c++ - 在 MPI 进程之间交换数据(晕),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com