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