5.10 优化合并代码的结果小结

5.10 优化合并代码的结果小结

我们极大化对向量元素加或者乘的函数性能的努力获得了成功。下表总结了对于标量代码所获得的结果,没有使用 AVX 向量指令提供的向量并行性:

函数/界限 方法 整数 + 整数 * 浮点数 + 浮点数 *
combine1 抽象 -O1 10.12 10.12 10.17 11.14
combine6 2×2 循环展开 0.81 1.51 1.51 2.51
10×10 循环展开 0.55 1.00 1.01 0.52
延迟界限 1.00 3.00 3.00 5.00
吞吐量界限 0.50 1.00 1.00 0.50

使用多项优化技术,我们获得的 CPE 已经接近于 0.50 和 1.00 的吞吐量界限,只受限于功能单元的容量。与原始代码相比提升了 10~20 倍,且使用普通的 C 代码和标准编译器就获得了所有这些改进。重写代码利用较新的 SIMD 指令得到了将近 4 倍或 8 倍的性能提升。比如单精度乘法,CPE 从初值 11.14 降到了 0.06,整体性能提升超过 180 倍。这个例子说明现代处理器具有相当的计算能力,但是我们可能需要按非常程式化的方式来编写程序以便将这些能力诱发出来。