看似简单的循环的安全显式矢量化

时间:2018-10-11 11:49:19

标签: c++ for-loop openmp vectorization simd

新功能在这里,希望能对您有所帮助。我试图在下面的成员函数代码中显式向量化两个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),但似乎产生废话。

/欢呼声

0 个答案:

没有答案