1
バリアを正しく実装したいのですが、今、amStaticThreadedは呼び出されるたびに新しいスレッドを大量に開始します。私のメインルーチンでは、amStaticThreadedの後のすべてが1つのスレッドでしか実行できませんが、その部分は非常に高速です。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