矩阵乘法的精度误差

时间:2014-05-11 16:28:29

标签: c sse precision matrix-multiplication rounding-error

我的程序执行NxN矩阵乘法,其中使用for循环将两个矩阵的元素初始化为值(0,1,2,... N)。两个矩阵元素都是float类型。没有内存分配问题。矩阵大小输入为4的倍数,例如:4x4或8x8等。通过顺序计算验证答案。一切正常,矩阵大小为64x64。仅当矩阵大小超过64(例如:68×68)时才观察到顺序版本和SSE版本之间的差异。

SSE代码段如图所示(size = 68):

void matrix_mult_sse(int size, float *mat1_in, float *mat2_in, float *ans_out) { __m128 a_line, b_line, r_line; int i, j, k; for (k = 0; k < size * size; k += size) { for (i = 0; i < size; i += 4) { j = 0; b_line = _mm_load_ps(&mat2_in[i]); a_line = _mm_set1_ps(mat1_in[j + k]); r_line = _mm_mul_ps(a_line, b_line); for (j = 1; j < size; j++) { b_line = _mm_load_ps(&mat2_in[j * size + i]); a_line = _mm_set1_ps(mat1_in[j + k]); r_line = _mm_add_ps(_mm_mul_ps(a_line, b_line), r_line); } _mm_store_ps(&ans_out[i + k], r_line); } } }

有了这个,答案在元素3673处有所不同,我得到乘法的答案如下

标量:576030144.000000&amp; SSE :576030208.000000

我还用Java编写了一个类似的程序,初始化和设置相同,N = 68,对于元素3673,我的答案为576030210.000000

现在有三个不同的答案,我不知道如何继续。为什么会出现这种差异?我们如何消除这种差异?

1 个答案:

答案 0 :(得分:0)

我正在总结讨论,以便回答这个问题。

因此,根据link中的文章(每个计算机科学家应该知道的浮点运算),浮点始终会导致舍入误差,这是浮点数的近似表示性质。

加法,减法等算术运算会导致精度误差。因此,浮点答案的 6个最高有效数字 (无论小数点位于何处)都可以被认为是准确的,而其他数字可能是错误的(容易出现精度误差)。