在CUDA中,是否有办法确保同一程序中FP数学的一致性?

在CUDA中,是否有办法确保同一程序中FP数学的一致性?,cuda,floating-point,gpu,nvidia,Cuda,Floating Point,Gpu,Nvidia,是否有办法确保: 如果a==b,则devfun(a)==devfun(b) 其中,devfun()是一个设备函数,涉及一些浮点数学运算(例如多项式)并返回浮点结果,a和b是浮点变量 我不关心交叉实现的一致性(例如,不同的编译器/不同的操作系统/不同的驱动程序版本或不同的编译器选项),我只关心,在同一建筑/程序中,在运行时,它能否确保在每次函数调用期间,devfun()返回的结果在某种程度上是一致的,只要a==b,devfun(a)==devfun(b) 我说的是SM2.0+硬件和CUDA 5.0

是否有办法确保:

如果
a==b
,则
devfun(a)==devfun(b)

其中,
devfun()
是一个设备函数,涉及一些浮点数学运算(例如多项式)并返回浮点结果,
a
b
是浮点变量

我不关心交叉实现的一致性(例如,不同的编译器/不同的操作系统/不同的驱动程序版本或不同的编译器选项),我只关心,在同一建筑/程序中,在运行时,它能否确保在每次函数调用期间,
devfun()返回的结果
在某种程度上是一致的,只要
a==b
devfun(a)==devfun(b)


我说的是SM2.0+硬件和CUDA 5.0+,以防万一。

让我们假设您的数字
a
b
表示正确标准化的IEEE-754表示浮点数,而niether
a
b
NaN
值。我们还假设
a
b
都是32位,或者
a
b
都是64位(IEEE-754浮点表示)

在这种情况下,我相信当两个数字
a
b
按位相同时(ISO C/C++,或CUDA C/C++)浮点相等测试(
=
)将返回TRUE(否则返回FALSE)

在真实的情况下,除了一个例外,我相信可以安全地假设
devfun(a)==devfun(b)
没有任何附加条件,除了明显的条件:在
==
操作的任一侧,
devfun
的行为没有区别,也就是说,它是相同的代码,以相同的方式编译,在相同的条件下执行(例如,可能参与
devfun
的其他变量,相同的GPU类型等),正如您在问题中指出的:“相同的建筑/程序”

一个例外是,如果
devfun(a)
的结果是
NaN
,因为(IEEE-754)
NaN!=NaN

(对我来说)如果你认为你有一段代码来反驳这个断言,那将是有趣的

也许浮点忍者会来纠正我

如果我不谈浮点比较的危害,也许我也会失职。如果您不熟悉这一点(大多数人都不会建议对两个浮点数执行测试
a==b
),您可以在上面找到许多关于它的问题

出于同样的原因,浮点相等比较(
==
)通常是不明智的,我认为依赖上面的断言,即使它是真的,也是不明智的。让我给你举个例子

假设您为架构编译代码
sm_20
。现在,在
sm_21
设备上运行代码。这一简单的变化可能导致在运行时进行JIT编译。现在,您不再运行相同的代码,所有赌注都输掉了

因此,再次强调,即使上述情况属实,我认为你依靠这样一种说法是不明智的:

if a==b, then devfun(a) == devfun(b)

感谢这个非常详细的答案,我知道浮点的问题,例如,我想我必须包括
\uuuuuu CUDA\u ARCH\uuuuuu
,以确保函数不会在编程为-0==0的硬件上运行,但提取符号位的代码将给出不同的结果。。。