小编xcs*_*ski的帖子

确保混合 MPI/OpenMP 在不同的内核上运行每个 OpenMP 线程

我正在尝试运行混合 OpenMP/MPI 作业,以便 OpenMP 线程由内核分隔(每个内核只有一个线程)。我已经看到其他使用 numa-ctl 和 bash 脚本来设置环境变量的答案,我不想这样做。

我希望只能通过在命令行上设置 OMP_NUM_THREADS 和或 OMP_PROC_BIND 和 mpiexec 选项来做到这一点。我尝试了以下方法 - 假设我想要 2 个 MPI 进程,每个进程都有 2 个 OpenMP 线程,并且每个线程都在不同的内核上运行,所以我总共需要 4 个内核。

OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 
Run Code Online (Sandbox Code Playgroud)

这将拆分作业,以便只有两个进程在工作,并且它们都在同一个 CPU 上,因此它们每个只使用大约 25% 的 CPU。如果我尝试:

OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2
Run Code Online (Sandbox Code Playgroud)

然后,我只得到两个独立的 MPI 进程,每个进程都以 100% 或超过 100% 的 CPU 功率运行,根据 top。这似乎没有显示用于 OpenMP 线程的不同内核。

如何强制系统将单独的线程放在单独的内核上?

仅供参考,lscpu 打印:

-CPU(s):                48
-On-line CPU(s) list:   0-47
-Thread(s) per core:    2
-Core(s) per socket:    12
-Socket(s):             2
-NUMA node(s):          2
Run Code Online (Sandbox Code Playgroud)

hpc mpi openmp mpich

6
推荐指数
1
解决办法
1701
查看次数

使用#omp时,与'operator - '不匹配

我正在向现有代码添加OpenMP,并尝试并行化下面的for循环.Block是代码中实现的容器.运算符<和++是为Block容器实现的.

#pragma omp parallel for // code compiles without this line
for ( Block::iterator it = initValue; it < blockEnd; ++it ) {
  // LOOP BODY
}
Run Code Online (Sandbox Code Playgroud)

当OpenMP pragma存在时,我收到以下错误:

No match for 'operator-' (operand types are Block::iterator and Block::iterator)
Run Code Online (Sandbox Code Playgroud)

如果我把pragma取出来,代码编译得很好,所以我确信我的运算符定义是正确的.为什么OpenMP需要在这里实现'operator-'?

编译器:gcc 7.2.1 OpenMP 4.0

c++ openmp

2
推荐指数
2
解决办法
99
查看次数

为什么'#pragma omp critical'部分不能在同一行上打开括号?

我一直遇到编译器错误,我忘记#pragma omp critical在语句后面的行上放置一个开头大括号,而不是在同一行:

  #pragma omp parallel 
  {

  static int i = 0;

  // this code fails to compile
  #pragma omp critical {
    i++;
  }

  // this code compiles fine
  #pragma omp critical 
  {
    i++;
  }

  }
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么编译器不能解析同一行上的大括号?它可以为任何C++语法执行此操作.为什么白色空间对OpenMP #pragma语句很重要,当它不在C++中时?

c++ compiler-errors openmp

1
推荐指数
1
解决办法
1100
查看次数

标签 统计

openmp ×3

c++ ×2

compiler-errors ×1

hpc ×1

mpi ×1

mpich ×1