system
1
小弟做复数矩阵相乘,A矩阵维数为50200000,B矩阵维数为20000050,求C=A*B,我调用CUBLAS库实现,发现误差甚至大的达到20的量级,一般的也有0.01的误差,我的复数使用的是float2类型,感觉误差太大。
我猜想是GPU的精确度问题,感觉是可能两个地方引进误差:
1.乘加指令中的两次截断误差。但我看Fermi架构好像已经做了优化,乘加指令为一次截断误差,即对相乘结果用64位保存中间结果,然后相加,之后的结果舍入后存入最终结果,只有一次截断。但感觉这个是不是忽悠人的,我调试发现好像并没有优化,还是这种乘加指令的优化需要在编译环境上设置?(貌似以前是MAD,现在是FMAD)。
2.是加和累计误差,得到一个C元素需要进行200000次的累加运算,但我用Kahan算法去提高精确度,但没一点效果,不知是我用得不对还是它的效果就不行。。。。
这几天头都大了,还希望各位大牛给小弟点指导啊,不胜感激了!!!!
system
2
试过例程中的Kahan算法进行累加,还是有效果的。。
system
4
最好用相对误差来衡量。看看相对误差下CPU与GPU有多大差别。相对误差=(CPU-GPU)/CPU
system
5
一个矩阵相乘相对误差一般有0.0001左右,感觉GPU这个单精度问题确实比较麻烦,因为我的程序有4个大矩阵相乘,FFT,都是些乘加累积运算,感觉积累误差很大,到程序最后结果绝对误差达到1点多,数值才20多,相对误差有0.05,相当大了。。。。想问下我这误差引入的原因是不是乘加累积,还是有其他的原因?
system
6
相对误差10^-5是正常的,你可以采用双精度试试。
system
7
10的-5次方正常,但我那个根本就已经达到了10的-4次方,累计之后甚至到了10的-2次方。。。用双精度试过了,能达到10的-8到-9次方,但时间消耗太大。。。
system
8
因为单精度只有6位有效数字,所以误差是10^-5是正常的,多次累计之后就是出现混沌也是正常的,当然你的算法如果是迭代的话,必须要考虑这个。
至于双精度时间消耗问题,你就得权衡了,如果误差可以忍受,就没有必要用,但是如果不可以的话,你还是得用双精度。
恩,试了,用单精度验证结果到最后虽然误差已经很大,但对结果影响不大,而用双精度虽然结果误差小,但时间消耗不起,所以还是用单精度了。不过感觉GPU单精度误差确实是有点大。。谢谢各位大牛了!
以前在帖子上看到版主做过多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功能是指?能不能详细点?不推荐使用的话有什么更好的方法实现呢,望指教!