OpenMP,使用并行的所有核心
我有4核心的计算机和OMP应用程序与2重任务。OpenMP,使用并行的所有核心
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
。 问题是只有两个核心加载。我如何在我的任务中使用所有内核?
我最初的反应是:你必须声明更多的并行性。
您已经定义了两个可以并行运行的任务。 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。
谢谢。我会试试这个。 –
是的,就是这样。谢谢。 –
我应该用两个'for'循环? (i从0到N/2 - 1)和(i从N/2到N-1)? –