__fdividef
sd3_float frac = __fdividef(1.0f, (sd3_float)ksp_in(k));1. __fdividef 是什么?
- 这是 CUDA 提供的设备端内置函数(intrinsic),只能在 GPU 代码中使用。
- 它的作用是执行 单精度浮点数除法(float ÷ float)。
- 和普通的
/操作不同,__fdividef是一个快速除法,精度和 IEEE754 完全严格遵循的除法可能有些差别。
2. 和普通除法的区别
a / b:用 CUDA 的 浮点除法指令,保证 IEEE754 标准下的精度。__fdividef(a, b):用 CUDA 内置的 快速近似除法,一般会转成1/b的快速倒数近似,然后乘以a。
特点:
-
速度快:比标准除法快(尤其在老架构上,差别更明显)。
-
精度稍低:当分母非常大或非常小的时候,结果可能比
a/b少几个 ULP(单位最后位精度)。 -
范围限制:
a / b能支持到 ±INF。__fdividef(a, b)如果|b| > 2^126(非常大的数),会直接返回0;如果|b| < 2^-126(非常接近 0),可能返回 ±INF 或 NaN。
3. 为什么用它?
在你的 kernel 里:
frac = 1.0f / ksp_in(k);- 其中
ksp_in(k)是某个整型数组(正整数)。 - 分母不太可能极端大或极端小,一般在合理范围内。
- 所以用
__fdividef可以 加速 计算,不必担心精度损失太多。
4. 等效写法
这行代码等价于:
sd3_float frac = 1.0f / (sd3_float)ksp_in(k); // 普通写法区别是:
__fdividef速度更快,精度稍低。- 普通
/精度更高,但速度略慢。