我的计算机有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
。
问题是仅加载了两个核心。如何在我的任务中使用所有核心?
答案 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_par选项打开(仅在非严格OMP模式下),嵌套并行区域可能会使用其他线程可用。但是,不会创建新的团队来运行嵌套的并行区域。 OMP_NESTED的默认值为FALSE。