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