gpt4 book ai didi

c++ - 如何使用 OpenMP 屏障

转载 作者:行者123 更新时间:2023-11-30 04:29:14 26 4
gpt4 key购买 nike

我想确保正确实现障碍。现在,每次调用 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;
}

最佳答案

您的代码是正确的。并行部分的末尾有一个隐含的障碍;只有主线程执行并行部分之外的指令。

至于每次进入parallel for时都会启动很多线程,这是OpenMP实现会处理的事情。大多数实现保留一个线程池并在需要时使用它们,而不是总是创建和删除线程。

关于c++ - 如何使用 OpenMP 屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com