Использование компилятора Intel SVML `__m128 _mm_sincos_ps ()` эффективно - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть простой цикл:

for (ii = 0; ii < numRows * numCols; ii++)
    {
        mCOmega[ii] = cosf(paramOmega * mI[ii]);
        mSOmega[ii] = sinf(paramOmega * mI[ii]);
    }

}

Что я хочу оптимизировать, используя Intel Compiler + SVML, используя __m128 _mm_sincos_ps ().

Я борюсь с эффективным способом загрузки данных и их сохранения с вывода __m128 _mm_sincos_ps ().

Какой самый эффективный способ написать этот цикл с __m128 _mm_sincos_ps ()?

1 Ответ

0 голосов
/ 07 сентября 2018

Следующие компиляции на godbolt без проблем:

#include <stdio.h>
#include <stdlib.h>
#include <mathimf.h>
#include <immintrin.h>

void test (const float * restrict mI, 
           float * restrict mCOmega,
           float * restrict mSOmega,
           float paramOmega,
           int numRows,
           int numCols)
{   
    __m128 x, sin_x, cos_x;
    int ii;
    for (ii = 0; ii < numRows * numCols; ii = ii + 4)
    {   x = _mm_loadu_ps((float*)&mI[ii]);
        x = _mm_mul_ps(x, _mm_set1_ps(paramOmega));
        sin_x = _mm_sincos_ps(&cos_x, x);
        _mm_storeu_ps((float*)&mCOmega[ii], cos_x);
        _mm_storeu_ps((float*)&mSOmega[ii], sin_x);
    }   
}
...