← 返回索引

Even Faster asin() Was Staring Right At Me

性能优化 数学 C++ ⭐⭐⭐⭐ (4星)

作者通过 Estrin 方案优化 asin() 三角函数近似算法,进一步提升性能达 1.88x。

关键亮点

  • Estrin 方案:利用指令级并行性 (ILP),减少依赖链从 3 个降至 2 个
  • 跨平台测试:Intel i7, AMD Ryzen 9 6900HX, Apple M4,Linux/Windows/macOS
  • 性能提升:MSVC 编译达 1.88x,GCC 1.80x,Clang 1.78x
  • 实用验证:光线追踪渲染器实际测试获得 +3% 提升
  • 结论:简单数学公式优于 LUT 查找表

基准测试结果

平台编译器std::asin()asin_cg()asin_cg_estrin()
Intel i7GCC 14.274385 ms48374 ms (1.54x)41388 ms (1.80x)
Intel i7MSVC84733 ms53592 ms (1.58x)45014 ms (1.88x)
AMD Ryzen 9GCC 14.274986 ms53129 ms (1.41x)52166 ms (1.44x)
Apple M4Clang 1733626 ms32755 ms (1.03x)30245 ms (1.11x)

技术细节

原始 Horner 方法:

double p = a3 * abs_x + a2;
p = p * abs_x + a1;
p = p * abs_x + a0;

Estrin 方案优化后:

const double x2 = abs_x * abs_x;
const double p = (a3 * abs_x + a2) * x2 + (a1 * abs_x + a0);

关键洞见:现代 CPU 的乱序执行可以并行计算 (a3 * abs_x + a2)(a1 * abs_x + a0),然后再执行最后一步乘法。