【问题标题】:How to set several number of threads in hybrid openMP/MPI program如何在混合 openMP/MPI 程序中设置多个线程
【发布时间】:2017-07-07 14:24:42
【问题描述】:

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

【问题讨论】:

  • 你的计算系统的配置是什么:节点数,每个节点上的cpu核心数。你可以改变 mpirun 行中的两个参数:ncores 和 nthreads。如果你的一些 MPI 进程(id 为 0)想要 2 个线程而其他 MPI 进程(id 1)想要 6 个线程,不要使用全局环境变量,切换到 omp_set_num_threads function

标签: c multithreading parallel-processing openmp openmpi


【解决方案1】:

您的所有 MPI 进程都有全局环境设置“OMP_NUM_THREADS”。这个设置对每个都是一样的,你希望不同的mpi进程有不同的线程号,所以你不应该把它设置为全局变量。

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

第二种变体是删除-x 选项并使用OpenMP Standard 的标准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 进程和核心 2 启用核心 0 和 1 ,3,4,5,6,8 用于您的第二个 MPI 过程。大多数 OpenMP 库会感知允许的 cpu 集并默认启动 one thread per CPU

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2016-02-08
    • 2013-11-15
    • 2019-01-15
    • 2015-03-26
    • 2017-12-15
    • 2018-05-29
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多