各位好,最近测试了CPU和GPU的一个科学计算的数据结果对比,GPU为Fermi架构,通过计算发现与CPU程序计算结果存在误差,经过仔细检查,应该不是我程序的问题。
请问这些误差的来源是什么呢?浮点计算的标准?
正常的。因为硬件不同。
您可以让CUDA的计算结果尽量精确:
(1)多使用double, 少用float(如果可以接受).
(2)不使用__开头的函数(例如__sinf), 而是用它们的慢速版本(例如sinf)
(3)不要使用-prec-div=false和-use_fast_math
等等。
以及,您可以考虑您的算法,尽量减少运算次数,避免误差;
以及可以考虑尽量误差较少的算法。
这是我的建议。毕竟硬件不同,没有一种方式可以总是100%得到一致的浮点结果。
我来再稍微补充一下2#
1:因为不同硬件和不同配置下的截断精度不同,所以结果会有所不同。
2:浮点数作为实数的一种近似,其实是不能完全保证实数的运算性质的,运算的顺序也会影响运算结果。而和CPU串行循环计算相比,GPU的大量线程计算,并不保证线程的先后顺序,从而可能产生不同的结果(如CPU的循环相加用GPU的规约相加或原子相加实现)。
所以,如同2#所言,您需要尽量使用高精度的计算,并且考虑优化您的程序,以获得较好的结果。
祝您编码顺利~
形象的说明一个顺序问题:浮点数计算的时候,A+(B+C) != A+B+C