使用fermi GPU,CPU和GPU双精度结果之间存在一个小错误。
e.g。对于一个小测试集,我得到以下绝对错误:(数字1(CPU) - 数字2(GPU))= 3E-018。
以二进制形式,它按预期非常小......
二进制数字1:
xxxxxxxxxxxxx111000000010 01
vs
二进制数字2:
xxxxxxxxxxxx1111000000010 10
虽然这是一个二进制数字的差异,但我很想消除任何差异,因为在我的代码中加错了。
那些熟悉费米的人提示?如果这是不可避免的,我可以让C / C ++模仿fermi四舍五入的行为吗?
答案 0 :(得分:1)
你应该看看this post。
浮点不是关联的,因此如果编译器选择以不同的顺序执行操作,那么您将得到不同的结果。同一编译器的两个版本可以产生差异!不同的编译器更有可能产生差异,如果你在GPU上并行工作(你是,对吧?)那么你本来就是以不同的顺序进行操作......
Fermi硬件符合IEEE754-2008标准,这意味着除了IEEE754标准舍入外,它还具有融合乘法 - 加法(FMA)指令,可避免乘法和加法之间的精度损失。