【发布时间】:2013-01-15 19:42:43
【问题描述】:
我正在使用 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 显式注释时具有并行性?
【问题讨论】:
-
我不知道 gcc 会神奇地并行化任何你没有在默认情况下明确告诉它的东西......
-
@PlasmaHH 我告诉它使用
-O3进行优化。我是在告诉它在任何地方自动并行吗? -
@cls:我很确定 gcc 不会进行任何类型的隐式自动并行化(因为它不能)。
-
除非你用
-ftree-parallelize-loops=<nthreads>明确启用了自动循环并行化,否则你应该使用调试器或线程检查器工具(这些通常提供线程活动的漂亮图表)来调查另一个150%的CPU使用率来自。 (顺便说一句,你如何在一台 16 核的机器上获得 15000% 的 CPU 使用率?) -
@cls 我曾经有过类似的效果,即非线程程序启动了许多线程。我们将其追溯到我们链接到的 boehm 垃圾收集。我们的测试代码创建了许多对象,这些对象随后被垃圾回收,并且 gc 库被线程化。
标签: c++ gcc parallel-processing openmp