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