我有几个“神奇”的浮点常量,我想在 CUDA 设备端计算中以
constexpr
符号的形式使用位精确的常量。在主机端,您可以使用 std::bit_cast<float>(0x........)
来实现这一点。然而 NVCC 并不“喜欢”设备端代码中的std::bit_cast
。
在 GLSL 中,您可以使用
intBitsToFloat
,但是我在 CUDA C++ 语言扩展中没有看到可以执行此操作的内置函数。
1:嗯,它们并不是那么“神奇”,基本上它们是相当于 0.999…·2ⁿ 的浮点,即将尾数的所有位设置为
1
,并将 -(n+1)
添加到指数“0” (即0x7E-n-1
)。
如果有支持它的 host 编译器,您可以在 CUDA C++20
device代码中使用
std::bit_cast
来初始化 constexpr
变量。您只需要通过传递 --expt-relaxed-constexpr
告诉 nvcc 即可实现。