假设有一台计算机,其中有4个CPU,每个CPU都有2个核心,因此总共有8个核心。根据我有限的理解,我认为在这种情况下所有处理器共享同一内存。现在问题是,是直接使用openMP好,还是使用MPI使其通用,以便代码可以在分布式和共享设置上工作。此外,如果我在共享设置中使用MPI,与openMP相比,性能是否会降低?
假设有一台计算机,其中有4个CPU,每个CPU都有2个核心,因此总共有8个核心。根据我有限的理解,我认为在这种情况下所有处理器共享同一内存。现在问题是,是直接使用openMP好,还是使用MPI使其通用,以便代码可以在分布式和共享设置上工作。此外,如果我在共享设置中使用MPI,与openMP相比,性能是否会降低?
总结
如果您的问题足够小,在一台节点上运行,请使用OpenMP。如果您知道需要多个节点(因此肯定需要MPI),但更注重代码可读性/努力而不是性能,请仅使用MPI。如果仅使用MPI不能为您提供所需的加速,则必须全部使用,并采用混合方法。
对于您的第二个问题(如果尚不清楚):
如果您的设置根本不需要MPI(因为您将始终仅在一个节点上运行),请使用OpenMP,因为它会更快。但是如果您知道无论如何都需要MPI,则应从那里开始,只有在知道已经耗尽MPI的所有合理优化选项后才添加OpenMP。
现在大多数分布式内存平台都由SMP或NUMA节点组成,因此不使用OpenMP是没有意义的。OpenMP和MPI可以完美地协同工作; OpenMP为每个节点上的核心提供数据,而MPI则在节点之间进行通信。这被称为混合编程。10年前它被认为是异端邪说,但现在在高性能计算中变得越来越流行。
至于问题本身,根据所提供的信息,正确答案始终是一个: 取决于具体情况。
如果您在单个共享内存机器上使用,我建议使用OpenMP。它使问题的某些方面更简单,并且可能更快。
如果您计划将来转移到分布式内存机器,则使用MPI。这样可以避免解决同一问题两次。
我之所以说 OpenMP 可能会更快是因为 MPI 的一个好实现可能足够聪明,能够发现它正在一个共享内存环境中使用并相应地优化其行为。