请教各位大神关于GPU精度的问题

小弟做复数矩阵相乘,A矩阵维数为50200000,B矩阵维数为20000050,求C=A*B,我调用CUBLAS库实现,发现误差甚至大的达到20的量级,一般的也有0.01的误差,我的复数使用的是float2类型,感觉误差太大。

我猜想是GPU的精确度问题,感觉是可能两个地方引进误差:
1.乘加指令中的两次截断误差。但我看Fermi架构好像已经做了优化,乘加指令为一次截断误差,即对相乘结果用64位保存中间结果,然后相加,之后的结果舍入后存入最终结果,只有一次截断。但感觉这个是不是忽悠人的,我调试发现好像并没有优化,还是这种乘加指令的优化需要在编译环境上设置?(貌似以前是MAD,现在是FMAD)。

2.是加和累计误差,得到一个C元素需要进行200000次的累加运算,但我用Kahan算法去提高精确度,但没一点效果,不知是我用得不对还是它的效果就不行。。。。

这几天头都大了,还希望各位大牛给小弟点指导啊,不胜感激了!!!!

试过例程中的Kahan算法进行累加,还是有效果的。。

  1. FAD不需要指定,编译器的问题。2.Kahan算法精度应该可以吧。你的误差是0.01应该可以接受的啊。如果是20的数量级这个可能是程序的问题吧?

最好用相对误差来衡量。看看相对误差下CPU与GPU有多大差别。相对误差=(CPU-GPU)/CPU

一个矩阵相乘相对误差一般有0.0001左右,感觉GPU这个单精度问题确实比较麻烦,因为我的程序有4个大矩阵相乘,FFT,都是些乘加累积运算,感觉积累误差很大,到程序最后结果绝对误差达到1点多,数值才20多,相对误差有0.05,相当大了。。。。想问下我这误差引入的原因是不是乘加累积,还是有其他的原因?

相对误差10^-5是正常的,你可以采用双精度试试。

10的-5次方正常,但我那个根本就已经达到了10的-4次方,累计之后甚至到了10的-2次方。。。用双精度试过了,能达到10的-8到-9次方,但时间消耗太大。。。

因为单精度只有6位有效数字,所以误差是10^-5是正常的,多次累计之后就是出现混沌也是正常的,当然你的算法如果是迭代的话,必须要考虑这个。

至于双精度时间消耗问题,你就得权衡了,如果误差可以忍受,就没有必要用,但是如果不可以的话,你还是得用双精度。

恩,试了,用单精度验证结果到最后虽然误差已经很大,但对结果影响不大,而用双精度虽然结果误差小,但时间消耗不起,所以还是用单精度了。不过感觉GPU单精度误差确实是有点大。。谢谢各位大牛了!:slight_smile:

以前在帖子上看到版主做过多GPU的编程,想请教下:我现在是一个工作站上插了4块C2075,想开4个主机端线程,1对1控制4块GPU并行计算,我看了下CUDA4.0的SDK中simpleMultiGPU,但它那好像都没有提到线程,好像是1个主机端线程控制多GPU,并没有开多个线程,而《GPU高性能之CUDA》中的低版本的CUDA的SDK中的simpleMultiGPU提到了,但照它那个改了之后出现运行出现问题。。想问下版主还有没有以前写过的开多个主机端线程控制多GPU并行的程序或这方面的经验指导,不胜感激!!

关注一下,呵呵

出现问题就修正。

cuda4有内置的多GPU功能,但是我不推荐使用。

我的毕设就是要使用多GPU来做,请问你能讲讲为何不推荐用多GPU来做,谢谢了:)

不知你说的内置的多GPU功能是指?能不能详细点?不推荐使用的话有什么更好的方法实现呢,望指教!