如何提高计算精度?

将一个数值算法移植到了CUDA上面,出现了一个问题:
随着数据规模越大,能够计算的有效数字就越少了。
比如在矩阵5050能计算到小数点后6位,而500500只能计算到小数点后3位,10001000就只能计算到小数点后1位了
具体来说
我在kernal函数中传进了一个参数EPS,用于控制迭代过程中最大的绝对误差,EPS=|前一次迭代值 - 后一次迭代值|
在50
50时候,EPS=1E-6可以计算出结果,而500*500的时候EPS=1E-6的话,计算时候屏幕就会闪一下,然后输出的矩阵为初始的矩阵值,一次也没有计算。只有用EPS=1E-3可以计算出结果。

请问:发上上面问题的原因是什么?如何解决?

用Kahan’s Summation Formula来提高精确度。
例子程序:
if(row < n && column < n) {
float t = 0;
for(i = 0; i < n; i++) {
t += a[row * lda + i] * b[i * ldb + column];
}
c[row * ldc + column] = t;
}
改进的程序:
if(row < n && column < n) {
float t = 0;
float y = 0;
for(i = 0; i < n; i++) {
float r;
y -= a[row * lda + i] * b[i * ldb + column];
r = t - y;
y = (r - t) + y;
t = r;
}
c[row * ldc + j] = t;
}

这个尝试过 但是我这个里面不是迭代相加 这种方法貌似用处不大

[

这个尝试过 但是我这个里面不是迭代相加 这种方法貌似用处不大

说明一下:
整数矩阵:
ia, ib, ic; //浮点数的整数部分
浮点矩阵:
fa, fb, fc; //浮点数的小数部分