Parallel processing 使用MPI从纯OpenMP迁移到hyprid

Parallel processing 使用MPI从纯OpenMP迁移到hyprid,parallel-processing,mpi,openmp,Parallel Processing,Mpi,Openmp,我正在为一个相当令人畏惧的高维问题进行全局最大化。为了让我的生活更轻松,我的构建块程序被移植到OpenMP,并且运行良好 主程序实际上由4个构建块程序组成,每个程序在不同的设置下工作。我的真正任务是为主程序提供一长串参数组合。我克服这一挑战的初步想法是将列表并行地分成10个较小的部分 假设我拥有的计算能力是一个高性能集群,其中一个节点有8个核心(或16个线程)。我的问题是:我只是简单地使用通常的MPI例程(如MPI_INIT及其伙伴)来完成我的程序从OpenMP到混合MPI的扩展,这是正确的吗?

我正在为一个相当令人畏惧的高维问题进行全局最大化。为了让我的生活更轻松,我的构建块程序被移植到OpenMP,并且运行良好

主程序实际上由4个构建块程序组成,每个程序在不同的设置下工作。我的真正任务是为主程序提供一长串参数组合。我克服这一挑战的初步想法是将列表并行地分成10个较小的部分

假设我拥有的计算能力是一个高性能集群,其中一个节点有8个核心(或16个线程)。我的问题是:我只是简单地使用通常的MPI例程(如MPI_INIT及其伙伴)来完成我的程序从OpenMP到混合MPI的扩展,这是正确的吗?我在PBS脚本中简单地指定以下内容是否正确:

#!/bin/bash -l
#PBS -l nodes=40:ppn=8
...
export OMP_NUM_THREADS=16
...
或者我需要通过使用替代例程(如MPI_INIT_线程)来更深入地思考我的工作吗

=============[2014年6月24日编辑]

这是我最终为我的多线程MPI程序找到的PBS文件(没有跨OMP和MPI的重叠通信)。我的程序是这样工作的:每个节点执行一个多线程MPI进程。每个节点都将工作负载完全转移到与其物理关联的所有线程。此外,由于我也在使用“英特尔MKL”和“英特尔MPI”,我在下面的PBS脚本中做了相应的调整

1 #!/bin/bash -l
2 #PBS -l walltime=01:00:00,nodes=32:ppn=8,pmem=2000mb
3 export OMP_NUM_THREADS=8
4 cd $PBS_O_WORKDIR 
5 mpirun -perhost 1 -np 32 -hostfile "$PBS_NODEFILE" \
6   -env I_MPI_PIN_DOMAIN omp \
7   -env KMP_AFFINITY compact ./main 

此外,请确保将-mt_mpi添加到编译器标志中,以正确启用对“英特尔MKL”的支持

诚然,这里不需要对MPI执行任何特殊操作,只要您从未在并行部分调用MPI函数。如果要这样做,需要使用
MPI\u INIT\u THREAD
,并提供所需的线程安全级别


实际上,无论如何,你都应该这样做。如果您不打算并行执行多个MPI调用,那么您可以使用
MPI\u THREAD\u FUNNELED
,否则,您可能需要
MPI\u THREAD\u multiple

我只想确认一下。你是说只要我不在OpenMP并行部分调用MPI函数,我从纯OpenMP扩展到它与MPI的混合就相当简单了?也就是说,如果我的主程序的结构类似于MPI_INIT()和MPI_FINALIZE()将Openmp并行区域括起来就可以了,但反过来就不行了?谢谢。不用了,您仍然只需在整个程序的开始和结束时调用init并完成一次。不同之处在于,如果要在OpenMP并行部分内执行MPI调用,如
MPI\u SEND
MPI\u RECV
,则需要在调用
MPI\u INIT
后立即使用
MPI\u THREAD\u MULTIPLE
调用
MPI\u INIT\u THREAD
。如果您打算使用OpenMP,您仍然应该在
MPI_INIT
之后调用
MPI_INIT_THREAD
,并使用
MPI_THREAD\u漏斗状
来指示只有一个线程将调用MPI函数。手册页上的更多内容:谢谢,这非常有用。@Wesley Bland我仍然有点困惑。在不考虑多线程的情况下,线程是否准确地表示核心?假设我的程序在多个节点上运行(每个节点都有多个核心/线程)。如果我的程序的OpenMP部分协调单个节点上的所有核心以执行一些并行计算,而我的程序的MPI部分则留在OpenMP并行区域之外,以仅负责节点之间的普通发送/接收通信,我想知道在MPI_INIT之后调用MPI_INIT_线程是否也适合我的情况?谢谢。在回答这个问题之前,需要先澄清一些问题<代码>核心。线程是描述轻量级执行环境的软件构造。核心是描述CPU子集的硬件。执行的线程数不一定等于计算机的内核数。现在尝试重新编写您的问题,看看它是否仍然有意义。请注意,如果您有8个内核,使用16个线程可能不是一个好主意。请参阅…在多个节点上运行时,请注意,
导出OMP_NUM_THREADS
行可能仅在第一个节点上执行,其他节点可能仅使用默认数量的线程。如果要在所有线程上更改该环境变量,可能必须将该行放入
.bashrc
(或任何文件)中,或者让启动的可执行文件成为一个脚本,该脚本首先设置环境变量,然后运行真正的可执行文件。