我正在使用OpenMP进行并行算法。从CPU使用情况来看,我编写的大部分“顺序”代码实际上是并行执行的。
例如:
#pragma omp parallel for if (par == "parallel")
for (int64_t u = 1; u <= n; ++u) {
for (int64_t v = u + 1; v <= n; ++v) {
....
}
}
如果设置了标志,则这是有条件的并行。设置了标志后,我在16核机器上看到CPU使用率为1500%。如果没有设置标志,我仍然会看到250%的CPU使用率。
我想这是由于一些自动并行化的原因。正确? GCC会这样做吗?
由于我需要比较顺序和并行运行时间,我希望没有注释(#pragma omp parallel...
等)的代码只能在一个CPU上运行。我可以轻松实现吗?是否有一个GCC标志,通过它我可以切换自动并行化并具有并行性,我用OpenMP明确注释?
答案 0 :(得分:2)
请注意,OpenMP if
子句对并发执行运行时而不是编译时控制。这意味着虽然if
子句中的条件在执行程序时可能会计算为false,但通过将其团队中的线程数设置为1来停用parallel
区域,该区域仍会扩展几个运行时调用和一个单独的函数,虽然这不会导致并行执行。 OpenMP运行时还可能使正在运行的OpenMP线程池保持忙等待任务。
保证OpenMP代码编译为明确的串行可执行文件(假设您没有链接到并行库)的唯一方法是在禁用OpenMP支持的情况下进行编译。在你的情况下,这意味着在编译代码时没有给GCC提供-fopenmp
选项。