2

我正在使用 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 使用率。

我想这是由于正在进行一些自动并行化。正确的?海湾合作委员会会这样做吗?

由于我需要比较顺序运行时间和并行运行时间,我希望未使用 ( #pragma omp parallel...etc.) 注释的代码仅在一个 CPU 上运行。我可以轻松实现这一目标吗?是否有一个 GCC 标志,我可以通过它切换自动并行化并在我用 OpenMP 显式注释的地方具有并行性?

4

1 回答 1

2

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

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

于 2013-01-31T17:43:24.893 回答