OpenMP,使用所有并行核心

Den*_* P. 6 parallel-processing openmp

我有 4 核计算机和 OMP 应用程序,有 2 个繁重的任务。

int main()
{
    #pragma omp parallel sections
    {
        #pragma omp section
        WeightyTask1();

        #pragma omp section
        WeightyTask2();
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

每项任务都有这样重要的部分:

#omp pragma parallel for
for (int i = 0; i < N; i++)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我用-fopenmp参数编译了程序,制作了export OMP_NUM_THREADS=4. 问题是只加载了两个核心。如何在我的任务中使用所有核心?

seh*_*ehe 5

我最初的反应是:你必须声明更多的并行性。

您定义了两个可以并行运行的任务。OpenMP 在两个以上内核上运行它的任何尝试都会减慢您的速度(因为缓存局部性和可能的​​错误共享)。

编辑如果并行 for 循环具有任何显着的体积(例如,不低于 8 次迭代),并且您没有看到使用超过 2 个核心,请查看

  • omp_set_nested()
  • = |OMP_NESTED​ 环境变量TRUEFALSE

    此环境变量启用或禁用嵌套并行性。可以通过调用运行时库函数来覆盖此环境变量的设置omp_set_nested()

    如果禁用嵌套并行性,则嵌套并行区域将被序列化并在当前线程中运行。

    在当前的实现中,嵌套并行区域始终是序列化的。因此,OMP_SET_NESTED没有任何效果,并且omp_get_nested()始终返回 0。如果启用 -qsmp=nested_pa​​r 选项(仅在非严格 OMP 模式下),则嵌套并行区域可能会使用其他可用线程。但是,不会创建新团队来运行嵌套并行区域。 OMP_NESTED 的默认值为 FALSE。