1

SIMD 命令セットを利用できるコードの厳密な定義は何ですか? 計算を並行して実行できるものはありますか?

だから私が持っていたとしたら:

for(int i=0; i<100; i++){
    sum += array[i];
}

以下を実行できるため、SIMD を利用できます。

for(int i=0; i<100;i=i+4){
    sum0 += array[i];
    sum1 += array[i+1];
    sum2 += array[i+2];
    sum3 += array[i+3];
}

sum = sum0 + sum1 + sum2 + sum3;

?

float 型である必要がありますか、それとも double と integer である可能性がありますか?

4

1 に答える 1

4

x86 (SSE et al )について話していると仮定すると、算術でサポートされている型は、8、16、32、および 64 ビットの整数と、単精度および倍精度の浮動小数点数です。ただし、すべての算術演算がすべてのデータ型でサポートされているわけではないことに注意してください。SSE はこの点で直交性を欠いています。

32 ビット int と適切に整列された配列 (16 バイト整列) を想定すると、上記のループの例を次のように実装できます。

#include <emmintrin.h>                     // SSE2 intrinsics

int32_t a[100] __attribute__ ((aligned(16)));
                                           // suitably aligned array

__m128i vsum = _mm_set1_epi32(0);          // init vsum = { 0, 0, 0, 0 }
for (int i = 0; i < 100; i += 4)
{
    __m128i v = _mm_load_si128(&a[i]);     // load 4 ints from a[i]..a[i+3]
    vsum = _mm_add_epi32(vsum, v);         // accumulate 4 partial sums
}
// final horizontal sum of partial sums
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
int32_t sum = _mm_cvtsi128_si32(vsum);     // sum = scalar sum of a[]
于 2013-01-10T12:43:10.023 に答える