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的主要内容,如果未能解决你的问题,请参考以下文章

SQL:多对多关系和“ALL”子句

探测 MPI_Bcast 或 MPI_Send

实现promise.all方法

小优机器人WIFI+SSDP入网具体实现

MPI简介

MPI基础知识