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

OpenMP: having a complete 'for' loop into each thread

本文关键字:有一个 for 循环 线程 OpenMP      更新时间:2023-10-16

我有这个代码:

#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循环运行另一个线程,其余的在"主"线程中运行。这是对的吗?

  1. #pragma omp single末尾有一个隐式屏障,如果您希望两个single块同时运行,则需要使用 #pragma omp single nowait

  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();  
            }
        }
    }
    
相关文章: