All to All 广播实现和 MPI
Posted
技术标签:
【中文标题】All to All 广播实现和 MPI【英文标题】:All to All broadcasting implementation and MPI 【发布时间】:2021-08-11 15:23:06 【问题描述】:我正在学习 MPI,目前正在尝试使用发送和接收操作来实现所有广播。我知道处理器的数量将是 2 的幂,我想为这个问题实施一个有效的解决方案。我按照以下方式组织了我的想法。
all to all in a balanced binary tree with 8 processors
首先,红色复制和交换操作完成。然后绿色的操作应该完成,最后紫色的操作将结束所有对所有的消息共享。
假设:
处理器 0 有消息 A 处理器 1 收到消息 B 处理器 2 有消息 C 处理器 3 有消息 D 处理器 4 有消息 E 处理器 5 收到消息 F 处理器 6 有消息 G 处理器 7 有消息 H一些步骤:
-
处理器 0 与处理器 7 共享其消息,反之亦然。所以他们都有消息 A 和 H。
处理器 1 与处理器 6 共享其消息,反之亦然。所以他们都有消息 B 和 G。
处理器 2 与处理器 5 共享其消息,反之亦然。所以他们都有消息 C 和 F。
处理器 3 与处理器 4 共享其消息,反之亦然。所以他们都有消息D和E。(红色操作在这一步完成。)
处理器 0 与处理器 3 共享其消息,反之亦然。所以他们都有消息 A H D 和 E。
处理器 1 与处理器 2 共享其消息,反之亦然。所以他们都有消息 B G C 和 F
...
鉴于当前处理器的等级,我无法编写令人满意的代码来找出这对。我想在一开始就递归地找出所有可能的对,就像要使用的查找表一样。但是我想问是否有更好的方法可以继续?方法也正确吗?
【问题讨论】:
像for (step=0; ...; step++) peer = rank ^ (1<<step); ...
这样的东西呢
@GillesGouaillardet 我调查了一个超立方体组织来解决同样的问题。并且配对计算是相似的。感谢您的评论,我认为这解决了我的问题。
MPI 自己的 MPI_Alltoall 集体例程应该已经高度优化,因此您应该将自己的点对点实现的性能与此例程进行比较。
@DavidHenty 我完成了实施并将我的结果与您建议的内置版本进行了比较。我可以看到我使用超立方体方法的实现比内置版本快大约 2 倍。我很好奇其中的原因。由于 MPI_Alltoall 例程不假设处理器的数量是 2 的幂,我怀疑它们不能使用超立方体方法。是这样吗?我找不到该例程的实现细节。您对实施有任何想法吗?
【参考方案1】:
基于Gilles Gouaillardet 的评论和我对这个问题进行的其他研究,我解决了我的问题并想分享我在此过程中使用的方法。
首先,在实施 All-to-all 广播之前,我强烈建议您看看这个page。因为对于我的问题,我知道处理器的数量是 2 的幂,所以我使用超立方体方法实现了算法。
procedure ALL_TO_ALL_BC_HCUBE(my_id, my_msg, d, result)
begin
result := my_msg;
for i := 0 to d - 1 do
partner := my id XOR 2i;
send result to partner;
receive msg from partner;
result := result U msg; //U for union
endfor;
end ALL_TO_ALL_BC_HCUBE
算法取自上述页面
我将我的结果与内置的 MPI_Alltoall 例程进行了比较。我实现的运行时似乎比内置版本快 1.5 到 2 倍。
【讨论】:
以上是关于All to All 广播实现和 MPI的主要内容,如果未能解决你的问题,请参考以下文章