代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Melda Meluzín

使用内部函数将双SSE2/AVX/AVX512存储为浮点的最佳方法

  •  0
  • Vojtěch Melda Meluzín  · 技术社区  · 7 年前

    _mm_store_sd((double*)dst, _mm_castps_pd(_mm_cvtpd_ps(xmm)));

    平均值: _mm_storeu_ps(dst, _mm256_cvtpd_ps(ymm));

    AVX512型: _mm256_storeu_ps(dst, _mm512_cvtpd_ps(zmm));

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cordes    7 年前

    从压缩双精度到压缩浮点的转换只能以缩小的形式提供,而不是采用2个双精度向量并打包成1个浮点向量的版本。所以是的,内在的 [v]cvtpd2ps https://agner.org/optimize/ )

    存储结果是简单的,某种形式的 _mm_store/storeu 是你想要的。


    float =64位),您没有完整的128位结果向量。您可以将两个数据混洗到一个128位的向量中,但是由于自Sandybridge以来Intel上每个时钟的FP shuffle吞吐量为1,所以最好将它们分开存储。

    movlps movsd 存储 __m64* 而不是 float* ,所以你仍然需要一个演员:

    _mm_storel_pi((__m64*)dst,   _mm_cvtpd_ps(xmm) );
    

    但对于装载,你肯定想要 传送双字 以避免对旧值的错误依赖。 加载合并到寄存器中; 传送双字 cvtps2pd xmm, qword [mem] 如果你能让编译器从内部函数发出它,你就可以处理这个问题。

    pmovzxbw xmm, qword [mem] :编译器无法将qword加载折叠到pmovzx/sx的内存操作数:( Loading 8 chars from memory into an __m256 variable as packed single precision floats )

    推荐文章