2011-11-28 75 views
2

我有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问题只有两个核心加载。我如何在我的任务中使用所有内核?

+0

我应该用两个'for'循环? (i从0到N/2 - 1)和(i从N/2到N-1)? –

回答

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。

+0

谢谢。我会试试这个。 –

+0

是的,就是这样。谢谢。 –