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;
}