有效使用英特尔编译器 SVML `__m128 _mm_sincos_ps ()`
Using Intel Compiler SVML `__m128 _mm_sincos_ps ()` Effectively
我有一个简单的循环:
for (ii = 0; ii < numRows * numCols; ii++)
{
mCOmega[ii] = cosf(paramOmega * mI[ii]);
mSOmega[ii] = sinf(paramOmega * mI[ii]);
}
}
我想通过 __m128 _mm_sincos_ps ()
使用英特尔编译器 + SVML 进行优化。
我正在努力寻找从 __m128 _mm_sincos_ps ()
的输出中加载和存储数据的有效方法。
使用 __m128 _mm_sincos_ps ()
编写此循环的最有效方法是什么?
以下在 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);
}
}
我有一个简单的循环:
for (ii = 0; ii < numRows * numCols; ii++)
{
mCOmega[ii] = cosf(paramOmega * mI[ii]);
mSOmega[ii] = sinf(paramOmega * mI[ii]);
}
}
我想通过 __m128 _mm_sincos_ps ()
使用英特尔编译器 + SVML 进行优化。
我正在努力寻找从 __m128 _mm_sincos_ps ()
的输出中加载和存储数据的有效方法。
使用 __m128 _mm_sincos_ps ()
编写此循环的最有效方法是什么?
以下在 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);
}
}