Even Faster asin() Was Staring Right At Me
作者通过 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 i7 | GCC 14.2 | 74385 ms | 48374 ms (1.54x) | 41388 ms (1.80x) |
| Intel i7 | MSVC | 84733 ms | 53592 ms (1.58x) | 45014 ms (1.88x) |
| AMD Ryzen 9 | GCC 14.2 | 74986 ms | 53129 ms (1.41x) | 52166 ms (1.44x) |
| Apple M4 | Clang 17 | 33626 ms | 32755 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),然后再执行最后一步乘法。