从纯OpenMP迁移到与MPI的混合

时间:2014-06-13 23:59:39

标签: parallel-processing mpi openmp

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

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

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

#!/bin/bash -l
#PBS -l nodes=40:ppn=8
...
export OMP_NUM_THREADS=16
...

或者我是否需要通过使用MPI_INIT_THREAD这样的替代例程来深入思考?

============= [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的支持。

1 个答案:

答案 0 :(得分:2)

确实,只要你从不在并行部分调用MPI函数,就不需要在MPI方面做任何特殊的事情。如果您打算这样做,则需要使用MPI_INIT_THREAD并提供所需的线程安全级别。

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