我想确保正确实施屏障。现在,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;
}
答案 0 :(得分:2)
您的代码是正确的。在平行部分的末端有一个隐含的障碍;只有主线程执行并行部分之外的指令。
对于每次输入parallel for时多个线程的启动,这是OpenMP实现将要处理的事情。大多数实现都会保留一个线程池并在需要时使用它们,而不是始终创建和删除线程。