来自128位__m128 Intel Intrinsic的4个整数

时间:2013-10-26 03:22:01

标签: c caching optimization intel intrinsics

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

由于

1 个答案:

答案 0 :(得分:5)

一对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