1
我想确保我正确实施障碍。现在,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 2012-03-01 19:37:17