6

因此,我们的任务是编译一些代码(我们应该将其视为黑盒),使用不同的英特尔编译器优化标志(-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
4

2 回答 2

2

关于浮点操作数量的减少:
通过优化,编译器可以将常见计算提升到循环之外、融合常量、预计算表达式等。

关于增加缓存未命中率:
如果编译器使用向量化,并且每次加载一个完整向量宽度的数据,它将使用更少的内存加载。但是每次它以预测器没有预料到的方式访问缓存行时,它仍然会导致缓存未命中。
总之,您的负载更少,但所触及的缓存线数量大致相同,因此未命中可能会更高。

于 2014-10-29T19:48:41.500 回答
2

EOF 的回答对较少的浮点操作有很好的解释:操作-ffast-math的样式组合,所以我只回答另一部分。


这个问题没有关于使用什么 CPU 微架构的信息,但至少它被标记为

在 Intel CPU 上,有一些逻辑可以预取到 L1,还有更复杂的逻辑可以预取到 L2(从 L3 或主存储器)。每个核心都有自己的 L2,但缓存层次结构的较低级别是共享的,因此它是放置主要预取逻辑的明显位置。

如果您的读取速度低于内存带宽的限制,您的负载将在 L2 中达到,因为硬件预取器已经将这些行提取到 L2 中。 如果预取跟不上,你会得到 L2 cache misses

更少的更宽负载而不是更多的标量负载也意味着向量的缺失百分比会更糟。(EOF 的回答已经说明了这一点)。这种效应并不能解释 L2 未命中的绝对数量的增加,但是,只有(部分)未命中百分比发生了变化。不过,在查看数据时要牢记这一点仍然很重要。


来自 Intel 的优化指南(标签 wiki 中的链接),第 2.3.5.4 节:数据预取

数据预取到 L2 和最后一级缓存

Streamer:此预取器监视来自 L1 高速缓存的读取请求以获取地址的升序和降序序列......当检测到请求的前向或后向流时,预取预期的高速缓存行。预取的缓存行必须在同一个 4K 页面中。

  • 流媒体可以在每次 L2 查找时发出两个预取请求。流媒体可以在加载请求之前运行多达 20 行。
  • 动态调整每个核心的未完成请求数。如果未完成的请求不多,则流式传输器会提前预取。如果有许多未完成的请求,它只预取到 LLC 并且不那么远。
  • 当缓存线遥遥领先时,它只预取到最后一级缓存而不是 L2。这种方法避免了替换二级缓存中有用的缓存行。
  • 检测并维护多达 32 个数据访问流。对于每个 4K 字节的页面,可以维护一个前向流和一个后向流。

这是来自 Sandybridge 部分,但 Haswell 和 Skylake 部分没有详细介绍预取的更改。他们说“改进的预取”,但大概是相同的基本设计,只是具有更好的启发式和/或对现有启发式进行更好的调整,以及类似的东西。


感谢@HansPassant:他对这个问题的评论让我想到了预取跟不上。

于 2016-04-15T08:24:27.193 回答