c++ - 如何使用 OpenMP 屏障

标签 c++ openmp

我想确保正确实现障碍。现在,每次调用 amStaticThreaded 时都会启动大量新线程。在我的主例程中,amStaticThreaded 之后的所有事情都只能由一个线程完成,但那部分速度非常快。有没有比让 amStaticThreaded 每次启动一组新线程更好的方法

我的代码中有以下设置:

void amStaticThreaded(int nshocks, int nstates,
                      MatrixXd& valmat, MatrixXd& EV_prev, MatrixXd& fullmat) {

  #pragma omp parallel for
  for(int i = 0; i < nshocks; i++) {

    // this does the add part    
    RowVectorXd vrow(nstates);
    vrow = EV_prev.row(i);

    fullmat.middleRows( i*nstates, nstates).rowwise() += vrow;
    valmat.row(i)   = fullmat.middleRows(i*nstates, nstates).rowwise().maxCoeff().transpose();

  }

}

int main() {

  // ...

  // ITERATION ON CONTINUATION VALUE  
  cout << "entering loop" << endl;
  while ( (err > TOL) && (itercount < MAXIT)) {

    // GET NEW EXPECTED VALUE FUNCTION
    EV_prev = (T_BIG * V_prev);
    EV_prev.array() *= beta;

    fullmat = staticmat;
    amStaticThreaded(Nshocks, nstates, V_new, EV_prev, fullmat);

    // THERE SHOULD BE A BARRIER HERE

    // FIGURE OUT THE ERROR BOUNDS
    mmdiff = (V_new.array() - V_prev.array());
    lbound = beta * double(mmdiff.minCoeff());
    ubound = beta * double(mmdiff.maxCoeff());

    // POSSIBLY ADJUST THE VALUE FUNCTION
    relres = ubound - lbound;
    if(relres < TOL) {
      V_new.array() += (ubound + lbound)/2.0;
    }
    err = relres;

    // UPDATE ITER COUNT AND VALUE FUNCTION
    cout << "i: " << itercount << ": " << err << endl;
    itercount++;
    V_prev = V_new;
  } // end while
  cout << "DONE with iteration!" << endl;
}

最佳答案

您的代码是正确的。并行部分的末尾有一个隐含的障碍;只有主线程执行并行部分之外的指令。

至于每次进入parallel for时都会启动很多线程,这是OpenMP实现会处理的事情。大多数实现保留一个线程池并在需要时使用它们,而不是总是创建和删除线程。

关于c++ - 如何使用 OpenMP 屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521926/

相关文章:

c++ - 类中 std::sort 的比较函数无法编译

c 程序 openmp 的多个语法错误

c - 如何使用 OpenMP 并行化这个数组总和?

C++:空类的对象的大小是多少?

c++ - 未读行中的最后一个字

php - 在 php 扩展中添加两个共享库。 WHO?

c++ - 修改对象与修改该对象的拷贝

c++ - openMP 使用相同的种子生成不同的随机数

c - 带有openmp的Adi程序

c++ - OpenMP parallel for inside do-while