Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 解读英特尔VTune';s内存界度量_Performance_X86_Profiling_Intel_Intel Vtune - Fatal编程技术网

Performance 解读英特尔VTune';s内存界度量

Performance 解读英特尔VTune';s内存界度量,performance,x86,profiling,intel,intel-vtune,Performance,X86,Profiling,Intel,Intel Vtune,在工作负载上运行“英特尔VTune”时,我会看到以下情况: Memory Bound 50.8% 我读了《英特尔文件》,上面说: 内存限制度量的是管道可能由于请求加载或存储指令而暂停的插槽的一小部分。这主要是由于飞行中内存需求加载不完整,这与执行不足相吻合,此外,在不太常见的情况下,存储可能意味着管道背压 这是否意味着我的应用程序中大约有一半的指令在等待内存时被暂停,或者比这更微妙?VTune使用的管道插槽概念如下所示:。 简言之,

在工作负载上运行“英特尔VTune”时,我会看到以下情况:

 Memory Bound                  50.8%             
我读了《英特尔文件》,上面说:

内存限制度量的是管道可能由于请求加载或存储指令而暂停的插槽的一小部分。这主要是由于飞行中内存需求加载不完整,这与执行不足相吻合,此外,在不太常见的情况下,存储可能意味着管道背压


这是否意味着我的应用程序中大约有一半的指令在等待内存时被暂停,或者比这更微妙?

VTune使用的管道插槽概念如下所示:。 简言之,管道插槽表示处理一个uOp所需的硬件资源。因此,对于4宽CPU(大多数英特尔处理器),我们每个周期可以执行4次操作,插槽总数将通过VTune测量为4*CPU\u CLK\u UNHALTED.THREAD。 内存限制指标建立在CYCLE_ACTIVITY.STALLS_MEM_任何因内存直接导致暂停的事件上。考虑到故障。基本上,只有当CPU停止运行,并且同时具有飞行中的负载时,计数器才会增加。如果在运行中有负载,但CPU一直忙,则不会将其视为内存暂停。 因此,内存限制度量提供了关于内存性能问题限制了多少工作负载的非常准确的估计。50%的值意味着有一半的时间浪费在等待来自内存的数据上。

A是管道的执行端口。通常,在VTune文档中,暂停可能表示“未退出”或“未调度执行”。在这种情况下,它是指分派零UOP的周期数

根据VTune包含配置文件,
内存限制
计算如下:

内存绑定
=
内存绑定
*
后端绑定

内存绑定部分
基本上是文档中提到的插槽部分。但是,根据优化手册中讨论的自上而下方法,内存绑定度量是相对于后端绑定度量的。这就是为什么它要乘以
BackendBound

我将重点讨论公式的第一项,
内存绑定分数
。第二项的公式,
BackendBound
,实际上很复杂

内存绑定分数的计算如下所示:

Memory\u-Bound\u Fraction
=(
CYCLE\u ACTIVITY.STALLS\u MEM\u ANY
+
RESOURCE\u STALLS.SB
)*
NUM\u个端口
/
后端\u-Bound\u个周期
*
NUM\u个端口

NUM\u OF_port
是目标CPU微体系结构的执行端口数。这可以简化为:

Memory\u-Bound\u Fraction
=
CYCLE\u ACTIVITY.STALLS\u MEM\u ANY
+
RESOURCE\u STALLS.SB
/
Backend\u-Bound\u Cycles

CYCLE\u ACTIVITY.STALLS\u MEM\u ANY
RESOURCE\u STALLS.SB
是性能事件<代码>后端\u绑定\u周期
计算如下:

Backend\u Bound\u Cycles
=
CYCLE\u ACTIVITY.STALLS\u TOTAL
+
UOPS\u EXECUTED.Cycles\u GE\u 1\u UOPS\u exece
-
很少执行的UOPS\u Threshold
-
前端空的uu Cycles
+
资源暂停.SB

level\u Uops\u Executed\u Threshold
要么是
Uops\u Executed.CYCLES\u GE\u 2\u UOP\u exece
要么是
Uops\u Executed.CYCLES\u GE\u 3\u UOP\u exece
,具体取决于其他指标
Frontend\u RS\u Empty\u Cycles
RS\u事件。Empty\u Cycles
或零取决于某些度量


我意识到这个答案还需要很多额外的解释,
BackendBound
需要扩展。但是这个早期的编辑使答案准确。

你能链接文档,让我们看看他们所说的“槽”是什么意思吗?流水线式无序CPU一次不运行一条指令,因此您的解释没有意义。如果一条指令必须等待,这不是吞吐量问题,但是有独立的工作使CPU保持忙碌。更可能的情况是,这是对未执行UOP或未停用UOP的周期的度量。(这几乎肯定不是一个前端测量,除非它能够跟踪ROB满的原因或任何其他阻止UOP发行的原因。)将在最初的帖子中立即这样做。谢谢。简言之:不要考虑哪些指令会受到慢动作的影响;考虑一下您的代码是否允许CPU为其饥饿的执行单元提供要做的工作,不管它以什么顺序发生。是的,我在后端有4条管道来执行分配的UOP。我相信“槽”是“管道槽”。但是,我仍然可以将所有管道插槽一起计算,并说所有插槽中的X%都被暂停了。@PeterCordes在我看来,这些数字中的大多数都是毫无意义的,因为它们的定义很差。它们只有在比较两次不同的运行时才有用。这包括缓存未命中计数之类的内容,因为当涉及重叠未命中时,“缓存未命中”的定义很差。如果有什么区别的话,那么CPI和程序集热点是识别“内存受限”的事物的最佳方法。任何消费物价指数真的很高的东西都是可疑的。与周围的指令相比,任何具有大得离谱的条的内存访问都是很好的指标。我还没有深入阅读那篇文章。但是CPU可能会因为更多的原因而停止运行,而不仅仅是内存问题。因此,仅仅因为CPU在运行中负载时停止运行并不一定意味着它因为内存而停止运行。我不知道VTune在计算该指标时是否考虑了这一点。但是如果没有,那么很难说“有一半的时间是浪费在等待内存中的数据上的”。同时,“暂停”是否定义为4个问题槽中的任何一个是空的?还是当所有4个插槽都被禁用时