快速 Unorm 转换

主要观点:介绍将 5 位无符号归一化(unorm)转换为 8 位 unorm 的问题及多种优化方法,包括浮点数技巧、unsafe代码、查找表(LUT)、整数舍入、乘法加法方法等,并比较各方法的性能。
关键信息:

  • unorm 是将 0 到 1 的实数表示为 0 到 2ⁿ⁻¹的整数,在计算机图形学等领域广泛应用,如图像编辑程序和网页颜色。
  • 给出将 5 位 unorm 转换为 8 位 unorm 的公式x₈ = round(x₅⋅255/31),并在 Rust 中实现了朴素版本和优化版本的函数。
  • 通过查看汇编代码分析编译器的优化情况,如避免f32::round函数调用、去除不必要的 clamping 等。
  • 介绍了多种优化方法及其代码实现和性能测试结果,如使用unsafe代码避免 clamping、使用 LUT 提高速度、整数舍入和乘法加法方法等,其中乘法加法方法最快。
  • 提到了通用的乘法加法方法可用于其他舍入函数和乘法运算,以及特殊情况如将 n 位 unorm 转换为 2n 位 unorm 的简化公式。
    重要细节:
  • Rust 中没有 5 位类型,x: u8并使用debug_assert!来模拟 5 位整数。
  • 基准测试用于评估不同实现的性能,使用criterion库在特定系统上进行测试。
  • 不同优化方法的代码实现细节,如f32::to_int_unchecked的使用、乘法加法方法中常数的选择等。
  • 各种方法性能的比较结果,如朴素版本约 197µs,优化后的乘法加法方法约 4.6µs,快约 43 倍。
  • 关于查找表的注意事项,如之前 Rust 版本的性能回归及当前版本的优化。
  • 强调正确性先于性能,以及对乘法加法方法中常数正确性验证的困难。
阅读 15
0 条评论