代码之家  ›  专栏  ›  技术社区  ›  Royi

有效地使用英特尔编译器SVML`\uu m128\u mm\u sincos\u ps()`

  •  1
  • Royi  · 技术社区  · 8 年前

    我有一个简单的循环:

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

    __m128 _mm_sincos_ps () .

    __m128毫米正弦相位() .

    __m128毫米正弦相位() ?

    1 回复  |  直到 8 年前
        1
  •  1
  •   wim    8 年前

    以下是关于 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);
        }   
    }