добавление компонентов регистра SSE - PullRequest
17 голосов
/ 16 декабря 2011

Я хочу добавить четыре компонента регистра SSE, чтобы получить один float.Вот как я это делаю сейчас:

float a[4];
_mm_storeu_ps(a, foo128);
float x = a[0] + a[1] + a[2] + a[3];

Есть ли инструкция SSE, которая непосредственно достигает этого?

Ответы [ 3 ]

11 голосов
/ 16 декабря 2011

Возможно, вы можете использовать инструкцию HADDPS SSE3 или ее встроенный компилятор _mm_hadd_ps ,

Например, см. http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

Еслиу вас есть два регистра v1 и v2:

v = _mm_hadd_ps(v1, v2);
v = _mm_hadd_ps(v, v);

Теперь v [0] содержит сумму компонентов v1, а v [1] содержит сумму компонентов v2.

4 голосов
/ 18 декабря 2011

Если вы хотите, чтобы ваш код работал на процессорах до SSE3 (которые не поддерживают _mm_hadd_ps), вы можете использовать следующий код. Он использует больше инструкций, но декодирует до меньшего количества микроопераций на большинстве процессоров.

 __m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128);
 float x;
 _mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1)));
3 голосов
/ 16 декабря 2011

Ну, я не знаю ни о какой такой функции, но это можно сделать с помощью _mm_hadd_ps () два раза.

...