我写了一个混合的 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
选项并用一些 bash 脚本“./program_script.sh
”替换你的“./program
”,这将从 mpirun 获取进程 ID(使用 mpirun -np 2 env
查找具有进程 ID 的变量名称)并为具有此 ID 的 mpi 进程设置正确的“OMP_NUM_THREADS”环境变量值,然后启动您的 ./程序
.
第二种变体是删除-x
选项并使用标准omp_set_num_threads()
直接从您的MPI 进程设置线程数。调用 OpenMP 标准:
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-to
或 rankfile 设置)。
第三种变体(当您的线程数小于或等于 cpu 核心数时)是删除 -x
选项并从您的 mpirun 设置正确的 cpu 绑定(bind):启用核心 0 和 1第一个 MPI 进程和核心 2、3、4、5、6、8 用于第二个 MPI 进程。大多数 OpenMP 库将感知允许的 cpu 设置并默认启动 one thread per CPU .
关于c - 如何在混合 openMP/MPI 程序中设置多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308446/