3

两个相关的问题。

这就是我的代码需要对大量数据执行的操作。它是在内部循环中完成的,性能很重要。

  1. 将 __int32 和数组转换为双精度数(或将 __m128i 转换为两个 __m128d)。
  2. 将浮点数和数组转换为双精度数(或将 __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。

4

1 回答 1

7

内在函数_mm_cvtepi32_pd_mm_cvtps_pd将值转换为双精度值。

这应该是循环:

__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 );
    ....
}
于 2010-12-13T16:46:06.950 回答