Новое здесь, надеясь, что вы можете помочь.Я пытаюсь явно векторизовать оба цикла 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), но, кажется, производит чепуху.
/ cheers