c++ - super 计算机上的 OpenMP

标签 c++ mpi openmp

在我的本地集群上,我可以使用此脚本跨 36 个内核并行化我的 OpenMP 代码

#$ -S /bin/bash
#$ -N name_of_project
#$ -o output.out
#$ -pe orte 36
#$ -V
#$ -cwd

export OMP_NUM_THREADS=36
./my_programme

我可以在 4 个节点的 36 个内核上运行 OpenMP c++ 代码...

但是,在作为 XSEDE 一部分的 super 计算设施上:

https://portal.xsede.org/tacc-stampede

我被告知我只能在具有 16 个内核的 1 个节点上运行 OpenMP。我有点困惑,所以如果我想用超过 17 个有效线程并行化我的程序,我必须将我的程序重新编码为 MPI 程序吗?

请问OpenMP程序转换成MPI程序有多难?谢谢。

最佳答案

If I would like parallelize my programme with effectively more than 17 threads, I have to recode my programme into an MPI programme ?

是的,您需要编写一些 MPI 代码才能利用您可以支配的节点。 OpenMP 以共享内存架构为目标,您需要一个消息传递库以便在节点之间进行通信。

并行化分布式架构是不同的(您不能像在 OpenMP 中那样进行 for 循环并行化),因为每个节点都有自己的共享内存,并且一个节点无法知道其他节点的状态以同步工作。你必须自己做。

I would like to ask how difficult it is to convert a OpenMP programme into an MPI programme?

MPI 并行化可能非常简单,具体取决于您的应用程序和您编写代码的方式。您应该详细说明您的算法以便进行判断。大行是:

  • Embarrasingly parallel problem具有静态工作负载:每个 MPI 节点都具有相同的工作量并执行相同的工作,与其他节点没有交互或交互很少。如果您的应用程序属于此类,那么并行化是直接的,可以使用 collective MPI routines 完成。 .尽管如此,您仍需要编写并理解 MPI 的工作原理。
  • 更复杂的并行问题/动态工作负载:您的问题需要同步,节点之间的某些通信和/或工作量未知,您需要负载平衡策略。这就是 HPC 家伙谋生的方式:)

希望你能进入第一组!

最后,乐趣从这里开始,为了获得良好的加速,您将需要找到折衷方案并尝试一些事情,因为您将拥有混合 OpenMP/MPI 并行化。

关于c++ - super 计算机上的 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389410/

相关文章:

c++ - 有没有办法区分对象实例使用的是什么类型的内存?

C++ 只读数组文字

c - C 中的 MPI_Testsome 和 MPI_Iprobe

c++ - 谐波级数和 c++ MPI 和 OpenMP

c++ - 分析 OpenMP 并行化 C++ 代码

c++ - C/C++ 中 MySQL 的静态链接

c++ - 多个类文件 C++

c - 处理 void 数据类型的指针算法

compilation - 编译期间openmpi错误

c - 并行化变量声明是否有益?