SSE: преобразовать __m128 и __m128i в два __m128d - PullRequest
3 голосов
/ 13 декабря 2010

Два связанных вопроса.

Это то, что мой код должен делать с довольно большим объемом данных. Это делается во внутренних циклах, и производительность важна.

  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.

1 Ответ

6 голосов
/ 13 декабря 2010

Встроенные функции _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 );
    ....
}
...