Как использовать OpenMP Barrier - PullRequest
1 голос
/ 01 марта 2012

Я хочу убедиться, что правильно установил барьер.Прямо сейчас 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 Ответ

2 голосов
/ 01 марта 2012

Ваш код правильный, как есть. В конце параллельного участка имеется скрытый барьер; только главный поток выполняет инструкции вне параллельной секции.

Что касается запуска множества потоков каждый раз, когда вы вводите параллель, то это то, о чем позаботится реализация OpenMP. Большинство реализаций хранят пул потоков и используют их при необходимости, вместо того, чтобы всегда создавать и удалять потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...