OpenMP,使用并行的所有核心

时间:2011-11-28 22:14:22

标签: parallel-processing openmp

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

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

        #pragma omp section
        WeightyTask2();
    }

    return 0;
}

每项任务都有如此重要的部分:

#omp pragma parallel for
for (int i = 0; i < N; i++)
{
    ...
}

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  • omp_set_nested()
  • OMP_NESTED=TRUE|FALSE environment variable

      

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

         

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

         

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