我有一个 128 位的 __m128 内在元素。它包含 32 位整数。有没有一种简单的方法可以将所有这四个整数相加?我关心速度和缓存优化,所以我试图避免将 128 存储在数组中,然后从数组中获取元素。
谢谢
我有一个 128 位的 __m128 内在元素。它包含 32 位整数。有没有一种简单的方法可以将所有这四个整数相加?我关心速度和缓存优化,所以我试图避免将 128 存储在数组中,然后从数组中获取元素。
谢谢
一对 phaddd 指令可能是最好的解决方案。这是一个例子:
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
#include <intrin.h>
//---------------------------------------------------------------------------
__m128i add_32X4 (__m128i value)
{
__m128i result;
result = _mm_hadd_epi32 (value, value);
result = _mm_hadd_epi32 (result, result);
return result;
}
//---------------------------------------------------------------------------
int main (void)
{
__m128i input = _mm_set_epi32 (1, 10, 100, 1000);
__m128i result = add_32X4 (input);
printf ("%d\n", _mm_cvtsi128_si32 (result));
return 0;
}
//---------------------------------------------------------------------------
程序输出:
1111
示例代码生成(gcc 4.8.1):
<add_32X4>:
30: 66 0f 6f 01 movdqa xmm0,XMMWORD PTR [rcx]
34: 66 0f 38 02 c0 phaddd xmm0,xmm0
39: 66 0f 38 02 c0 phaddd xmm0,xmm0
3e: c3 ret