如何使用OpenMP屏障

时间:2012-03-01 18:35:06

标签: 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;
}

1 个答案:

答案 0 :(得分:2)

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

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