2012-08-08 29 views
5

Làm cách nào để SIMID mã hóa sau trong C (sử dụng nội tại SIMD của khóa học)? Tôi đang gặp khó khăn hiểu intrinsics SIMD và điều này sẽ giúp rất nhiều:SIMD mã sau đây

int sum_naive(int n, int *a) 
{ 
    int sum = 0; 
    for(int i = 0; i < n; i++) 
     sum += a[i]; 
    return sum; 
} 
+0

Bạn đã nhớ SIMD nào? SSE2? – harold

+0

SSE Các intrinsics sau đây có thể được sử dụng .__ _mm_setzero_si128 m128i() __m128i _mm_loadu_si128 (__m128i * p) __m128i _mm_add_epi32 (__m128i một, __m128i b) (a0 + b0, a1 + b1, a2 + b2, a3 + b3) trống _mm_storeu_si128 (__m128i * p, __m128i a) – user1585869

+0

Ok, vậy là SSE2. Bạn đã thử cái gì? – harold

Trả lời

8

Dưới đây là một thực hiện khá đơn giản (cảnh báo: Mã chưa được kiểm tra):

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; 
} 

Lưu ý rằng các mảng đầu vào, a[], cần phải được liên kết 16 byte và n phải là bội số của 4.

Các vấn đề liên quan