是否可以将“的返回值”__浮点数;用于比较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)