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. 问题是只加载了两个核心。如何在我的任务中使用所有核心?
我最初的反应是:你必须声明更多的并行性。
您定义了两个可以并行运行的任务。OpenMP 在两个以上内核上运行它的任何尝试都会减慢您的速度(因为缓存局部性和可能的错误共享)。
编辑如果并行 for 循环具有任何显着的体积(例如,不低于 8 次迭代),并且您没有看到使用超过 2 个核心,请查看
omp_set_nested()此环境变量启用或禁用嵌套并行性。可以通过调用运行时库函数来覆盖此环境变量的设置
omp_set_nested()。如果禁用嵌套并行性,则嵌套并行区域将被序列化并在当前线程中运行。
在当前的实现中,嵌套并行区域始终是序列化的。因此,
OMP_SET_NESTED没有任何效果,并且omp_get_nested()始终返回 0。如果启用 -qsmp=nested_par 选项(仅在非严格 OMP 模式下),则嵌套并行区域可能会使用其他可用线程。但是,不会创建新团队来运行嵌套并行区域。 OMP_NESTED 的默认值为 FALSE。