CUDA Cの数学関数の実装(cuda/math_function.h
)にacosf
は、次のパッセージが含まれています。
if (__float_as_int(a) < 0) {
t1 = CUDART_PI_F - t1;
}
ここで、およびa
はt1
、以前は数学定数Piに近い数値に設定されていました。条件付き(if-clause)が何をテストしているのか、それと同等のCまたは関数/マクロは何であるのかを理解しようとしています。私はの実装を探しましたが、成功しませんでした。NVIDIANVCCに組み込まれているマクロまたは関数のようです。NVCCが上記のパッセージから生成するPTXを見てください。floats
CUDART_PI_F
float
__float_as_int(a)
__float_as_int()
__float_as_int()
.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
(unsigned int)!!)に割り当てられ、 (signed int、紛らわしい!!)で%r1
あるかのように比較されます。 (誰の値は)。s32
%r2
0
私にはこれは少し奇妙に見えます。しかし、明らかにそれは正しいです。
誰かが何が起こっているのかを説明できますか、特に__float_as_int()
否定的であるためのif-clauseテストのコンテキストで何が起こっているのかを説明できますか(<0
)?..そしてif節および/または__float_as_int()
marcoと同等のCを提供しますか?