小编Lio*_*o78的帖子

使用混合(浮点,双)输入向量执行AVX内积运算的最快方法

我需要为混合单/双精度浮点向量构建单精度浮点内积例程,利用256位SIMD寄存器的AVX指令集.

问题:一个输入向量是float(x),而另一个是double(yD).

因此,在计算真正的内积运算之前,我需要将输入的yD向量数据从double转换为float.

使用SSE2指令集,我能够实现一个非常快速的代码,做我需要的,并且速度性能非常接近于矢量x和y都是浮点数的情况:

  void vector_operation(const size_t i) 
  {
    __m128 X = _mm_load_ps(x + i);
    __m128 Y = _mm_movelh_ps(_mm_cvtpd_ps(_mm_load_pd(yD + i + 0)), _mm_cvtpd_ps(_mm_load_pd(yD + i + 2)));
    //inner-products accumulation
    res = _mm_add_ps(res, _mm_mul_ps(X, Y));
  }   
Run Code Online (Sandbox Code Playgroud)

现在,希望进一步加速,我实现了一个带有AVX指令集的correpsonding版本:

  inline void vector_operation(const size_t i) 
  {
    __m256 X = _mm256_load_ps(x + i);
    __m128 yD1 = _mm_cvtpd_ps(_mm_load_pd(yD + i + 0));
    __m128 yD2 = _mm_cvtpd_ps(_mm_load_pd(yD + i + 2));
    __m128 yD3 = _mm_cvtpd_ps(_mm_load_pd(yD + …
Run Code Online (Sandbox Code Playgroud)

c++ simd vectorization avx sse2

7
推荐指数
1
解决办法
364
查看次数

标签 统计

avx ×1

c++ ×1

simd ×1

sse2 ×1

vectorization ×1