Безопасная явная векторизация, казалось бы, простой петли - PullRequest
0 голосов
/ 11 октября 2018

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

...