c - 矩阵乘法的 sse 精度误差

标签 c sse precision matrix-multiplication rounding-error

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

SSE 片段如图所示(大小 = 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 & SSE:576030208.000000

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

现在有三个不同的答案,我不确定如何进行。为什么会出现这种差异,我们如何消除这种差异?

最佳答案

我正在总结讨论以结束这个问题的回答。

因此,根据 link 中的文章(每位计算机科学家应了解的浮点运算知识) , float 总是导致舍入误差,这是 float 近似表示性质的直接结果。

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

关于c - 矩阵乘法的 sse 精度误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23595093/

相关文章:

c - C 中的整数提升会降级 `long int` 吗?

c - float 中的宽度代表什么?

c - 如何制作字符的位掩码?

C:按 int 追加字符串

Matlab nchoosek 使用 int64 和 sym 得到差异答案

c++ - 从浮点值打印 2 位小数

c++ - SIMD 常量 float

c - GCC - 如何重新对齐堆栈?

c - SSE 中的乘减法

fortran - 在 Fortran 中定义指数