如果还没有为 cachetest 收集性能数据,必须进行收集。相关说明参见为 cachetest 示例收集数据。
在本部分中,将检查两个不同优化选项 -O2 和 -fast 对程序性能的影响。带注释的源代码中显示的编译器注释消息将指出对代码所做的转换。
源代码与 dgemv 和 dgemv2 中的源代码相同。不同之处是 dgemv_opt1 和 dgemv_opt2 已经用 -O2 编译器选项编译过。无论使用用户 CPU 时间还是 CPU 周期进行度量,这两个函数都显示出 CPU 时间的减少,;执行的指令数的减少也几乎相同,但没有一个函数改进了缓存行为。
源代码与 dgemv_opt1 和 dgemv_opt2 中的源代码相同。不同之处是它们已经用 -fast 编译器选项编译过。现在两个例程都有相同的 CPU 时间和缓存性能。与 dgemv_opt1 和 dgemv_opt2 相比,CPU 时间和缓存延迟周期时间都有所减少。等待缓存加载大约占用 80% 的执行时间。
编译器已经执行大量工作来优化此函数。它已经交换了导致 DTLB 未命中问题的循环。此外,编译器创建了新循环,每个循环周期都执行更多的浮点加法和浮点乘法运算,并且插入了预取指令来改进缓存行为。
除了循环交换外,编译器注释消息与 dgemv_hi1 的相同。此时,编译器为这两种函数生成的汇编代码基本相同。
将该反汇编列表与 dgemv_g1 或 dgemv_opt1 的反汇编列表进行比较。对于 dgemv_hi1,生成的指令更多,但执行的指令数量在三种函数中是最少的。优化可以产生更多指令,但这些指令可被更有效地使用和更少地执行。
另请参见 | |
---|---|
函数标签 源标签 反汇编标签 查找数据流问题 |