omp,更多线程更慢

时间:2014-07-31 15:31:13

标签: c++ multithreading openmp

我刚刚添加了一个omp pragma来并行这个for循环,但是更多的线程使它更慢。 我尝试了时间表autoguide, 10static, 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;
}

0 个答案:

没有答案