我想要一个程序并行化。线程在共享内存中的一个大数据结构上工作并不困难。 但是我希望能够使用在群集上分发它,我必须选择一种技术来做到这一点。 MPI是一个想法。
问题是,如果我跳过共享内存专用版本的实现并让MPI处理所有情况,那么开销会有多少MPI(或其他技术)?
更新
我想在许多计算机上同时发展大型数据结构(游戏树)。 它的大多数部分只在一个集群节点上,但有些部分(树的顶部不规则)将不时被共享和同步。
在共享内存机器上,我希望通过共享内存实现这一点。 一般可以这样做吗?
答案 0 :(得分:1)
所有流行的MPI实现都将通过共享内存在本地进行通信。只要您没有花费所有时间打包和拆包缓冲区(即您的设计合理),性能非常好。实际上,MPI强加给您的设计可以比大多数线程实现更好地执行,因为单独的地址空间可以提高缓存一致性。为了始终如一地击败MPI,线程实现必须了解缓存层次结构以及其他内核正在处理的内容。
有了良好的网络硬件(如InfiniBand),HCA负责让您的缓冲区进出网络,以便CPU可以做其他事情。此外,由于许多作业的存储器带宽有限,因此它们的使用效果会更好,例如:多个节点上每个套接字上的核心比每个插槽使用多个核心时要多。
答案 1 :(得分:0)
这取决于算法。 Clealy群集间通信比共享内存慢几个数量级,无论是进程间通信还是进程内的多个线程。因此,您希望最小化群集间流量,例如。通过在可能和可行的情况下复制数据或以最小化节点间通信的方式解决问题。
对于具有很少节点间通信的“尴尬”并行算法,这是一个简单的选择 - 这些问题包括强力搜索加密密钥,其中每个节点可以长时间处理数字并定期向中心节点报告,但没有通信需要测试密钥。