2014-05-17 178 views
0
__m128d c1,c2,c3,c4,a1,a2,b1,b2; 

int ida = 2; 

for(int i = 0; i<n; i++) { 
    b1 = _mm_load_pd(b+i*n); 
    b2 = _mm_load_pd(b+i*n+ida); 
    for(int j = 0; j<n/2; j++) { 
    a1 = _mm_load_pd(a+i+j*2*n); 
    a2 = _mm_load_pd(a+i+j*2*n+n); 
    c1 = _mm_load_pd(c+j*2*n); 
    c2 = _mm_load_pd(c+j*2*n+n); 
    c3 = _mm_load_pd(c+j*2*n+ida); 
    c4 = _mm_load_pd(c+j*2*n+n+ida); 
    c1 = _mm_add_pd(c1, _mm_mul_pd(a1, b1)); 
    c2 = _mm_add_pd(c2, _mm_mul_pd(a2, b1)); 
    c3 = _mm_add_pd(c3, _mm_mul_pd(a1, b2)); 
    c4 = _mm_add_pd(c4, _mm_mul_pd(a2, b2)); 
    _mm_store_pd(c+j*2*n, c1); 
    _mm_store_pd(c+j*2*n+n, c2); 
    _mm_store_pd(c+j*2*n+ida, c3); 
    _mm_store_pd(c+j*2*n+n+ida, c4); 
    } 
} 

我有一個分割錯誤,但我不知道爲什麼會出現此錯誤。SIMD矩陣乘法分割錯誤

的矩陣是這樣的:

a1 a2 a3 a4 
a5 a6 ... 

我要打N * N矩陣乘法。

+1

檢查您的數據對齊。一個128位的SIMD向量需要在一個16字節的邊界上對齊。 – Wyzard

回答

0

至少在某些情況下,您的負載看起來不對齊,例如,當i = 1時。將_mm_load_pd_的所有實例更改爲_mm_loadu_pd以處理未對齊的情況。