两个相关的问题。

这就是我的代码需要对大量数据做的事情。它是在内部循环内完成的,性能很重要。

  • 将 __int32 数组转换为 double (或将 __m128i 转换为两个 __m128d)。
  • 将浮点数数组转换为 double 数(或将 __m128 转换为两个 __m128d)。

  • 基本上,我需要具有以下签名的功能:
    void convert_int_to_double(__int32 const * input, double * output);
    void convert_float_to_double(float const * input, double * output);
    

    输入输出指针对齐,元素个数为4的倍数。主要问题是如何快速将__m128解包成两个__m128d。

    最佳答案

    内部函数 _mm_cvtepi32_pd_mm_cvtps_pd 将值转换为 double 值。

    这应该是循环:

    __m128i* base_addr = ...;
    for( int i = 0; i < cnt; ++i )
    {
        __m128i epi32 = _mm_load_si128( base_addr + i );
        __m128d v0 = _mm_cvtepi32_pd( epi32 );
        epi32 = _mm_srli_si128( epi32, 8 );
        __m128d v1 = _mm_cvtepi32_pd( epi32 );
        ....
    }
    

    关于c++ - SSE:将 __m128 和 __m128i 转换为两个 __m128d,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4430839/

    10-11 23:45