如何在混合openMP / MPI程序中设置多个线程数

时间:2017-02-17 22:27:26

标签: c multithreading parallel-processing openmp openmpi

我写了一个混合的openMP / MPI程序,我把它称为如下

mpirun -np ncores --bind-to none -x OMP_NUM_THREADS=nthreads ./program

其中ncores是非共享内存进程(MPI)的数量,nthreads是共享内存线程数(OpenMP)。

这意味着在每个ncores中,程序将在nthreads上执行。

我不想在每个核心都有nthreads,但我更感兴趣的是为每个核心改变这个数字。例如如果ncores = 2我想在核心1上设置2个线程,在核心2上设置6个线程。

有办法吗?

我正在使用Open MPI 1.10.3

1 个答案:

答案 0 :(得分:2)

您拥有全球环境设置" OMP_NUM_THREADS"适用于所有MPI流程。这个设置对于每个设置都是相同的,并且您希望为各种mpi进程设置不同的线程编号,因此不应将其设置为全局变量。

我可以建议两种变体。首先是删除-x选项并替换您的" ./program"使用一些bash脚本" ./program_script.sh",它将从mpirun获取进程ID(使用mpirun -np 2 env查找具有进程ID的变量名称)并设置正确的值" OMP_NUM_THREADS"使用此ID的mpi进程的env变量,然后启动./program

第二个变体是删除-x选项并使用OpenMP标准的omp_set_num_threads()调用直接从MPI进程设置线程数:

MPI_Comm_size(MPI_COMM_WORLD,&nproc);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if(rank == 0) {
   omp_set_num_threads(2);
}
if(rank == 1) {
   omp_set_num_threads(6);
}

请勿忘记设置正确的CPU binding in your mpirun(使用--report-bindings查看,--bind-torankfile设置。

第三种变体(当你的线程数小于或等于cpu核心数时)是删除-x选项,只需从你的mpirun设置正确的cpu绑定:为第一个MPI进程启用核心0和1核心2,3,4,5,6,8用于您的第二个MPI流程。大多数OpenMP库将检测允许的cpu集并默认启动one thread per CPU