是否可以将“的返回值”__浮点数;用于比较CUDA中的浮点值?

是否可以将“的返回值”__浮点数;用于比较CUDA中的浮点值?,cuda,Cuda,\uuuu float\u asu int将float重新解释为int,但我不知道重新解释的int可以用来比较float值 __float_as_int(floatA) > __float_as_int(floatB) => floatA > floatB 及 这是否正确?您可以直接将“浮点”比较替换为整数比较,但仅适用于类似符号的数字。对于零、非规范、法线或无穷大的操作数,这将正常工作,但如果一个或两个操作数都为NaN,则不会正常工作。根据定义,NaN是无序的,但整数比

\uuuu float\u asu int
float
重新解释为
int
,但我不知道重新解释的
int
可以用来比较
float

__float_as_int(floatA) > __float_as_int(floatB)  =>  floatA > floatB


这是否正确?

您可以直接将“浮点”比较替换为整数比较,但仅适用于类似符号的数字。对于零、非规范、法线或无穷大的操作数,这将正常工作,但如果一个或两个操作数都为NaN,则不会正常工作。根据定义,NaN是无序的,但整数比较对这些编码施加了顺序。对于非规范化,您也不会得到任何刷新到零的行为

如果两个操作数都是正的,并且您希望将
浮点操作数与
rel op>
进行比较,其中
==,!=>中的一个=简单使用

if(\uuuuufloat\uas\uint(a)\uuuufloat\uas\uint(b))

由于位模式的范围从正零的
0x00000000
到最小非规范的
0x00000001
,最小法线的
0x00800000
,最大法线的
0x7f7fffff
到无穷大的
0x7f800000

如果两个操作数均为负数,则必须交换比较中的操作数

if(\uuuuufloat\uas\uint(b)\uuuufloat\uas\uint(a))

由于位模式的范围从负零的
0x8000000
(当解释为
int
时为232),超过
0x8000001
(当解释为
int
时为232-1)到负无穷大的
0xff800000
(当解释为
int
时为8388608)

由于
float
上的比较通常至少与
int
上的比较一样快,因此通常没有理由以这种方式替换
float
比较。一种可能有意义的情况是,如果程序是用
-ftz=true
编译的,但需要与非规范化支持进行单独比较


在类似的方法中,还可以通过使用
\uuuu double2hiint()
提取操作数的最高有效32位,并比较结果整数,将一些
比较替换为整数比较。这种方法主要适用于简单常数的比较。它具有明确的性能优势,如果您查看CUDA 6.5中的头文件
math\u functions\u dbl\u ptx3.h
,您会发现该技术的应用非常广泛。

@njuffa对该主题发表了评论
floatA > floatB  =>  __float_as_int(floatA) > __float_as_int(floatB)