CUDA - 有和没有调试信息之间的版本差异

时间:2013-09-11 10:52:08

标签: cuda

我有一个CUDA应用程序,我为Release版本编译两次:一次调试信息(-G used)和一次没有调试信息。我运行应用程序,它对浮点数进行一些计算(包括expf,sinf,cosf等函数)。 我注意到两个版本创建的数字略有不同,这里它们是并排的:

0: (-8.000000,0.000000,0.000000)        0: (-8.000000,0.000000,0.000000)
1: (-8.212574,-0.112065,0.970697)       1: (-8.212575,-0.112065,0.970697)
2: (-8.365530,-0.250361,1.949206)       2: (-8.365531,-0.250361,1.949206)
3: (-8.332600,-0.251884,2.948662)       3: (-8.332601,-0.251885,2.948662)
4: (-8.593035,-0.619825,3.841295)       4: (-8.593036,-0.619826,3.841295)
5: (-8.507285,-0.778658,4.824870)       5: (-8.507286,-0.778658,4.824870)
6: (-8.441058,-1.001207,5.797539)       6: (-8.441058,-1.001207,5.797539)
7: (-8.680929,-1.051136,6.767059)       7: (-8.680929,-1.051136,6.767059)

这是前7个值(两个版本都以-8,0,0开头)。正如您在此处所看到的,小数点后的第6位只有很小的差异。但是,我在旋转矩阵计算期间使用这些,所以在其中1000个之后,差异加起来非常显着。

我没有添加源代码,因为它非常大且非常复杂。

我想知道为什么首先存在差异。我知道在优化方面,调试版和发布版之间存在巨大差异。我猜有和没有调试信息的发布之间有类似的差异。但是,优化如何改变计算精度?

1 个答案:

答案 0 :(得分:2)

浮点运算不是关联的,因此操作顺序很重要。如果更改编译器选项(例如有/没有调试),编译器发出的代码可能,而且通常是相当不同的。像重新排序一些浮点指令一样简单就足以改变结果。

唯一可以确定的方法是查看设备上运行的最终代码。 NVIDIA提供了一个工具cuobjdump,您可以使用它来反汇编CUDA对象代码。如果您对两种方式中的每一种进行内核的并行比较,则可能会找到给定输入的两个浮点结果的差异。