OpenMP:在每个线程中都有一个完整的'for'循环

时间:2015-01-10 14:44:01

标签: c++ multithreading openmp

我有这段代码:

#pragma omp parallel
{
  #pragma omp single
  {
    for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction();
  }

  #pragma omp single
  {
    for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction();
  }
}

// and so on... up to 5 or 6 of myObject_x

// Then I sum up the buffers and do something with them
float result;
for (int i=0; i<given_number; ++i)
  result = myBuffer_1[i] + myBuffer_2[i];

// do something with result

如果我运行此代码,我会得到我的期望,但CPU使用率看起来很高。相反,如果我在没有OpenMP的情况下正常运行,我会得到相同的结果,但CPU使用率要低得多,尽管在单个线程中运行。

我不想指定多个线程,我希望程序根据CPU功能选择最大线程数,但我希望每个for循环完全在自己的线程中运行。我怎样才能做到这一点?

另外,我的期望是myBuffer_1的for循环运行一个线程,另一个for循环运行另一个线程,其余的运行在&#39; master&#39;线。这是对的吗?

1 个答案:

答案 0 :(得分:0)

  1. #pragma omp single最后有一个隐含障碍,如果您希望同时运行两个#pragma omp single nowait块,则需要使用single

  2. 但是,根据您的要求,使用section可能是一个更好的主意

    #pragma omp parallel
    {
        #pragma omp sections 
        {
            #pragma omp section 
            {
                for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction();  
            }
            #pragma omp section
            {
                for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction();  
            }
        }
    
    }
    
相关问题