因此,我们的任务是编译一些代码(我们应该将其视为黑盒),使用不同的英特尔编译器优化标志(-O1 和 -O3)以及矢量化标志(-xhost 和 - no-vec) 并观察以下方面的变化:
- 执行时间处理时间
- 浮点运算 (FPO)
- L2 和 L3 缓存未命中率
在执行这些优化之后,我们注意到执行时间有所下降,这是意料之中的,考虑到编译器为了提高效率而对您的代码所做的所有更改。然而,我们也注意到 FPO 的数量有所下降,虽然我们知道这是一件好事,但我们不确定它为什么会发生。此外,我们注意到(并且无法解释)L2 缓存未命中率增加(随着优化级别的增加而增加),但缓存访问没有显着增加,L3 级别几乎没有变化。
完全不使用矢量化或优化在 L2 缓存未命中率方面产生了最佳结果,我们想知道你们是否可以给我们一些见解,以及我们可以用来加深我们知识的支持文档、文献和资源关于这个话题。
谢谢你。
编辑:使用的编译器选项是:
- O0 -no-vec(最高执行时间,最低 L2 缓存未命中)
- O1(更少的执行时间,更高的 L2 缓存未命中)
- O3(更短的执行时间,更高的 L2 缓存未命中)
- xhost(与 -O3 执行时间相同的顺序,最高 L2 缓存未命中)
更新:
虽然整体 L2 缓存访问量略有下降,但实际未命中率却大幅增加。
带 -0O -no-vec
挂钟时间 (usecs):13,957,075
- 二级缓存未命中:207,460,564
- 二级缓存访问:1,476,540,355
- 二级缓存未命中率:0.140504
- L3 缓存未命中:24,841,999
- L3 缓存访问:207,460,564
- L3 缓存未命中率:0.119743
使用 -xhost
挂钟时间 (usecs):4,465,243
- 二级缓存未命中:547,305,377
- 二级缓存访问:1,051,949,467
- 二级缓存未命中率:0.520277
- L3 缓存未命中:86,919,153
- L3 缓存访问:547,305,377
- L3 缓存未命中率:0.158813