我刚刚添加了一个omp pragma
来并行这个for
循环,但是更多的线程使它更慢。
我尝试了时间表auto
,guide, 10
,static, 10
。
一个线程需要4分钟,2个需要6分钟,更多线程更慢......
我不熟悉omp
,所以任何人都有帮助...
这个函数经常调用,所以我打印pairs.size()
,有时它是0,有时它是498。
我想也许每次迭代的工作都很小,以至于线程操作花费了太多时间..
fl eval_pairs_deriv(const precalculate& p, fl v, const interacting_pairs& pairs,
const vecv& coords, vecv& forces) {
const fl cutoff_sqr = p.cutoff_sqr();
fl e = 0;
#pragma omp parallel for reduction(+ : e) schedule(runtime)
for (int i = 0; i < (pairs).size(); ++(i)) {
const interacting_pair& ip = pairs[i];
vec r;
r = coords[ip.b] - coords[ip.a]; // a -> b
fl r2 = sqr(r);
// f1 tt=0;
double tt = 0;
if (r2 < cutoff_sqr) {
pr tmp = p.eval_deriv(ip.type_pair_index, r2);
vec force;
force = tmp.second * r;
curl(tmp.first, force, v);
tt = tmp.first;
forces[ip.a] -= force;
forces[ip.b] += force;
}
e += tt;
}
return e;
}