Parallel processing OpenMP,使用所有具有并行

Parallel processing OpenMP,使用所有具有并行,parallel-processing,openmp,Parallel Processing,Openmp,我有一台4核的计算机和一个OMP应用程序,它有两个重要的任务 int main() { #pragma omp parallel sections { #pragma omp section WeightyTask1(); #pragma omp section WeightyTask2(); } return 0; } 每项任务都有如此重要的部分: #omp pragma parallel f

我有一台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++)
{
    ...
}
#omp pragma并行
对于(int i=0;i
我用
-fopenmp
参数编译程序,使
导出OMP\u NUM\u THREADS=4

问题是只加载了两个磁芯。如何在任务中使用所有内核?

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

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

编辑如果并行for循环的数量很大(比如说,不少于8次迭代),并且使用的内核不超过2个,请查看

  • 此环境变量启用或禁用嵌套并行性。通过调用
    omp\u set\u nested()
    运行时库函数,可以覆盖此环境变量的设置

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

    在当前的实现中,嵌套的并行区域总是序列化的。因此,
    OMP\u SET\u NESTED
    没有任何效果,
    OMP\u get\u NESTED()
    始终返回0。如果-qsmp=nested_par选项处于启用状态(仅在非严格OMP模式下),嵌套并行区域可能会使用其他可用线程。但是,不会创建新团队来运行嵌套的并行区域。 OMP\U嵌套的默认值为FALSE。


我是否应该为
循环使用两个
?(i从0到N/2-1)和(i从N/2到N-1)?