c++ - OpenMP:每个线程都有一个完整的 'for' 循环

标签 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 循环运行另一个线程,其余的在“主”线程中运行.这是正确的吗?

最佳答案

  1. #pragma omp single 末尾有一个隐式屏障,如果你想要两个single,你需要使用#pragma omp single nowait block 并发运行。

  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();  
            }
        }
    
    }
    

关于c++ - OpenMP:每个线程都有一个完整的 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877420/

相关文章:

c++ - libcurl - 5 秒后出现奇怪的超时

c++ - 在并发数据结构中,什么级别的锁定粒度是好的?

c++ - 拼接一个短整数的第一个和最后一个 3 位数字?

c++ - QLabel 未从插槽调用更新

python - 多线程环境下Python<->Cython<->C之间的通信

c++ - ANT 不会终止 openmp 可执行文件 (C++)

c++ - C++ 中兼容的可变长度结构

javascript - 如果我从 JS 调用 SWF,而该 SWF 已经忙于处理来自 JS 的另一个调用,会发生什么情况?

iphone - 为什么当我执行 PerformSelectorInBackground :? 时没有自动释放池

c++ - 删除多余的并行语句时的不同程序行为