可以使用“__float_as_int”的返回值来比较CUDA中的float吗?

时间:2015-04-13 01:51:24

标签: cuda

__float_as_intfloat重新解释为int,但我不知道重新解释的int可用于比较float

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

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

这是正确的吗?

1 个答案:

答案 0 :(得分:5)

您可以直接替换' float'与整数比较进行比较,但仅适用于类似符号的数字。这对于零,非正规,正常或无穷大的操作数都能正常工作,但如果一个或两个操作数都是NaN则不行。根据定义,NaN是无序的,但整数比较对这些编码强加了顺序。对于非正规,您也不会获得任何从零到零的行为。

如果两个操作数都是正数,并且您想要将float个操作数与rel-op>进行比较,其中<rel-op>==, !=, <, >, <=, >=之一,只需使用

if (__float_as_int(a) <rel-op> __float_as_int(b))

因为位模式的范围从0x00000000开始为正零,超过0x00000001为最小非标准,0x00800000为最小法线,0x7f7fffff为最大法线,为无限0x7f800000

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

if (__float_as_int(b) <rel-op> __float_as_int(a))

因为位模式的范围从0x80000000为负零(-2 32 ,当解释为int)时,超过0x80000001( - ( 2 32 -1)当被解释为int)到0xff800000时为负无穷大(当解释为int时为-8388608)。

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

在类似的方法中,还可以通过用double提取操作数的最高32位来比较一些__double2hiint()与整数比较的比较,并比较得到的整数。这种方法主要适用于与简单常数的比较。它具有明显的性能优势,如果您查看CUDA 6.5中的头文件math_functions_dbl_ptx3.h,您会发现该技术的应用非常广泛。