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