【问题标题】:Is it possible to turn off any autoparallelization with gcc?是否可以使用 gcc 关闭任何自动并行化?
【发布时间】: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=&lt;nthreads&gt; 明确启用了自动循环并行化,否则你应该使用调试器或线程检查器工具(这些通常提供线程活动的漂亮图表)来调查另一个150%的CPU使用率来自。 (顺便说一句,你如何在一台 16 核的机器上获得 15000% 的 CPU 使用率?)
  • @cls 我曾经有过类似的效果,即非线程程序启动了许多线程。我们将其追溯到我们链接到的 boehm 垃圾收集。我们的测试代码创建了许多对象,这些对象随后被垃圾回收,并且 gc 库被线程化。

标签: c++ gcc parallel-processing openmp


【解决方案1】:

请注意,OpenMP if 子句对并发施加运行时而非编译时控制。这意味着虽然if 子句中的条件在程序执行时可能评估为假,这通过将其团队中的线程数设置为 1 来停用parallel 区域,但该区域仍将扩展到多个运行时调用并为其主体提供一个单独的函数,尽管这不会导致并行执行。 OpenMP 运行时还可能保持一个正在运行的 OpenMP 线程池忙于等待任务。

保证您的 OpenMP 代码能够编译为明确的串行可执行文件(假设您没有链接到并行库)的唯一方法是在禁用 OpenMP 支持的情况下进行编译。在您的情况下,这意味着在编译代码时没有给 GCC 提供 -fopenmp 选项。

【讨论】:

  • 信息量很大。你认为大约 200% 的 CPU 使用率是由于 OpenMP 运行时使用了这么多周期吗?
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2014-07-17
  • 2020-09-18
相关资源
最近更新 更多