【发布时间】:2014-09-13 01:47:01
【问题描述】:
请帮我解决这个问题:
对于 x = -6.5799015957503127E+02 和 y = -4.6102597302044005E+03
// in C:
atan2(x,y) = -2.99982704867761151845684253203217e+00
// in Fortran:
atan2(x,y) = -2.99982704867761151845684253203217D+00
// But atan2 called in CUDA kernel is:
atan2(x,y) = -2.99982704867761107436763268196955E+00
// ^^^^^^^^^^^^^^^^^^^^^
是的,可能是由于舍入错误,但是,为什么在 Fortran 和 C 中结果相同,而在 CUDA 中略有不同?
我在 CUDA 中需要与 Fortran 和 C 中相同数量的 atan2。如何做到这一点?
【问题讨论】:
-
如果您依赖精确值,则不应使用浮点数。
-
我使用 GPU 架构 sm_20。我项目中的所有函数(sin、cos、sinh、cosh 等)都给出与 C 中相同的结果。那么,为什么 atan2 不呢???? :(
-
@OliCharlesworth 这是一种过度简化。期望可重复的浮点结果有很多正当理由,这与期望使用浮点进行轻松精确的数学计算不同。获得可重复三角函数结果的一种简单方法是将数学库嵌入到程序中,这样每次都会出现相同的错误。二十年前Java就这样解决了这个问题,既不无道理也不新鲜。
-
我建议谨慎使用“可重复”以避免混淆“可重复”和“可比较”。 CUDA 数值结果应该是可重复的。它们不一定与其他实现产生的那些具有可比性。或者您可以说“在不同的实现中可重复”,我认为这可以用“可比较”或“可移植”来很好地表达。
-
这不是一个答案,但要注意这个 atan2(x,y) 的几何解释:如果我们想在正 x 轴上产生一个零角,我们通常写 atan2(y,x) (x>0,y==0) 和 +pi/2 在正 y 轴 (x==0,y>0)。
标签: cuda floating-point