如何在 hybrid openMP/MPI 程序中设置多个线程

How to set several number of threads in hybrid openMP/MPI program

我写了一个混合 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

您的所有 MPI 进程都有全局环境设置 "OMP_NUM_THREADS"。这个设置对他们每个人都是一样的,你想为不同的mpi进程有不同的线程数,所以你不应该把它设置为全局变量。

我可以建议两种变体。首先是删除 -x 选项并将您的“./program”替换为一些 bash 脚本“./program_script.sh”,这将从 mpirun 获取进程 ID(使用 mpirun -np 2 env查找具有进程 ID 的变量名称)并为具有此 ID 的 mpi 进程设置 "OMP_NUM_THREADS" 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 (check with --report-bindings, set with --bind-to or rankfile).

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