4

我有一个 128 位的 __m128 内在元素。它包含 32 位整数。有没有一种简单的方法可以将所有这四个整数相加?我关心速度和缓存优化,所以我试图避免将 128 存储在数组中,然后从数组中获取元素。

谢谢

4

1 回答 1

6

一对 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    
于 2013-10-28T14:19:18.157 回答