SIMD矩阵乘法分割误差

时间:2014-05-17 02:44:18

标签: x86 sse simd

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

我有分段错误,但我不知道为什么会出现此错误。

矩阵就像:

a1  a2  a3  a4
a5  a6 ...

我想使n * n矩阵乘法。

1 个答案:

答案 0 :(得分:1)

看起来你的负载至少在某些情况下会不对齐,例如当i = 1时,将_mm_load_pd_的所有实例更改为_mm_loadu_pd,以便处理未对齐的案例。