当使用更少的线程时,openmp如何工作

时间:2019-02-06 23:33:38

标签: c++ openmp

我的计算机有16个核心。 我的程序如下:

omp_set_num_threads(16);
....
#pragma omp parallel for num_threads(2)
for(int i =1; i<=2; ++i)
{
 \\time consuming operations
 }

#pragma omp parallel for num_threads(2)#pragma omp parallel for num_threads(16)哪个更有效?还是它们相同,因为它是共享内存?请注意我的循环迭代小于16的事实。

2 个答案:

答案 0 :(得分:1)

省略任何手动规范,例如omp_set_num_threadsnum_threads,然后让实现方案找出来。

实际上,这两种方法都没有明显的区别。

omp_set_num_threads是完全多余的,因为它仅适用于后续 没有指定num_threads子句的并行区域。因此,如果您觉得必须使用,请使用omp_set_num_threadsnum_threads子句,因为这会使读者感到困惑。

可以想象,num_threads(2)(无论如何指定)会更好。它用于创建更少线程的初始化开销较小。那可能没关系。有一个理论上的论点,即多余的线程无用可做,可能会在等待时耗尽共享资源(具有超线程,powercap的共享核)-仍然没关系,因为OpenMP实现不会无限期地等待。

另一方面,手动指定num_threads(2)会创建冗余。如果您的循环更改为三个迭代,但您忘记了该怎么办?您浪费性能。同样的代码“ 我放置num_threads(X)是因为我有X内核”。

再次,只需忽略它。但是,请定期测量您的应用程序。如果您有特定迹象表明可能存在相关的性能问题,请根据具体可行的措施重新评估选择。

答案 1 :(得分:0)

看起来for循环根本不是一个for循环:您只有两次迭代。更好的解决方案可能是使用 OpenMP sections

#pragma omp parallel sections
{
    #pragma omp section
    {
        // Time-consuming operations
    }
    #pragma omp section 
    {
        // Other independent time-consuming operations
    }
}
相关问题