【发布时间】: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 的幂,我怀疑它们不能使用超立方体方法。是这样吗?我找不到该例程的实现细节。您对实施有任何想法吗?
标签: parallel-processing mpi distributed-computing message-passing