【发布时间】:2016-12-25 21:27:11
【问题描述】:
在我的工作负载上运行英特尔 VTune 时,我看到以下内容:
Memory Bound 50.8%
我阅读了英特尔文档,上面写着(Intel doc):
Memory Bound 测量一小部分插槽,其中流水线可能由于需求加载或存储指令而停止。这主要是由于不完整的动态内存需求负载与执行饥饿相吻合,此外还有一些不太常见的情况,即存储可能对管道造成背压。
这是否意味着我的应用程序中大约有一半的指令在等待内存时停止,还是比这更微妙?
【问题讨论】:
-
您能否链接该文档,以便我们了解“插槽”的含义?流水线乱序 CPU 不只是一次运行一条指令,因此您的解释没有意义。如果一条指令必须等待但有独立的工作来保持 CPU 忙碌,这不是吞吐量问题。这更有可能是对没有执行微指令或没有微指令退役的周期的度量。 (它几乎肯定不是前端测量,除非它可以跟踪 ROB 已满的原因或任何其他阻止 uops 发出的原因。)
-
现在将在最初的帖子中这样做。谢谢。
-
简而言之:不要考虑哪些指令会受到缓慢的影响;考虑一下您的代码是否让 CPU 为其饥饿的执行单元提供工作,不管它发生的顺序是什么。
-
是的,我在后端有 4 个管道来执行分配的 uOps。我相信“插槽”是“管道插槽”。但是,我仍然可以将所有管道槽数一起计算,并说所有槽中有 X% 已停止。
-
@PeterCordes 大多数这些数字 IMO 本身毫无意义,因为它们定义不明确。它们仅在比较两个不同的运行时才有用。这包括诸如缓存未命中计数之类的内容,因为在涉及重叠未命中时,“缓存未命中”的定义很差。如果有的话,CPI 和程序集热点是识别“内存绑定”事物的最佳方法。任何具有非常高 CPI 的东西都是可疑的。与周围的指令相比,任何带有大得离谱的条的内存访问也是很好的指标。
标签: performance x86 profiling intel intel-vtune