假设我想并行化算法。只有该算法的某些部分可以并行化。其他部分微不足道,不值得分发。我是在我的主节点上进行所有这些微不足道的计算,然后将数据广播到所有剩余的节点,还是在所有处理器上进行这些计算?
编写算法的并行版本。只有哪些部分值得分发
计算科学
mpi
2021-12-19 20:56:00
3个回答
如果操作像你说的那样微不足道,并且每个节点都拥有执行操作所需的所有信息,那么通信将比在每个节点上本地重新计算要昂贵得多。也就是说,编写两个实现并进行比较是一个很好的练习;实验胜过网上陌生人的建议。
任务变得不平凡时的收支平衡点将取决于问题是如何并行化的。同一台机器上的共享内存并行性比跨集群的分布式内存并行性要低得多。就此而言,这可能取决于您的集群是使用以太网还是 infiniband。我经常回顾的一个方便的参考是每个程序员都应该知道的延迟数字。此时它已经 6 岁了,但同样的原则仍然适用。
@Daniel Shapero 的答案的补充。
了解是否存在可能导致不同结果的计算可能也很重要,具体取决于它们启动的机器(或只是因启动而不同),以及您的代码对这些波动的敏感程度。
如果您正在处理的集群是不均匀的(节点可能不同),这些将更加明显。
可能的例子:
- 依赖于随机数生成器的计算(具有非固定种子)
- 浮点计算。这可能与机器对机器(如果架构/操作系统不同)甚至在同一台机器上(例如,已执行 OpenMP 缩减)略有不同。
现在,如果是这种情况并且您未来的计算对此非常敏感,您可能会考虑广播而不是每个人单独计算这一步。
同样,基准测试将为您提供最终答案。
由于您用“MPI”标记了它:没有主节点。太琐碎的事情应该在每个过程中冗余地完成。
请记住,即使通过 MPI 消息发送单个字节也相当于(数万)次操作。
其它你可能感兴趣的问题