c - 如何在混合 openMP/MPI 程序中设置多个线程

标签 c multithreading parallel-processing openmp openmpi

我写了一个混合的 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-torankfile 设置)。

第三种变体(当您的线程数小于或等于 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/

相关文章:

c++ - OpenMP 从并行 for 循环调用并行函数

ios - 并行 GCD block 中的每线程数据? (翻译自 OpenMP)

c - 翻译内联汇编以支持 x64

android - hrtimer 的触发时间比我设定的要早

c - 具有多个数据字段的通用列表 C

java - Android并发使用情况

c - 是否需要将 free() 参数转换为 void *?

java - 第一个线程出现 NullPointerException

multithreading - 用于优化性能的Elasticsearch文档结构

python - 如何处理在 Python 中并行运行的子进程的用户输入?