【问题标题】:Poor time utilization shown by vtune but the issue is unknownvtune 显示时间利用率低,但问题未知
【发布时间】:2014-10-06 14:29:45
【问题描述】:

使用 Intel Vtune 分析数据包处理应用程序。

仅在这条指令中时间利用率很低

add $0x100, %r8 (7%)

单次if检查时间利用率低

if(unlikely(VALUE == some_value)

这个 some_value 是 uint16_t,作为 (int*)&some_value 传递,如果有帮助,可以作为 (uint8_t*)some_value 进一步访问。

映射到以下

movzxw 0x3e(%rsp),%eax
test %ax,%ax ---- Leads in poor time utilization
jz Block x

将变量推入堆栈的函数时间利用率低 而其他人推送相同的变量并占用更少的时间

pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbp
pushq %rbx 
sub $0x48, %rsp
movq %rsi, 0x18(%rsp)

在内存访问分析、分支错误预测分析等中显示相同的问题。不明白如何克服这个问题

【问题讨论】:

  • 如果您显示数据并指出您认为时间利用率不佳的原因,这会有所帮助。
  • 这种选角对我来说看起来很狡猾,不仅仅是从性能的角度来看。
  • 这可能是试图让编译器将此变量保留在内存中(有点像尝试使用 volatile 来做到这一点,这通常是错误的)。

标签: c assembly x86 intel intel-vtune


【解决方案1】:

英特尔性能计数器不是周期精确的。有时附近的指令会获取不同指令中停顿的周期计数。 (附近 = 1 或 2 条指令)。

除非有一些非常奇怪的解码瓶颈,否则add $0x100, %r8 相对于附近的其他指令实际上不会花费很多时间。除非它在准备好之前因为需要%r8 的值而受到影响,也许。如果性能计数器以这种方式工作,则 IDK。

test / jz 对宏融合成一个微指令。那里的时间不是来自test,而是可能来自分支。是不是误判了很多?

慢推变量:该函数是递归的吗?还是在长调用链的末端?如果它将值推送到有一段时间没有被触及的内存缓存行(或更糟的是,页面)中,它将不会在 L1 缓存中并且访问速度会很慢。

在所有情况下,都需要更多的上下文才能说出任何确定的内容。一条指令本身对于性能分析几乎没有用处。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多