2014-05-17 2 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); 
    } 
} 

세그먼트 오류가 있지만이 오류의 원인을 알 수 없습니다. 내가 곱하기 n 개의 * n 개의 행렬을 만들고 싶어SIMD 행렬 곱셈 분할 오류

a1 a2 a3 a4 
a5 a6 ... 

: 같은

행렬이다.

+1

데이터 정렬을 확인하십시오. 128 비트 SIMD 벡터는 16 바이트 경계에 정렬되어야합니다. – Wyzard

답변

0

적어도 일부 경우에 부하가 잘못 정렬되는 것 같습니다 (예 : i = 1 일 때. _mm_load_pd_의 모든 인스턴스를 _mm_loadu_pd으로 변경하면 잘못 정렬 된 경우를 처리 할 수 ​​있습니다.