Hier ist eine ziemlich einfache Implementierung (Warnung: ungetesteten Code):
int32_t sum_array(const int32_t a[], const int n)
{
__m128i vsum = _mm_set1_epi32(0); // initialise vector of four partial 32 bit sums
int32_t sum;
int i;
for (i = 0; i < n; i += 4)
{
__m128i v = _mm_load_si128(&a[i]); // load vector of 4 x 32 bit values
vsum = _mm_add_epi32(vsum, v); // accumulate to 32 bit partial sum vector
}
// horizontal add of four 32 bit partial sums and return result
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
sum = _mm_cvtsi128_si32(vsum);
return sum;
}
Beachten Sie, dass die Eingabe-Array, a[]
, muss 16 Byte ausgerichtet sein, und n
sollte ein Vielfaches von 4 sein.
Welche SIMD hatten Sie im Sinn? SSE2? – harold
SSE Die folgenden Spezifika verwendet werden könnten .__ m128i _mm_setzero_si128() __m128i _mm_loadu_si128 (__m128i * p) __m128i _mm_add_epi32 (__m128i a, __m128i b) (a0 + b0, a1 + b1, a2 + b2, a3 + b3) Hohlraum _mm_storeu_si128 (__m128i * p, __m128i a) – user1585869
Ok, also SSE2. Was hast du probiert? – harold