CUDA C 的数学函数实现 ( cuda/math_function.h
)acosf
包含以下段落:
if (__float_as_int(a) < 0) {
t1 = CUDART_PI_F - t1;
}
其中a
和t1
是floats
和CUDART_PI_F
是float
先前设置为接近数学常数 Pi 的数值。我试图了解条件(if-clause)正在测试什么以及它的 C 等价物或 function/macro 是什么__float_as_int(a)
。我搜索了__float_as_int()
但没有成功的实现。这似乎__float_as_int()
是 NVIDIA NVCC 的内置宏或函数。查看 NVCC 从上述段落中产生的 PTX:
.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;
很明显,这不是__float_as_int()
四舍五入。(这将产生一个。)相反,它将作为位副本()分配给(注意:是类型(无符号整数)!!),然后将其作为(有符号整数,混淆!!)与(谁的价值是)。float
int
cvt.s32.f32
float %f1
b32
%r1
%r1
u32
%r1
s32
%r2
0
对我来说,这看起来有点奇怪。但显然它是正确的。
有人可以解释发生了什么,特别是解释__float_as_int()
在 if 子句测试是否定的(<0
)的上下文中正在做的事情吗?.. 并提供与 if 子句和/或__float_as_int()
marco 等效的 C 语言?