是否可以使用gcc关闭任何自动并行化?

时间:2013-01-31 16:19:06

标签: c++ gcc parallel-processing openmp

我正在使用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明确注释?

1 个答案:

答案 0 :(得分:2)

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

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