首页 > 解决方案 > 看似简单的循环的安全显式矢量化

问题描述

新手,希望能帮到你。我试图在下面的成员函数代码中显式地矢量化两个 for 循环,因为它们是主要的运行时瓶颈,并且由于依赖关系,自动矢量化不起作用。然而,对于我的一生,我找不到“安全”条款/减少。

PSvector& RTMap::Apply(PSvector& X) const
{
    PSvector Y(0);
    double k=0;

    // linear map
    #pragma omp simd
    for(RMap::const_itor r = rterms.begin(); r != rterms.end(); r++)
    {
        Y[r->i] += r->val * X[r->j];
    }       

    // non-linear map
    #pragma omp simd
    for(const_itor t = tterms.begin(); t != tterms.end(); t++)
    {
        Y[t->i] += t->val * X[t->j] * X[t->k];
    }       

    Y.location() = X.location();
    Y.type() = X.type();
    Y.id() = X.id();
    Y.sd() = X.sd();

    return X = Y;
}

请注意,由于竞争条件,所写的#pragmas 不起作用。有没有一种可以工作的宣布减少的方法?我试过类似的东西:

#pragma omp declare reduction(+:PSvector:(*omp_out.getvec())+=(*omp_in.getvec()))

编译(icpc)但似乎产生废话。

/干杯

标签: c++for-loopopenmpvectorizationsimd

解决方案


推荐阅读