整数除法转浮点运算竟如此简单
Moving integer division to floating-point is trivial
当前硬件上的整数除法和取余运算延迟高、吞吐低,而浮点除法却快得多。我提出一个简单方法:将符合精度要求的整数转为浮点数,利用标准舍入模式下的浮点除法,再配合 fma 指令,即可精确还原整数商和余数。关键在于浮点除法在二进制下不存在“中间值”舍入问题,因此无需担心精度丢失。虽然涉及类型转换和舍入模式切换的开销,但在 SIMD 场景或特定硬件(如 AVX-512)下,这种技巧能显著提升性能。
对于能容纳在双精度或单精度浮点数范围内的整数,将其转为浮点后执行除法,再结合 fma 指令,就能精确得到整数商和余数。
- taeric
我很好奇,这些操作的延迟实际上比浮点运算还要差。是的,它们确实比许多整数指令差,但它们似乎与等效的浮点运算处于同一数量级?
- juancn
我很想看到一些在合理实际场景下的基准测试。
在许多常见情况下,位移和掩码操作可以替代整数除法(例如哈希表),从而完全避免除法,而这大概也就相当于将 int 转换为 float 的成本。
- RossBencina
x 和 y 是以浮点数形式表示的整数
> d = trunc(x/y); // floor 适用于无符号数
>
> // 注意:如果只需要 'd' 且它将被转换为整数,那么截断或取整操作在从 float 到整数的转换中是“免费”的。
请展示一下如何在 C 语言中可移植地“免费”将浮点值截断或向下取整为 int。