optimization - 有效使用英特尔编译器 SVML `__m128 _mm_sincos_ps ()`

标签 optimization vectorization simd avx icc

我有一个简单的循环:

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);
    }   
}

关于optimization - 有效使用英特尔编译器 SVML `__m128 _mm_sincos_ps ()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52227549/

相关文章:

python - 如何在Python中优化这段代码

python - Numpy 根据条件拆分数组,无需 for 循环

c - C中的整数SIMD指令AVX

c++ - 如何向量化 data_i16[0 到 15]?

optimization - MarkLogic XQuery 尾调用优化

algorithm - 是否有可能在 O(n) 时间内找到差值最小的两个数

c++ - 将 'const' 添加到指针可以帮助优化吗?

r - 循环以根据 R 中的其他情况创建新变量(非常基本)

matlab - 将大向量中的每个元素分配给重复次数的有效方法

c++ - 矢量化和#pragma omp simd