我有一个处理数字的 C/C++ 应用程序。它基本上是不同数据集的主循环。我们可以访问具有可用 openmp 和 mpi 的 100 节点集群。我想加快应用程序的速度,但我是 mpi 和 openmp 的绝对新手。我只是想知道即使性能不是最好的,什么是最容易学习和调试的。
我也想知道什么是最适合我的主循环应用程序的。
谢谢
如果您的程序只是一个大循环,使用 OpenMP 可以像编写一样简单:
#pragma omp parallel for
OpenMP 仅对共享内存编程有用,除非您的集群运行类似kerrighed的程序,否则使用 OpenMP 的并行版本一次最多只能在一个节点上运行。
MPI 基于消息传递,入门稍微复杂一些。优点是您的程序可以同时在多个节点上运行,并在需要时在它们之间传递消息。
鉴于您说“针对不同的数据集”,听起来您的问题实际上可能属于“令人尴尬的并行”类别,如果您有 100 多个数据集,您可以设置调度程序为每个节点运行一个数据集直到它们全部完成,无需修改代码,并且比仅使用单个节点的速度快近 100 倍。
例如,如果您的集群使用 condor 作为调度程序,那么您可以将每个数据项 1 个作业提交到“vanilla”宇宙,仅更改作业描述的“Arguments =”行。(对于 Condor,还有其他方法可以做到这一点,这可能更明智,扭矩、sge 等也有类似的东西。)
OpenMP 本质上是用于 SMP 机器的,所以如果你想扩展到数百个节点,无论如何你都需要 MPI。但是,您可以同时使用两者。MPI 用于跨节点分配工作,OpenMP 用于处理跨内核或每个节点的多个 CPU 的并行性。我会说 OpenMP 比使用 pthread 容易得多。但它的粒度更粗,从 OpenMP 获得的速度通常低于手动优化的 pthreads 实现。