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

Woo*_*ood 2 cuda

__float_as_int重新解释floatint,但我不知道重新解释int可以用来比较float

__float_as_int(floatA) > __float_as_int(floatB)  =>  floatA > floatB
Run Code Online (Sandbox Code Playgroud)

floatA > floatB  =>  __float_as_int(floatA) > __float_as_int(floatB)
Run Code Online (Sandbox Code Playgroud)

它是否正确?

nju*_*ffa 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 时为32int),0x80000001(解释为时为- (2 32 -1)int)至0xff800000负无穷大(解释为时为-8388608 int).

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

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