C++ 超级计算机上的OpenMP

C++ 超级计算机上的OpenMP,c++,mpi,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 我可以在36个核心上运行OpenMP C++代码,其中有4个节点… 但是,在作为XSEDE一部分的超级计算设施上: 我被告知我只能在1个16核的节点上运行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

我可以在36个核心上运行OpenMP C++代码,其中有4个节点…

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

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

我想问一下,将OpenMP程序转换为MPI程序有多困难?多谢各位

如果我想将我的程序与17个以上的程序并行 线程,我必须将我的程序重新编码为MPI程序吗

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

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

我想问一下转换OpenMP程序有多困难 进入MPI课程

MPI并行化可以非常简单,这取决于您的应用程序和编写代码的方式。为了判断这一点,你应该详细说明你的算法。大线是:

  • 静态工作负载:每个MPI节点都有相同的工作量,并且在没有或很少与其他节点交互的情况下执行相同的工作。如果您的应用程序进入这一类别,那么并行化将是严格的,并且可以使用。不过,您仍然需要编写并理解MPI是如何工作的
  • 更复杂的并行问题/动态工作负载:您的问题需要同步,节点之间的某些通信和/或工作量未知,您需要负载平衡策略。这就是HPC的花花公子们的谋生之道:)
我希望你进入第一类


最后,乐趣从这里开始,为了有一个好的加速,你需要找到折衷办法,玩一些东西,因为你将有一个混合OpenMP/MPI并行化。

你不应该尝试将OpenMP转换为MPI。OpenMP是一种共享内存编程模型。MPI主要是一种分布式内存编程模型。从共享到分布式数据结构需要仔细设计。OpenMPI是MPI的一种实现。这让人困惑,但请试着区分两者。但我需要在我的代码上进行非常大的并行化(需要500多个线程)。。。看起来唯一可行的方法就是进行转换……在进入这个领域之前,你可能需要与HPC用户支持人员进行沟通,也许还需要与google进行MPI替代方案的沟通。如果您真的需要扩展到500个线程以上,您可能需要学习MPI。MPI与OpenMP非常不同。取决于你需要做什么,这可能很难,也需要时间。当我用谷歌搜索“openmp到mpi”时,一些有趣的搜索结果已经弹出了。如果你再多研究一下,也许你能找到一个简单的解决办法。