4

128 ビットの __m128 固有要素があります。32 ビット整数が含まれます。これら 4 つの整数をすべて合計する簡単な方法はありますか? 私は速度とキャッシュの最適化に関心があるため、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 に答える