acosf实现中的CUDA浮点数

acosf实现中的CUDA浮点数,c,math,cuda,ptx,C,Math,Cuda,Ptx,acosf的CUDA C的数学函数实现(CUDA/math_function.h)包含以下内容: if (__float_as_int(a) < 0) { t1 = CUDART_PI_F - t1; } .reg .u32 %r<4>; .reg .f32 %f<46>; .reg .pred %p<4>; // ... mov.b32 %r1, %f1; mov.s32

acosf
的CUDA C的数学函数实现(
CUDA/math_function.h
)包含以下内容:

if (__float_as_int(a) < 0) {
  t1 = CUDART_PI_F - t1;
}
    .reg .u32 %r<4>;
    .reg .f32 %f<46>;
    .reg .pred %p<4>;
    // ...
    mov.b32         %r1, %f1;
    mov.s32         %r2, 0;
    setp.lt.s32     %p2, %r1, %r2;
    selp.f32        %f44, %f43, %f41, %p2;
很明显,
\u float\u as_int()
不是
float
int
舍入。(这将产生一个
cvt.s32.f32
)相反,它将
float%f1
作为位拷贝(
b32
)分配给
%r1
(注意:
%r1
类型为
u32
(无符号int)!!),然后将
%r1
%r2
进行比较,就好像它是
s32
(有符号int,令人困惑!!)(谁的值是
0

对我来说这看起来有点奇怪,但显然是正确的


有人能解释一下发生了什么,特别是在if子句测试是否为负的上下文中,解释一下
\uu float\u as\u int()
在做什么吗(
\u float\u as\u int
float
重新解释为
int
int
\u float\u as\u int
float
重新解释为
int
int
有趣的!所以它是为了实现这样的性能原因。单精度浮点比较不是比GPU上的整数比较慢。但是,在此if语句中较早使用signbitf()需要位提取和比较。很有趣!因此,出于性能原因,它是这样实现的。单精度浮点比较不比GPU上的整数比较慢。较早使用signbitf()时然而,在这个if语句中,需要位提取和比较。
int __float_as_int(float in) {
     union fi { int i; float f; } conv;
     conv.f = in;
     return conv.i;
}