如何在 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.
我写了一个混合 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.