我正在尝试运行混合 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) 我正在向现有代码添加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
我一直遇到编译器错误,我忘记#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++中时?