SIMD 矩阵乘法分割误差

Posted

技术标签:

【中文标题】SIMD 矩阵乘法分割误差【英文标题】:SIMD matrix multiply segmentation error 【发布时间】:2014-05-17 02:44:18 【问题描述】:
__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 矩阵相乘。

【问题讨论】:

检查数据的对齐方式。 128 位 SIMD 向量需要在 16 字节边界上对齐。 【参考方案1】:

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

【讨论】:

以上是关于SIMD 矩阵乘法分割误差的主要内容,如果未能解决你的问题,请参考以下文章

使用矢量化 C++ 的矩阵乘法

矩阵乘法的自动向量化

一元线性最小二乘法正规方程组的求解过程

矩阵计算矩阵乘法其一:基础符号和算法

矩阵计算矩阵乘法其一:基础符号和算法

矩阵计算矩阵乘法其一:基础符号和算法