Я хочу убедиться, что я правильно реализую барьер. Прямо сейчас, amStaticThreaded запускает тонну новых потоков каждый раз, когда он вызывается. В моей основной рутине все после amStaticThreaded может выполняться только одним потоком, но эта часть выполняется очень быстро. Есть ли лучший способ, чем иметь amStaticThreaded начать новый набор потоков каждый разКак использовать барьер OpenMP
У меня есть следующие настройки в моем коде:
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;
}
О, ладно, так что на вызов amStaticThreaded не наложена накладная? Это действительно хорошо знать. Благодарю. – stevejb