【问题标题】:Big difference in overhead caused by instructions in straight-line code直线代码中的指令导致的开销差异很大
【发布时间】:2017-01-09 22:56:43
【问题描述】:

我试图了解 Linux 块层中 [blk_account_io_completion][1] 的开销。使用perf annotate 我得到以下sn-p(删节)。有人能解释一下为什么addtest 指令与它们一起执行的相邻指令相比具有这样的开销吗?

         :                      part_stat_add(cpu, part, sectors[rw], bytes >> 9);
    0.13 :        ffffffff813336eb:       movsxd r8,r8d
    0.00 :        ffffffff813336ee:       lea    rdx,[rax*8+0x0]
    0.00 :        ffffffff813336f6:       mov    rcx,QWORD PTR [rdi+0x210]
   72.04 :        ffffffff813336fd:       add    rcx,QWORD PTR [r8*8-0x7e2df6a0]
    0.22 :        ffffffff81333705:       add    QWORD PTR [rcx+rdx*1],rsi
    0.61 :        ffffffff81333709:       mov    eax,DWORD PTR [rdi+0x1f4]
   26.52 :        ffffffff8133370f:       test   eax,eax
    0.00 :        ffffffff81333711:       je     ffffffff81333733 <blk_account_io_completion+0x83>

【问题讨论】:

    标签: linux linux-kernel profiling perf


    【解决方案1】:

    一个可能的原因是这些指令在采样时恰好被指令指针指向。一个典型的 x86 CPU 每个周期最多可以退出 4 条指令,但是当它这样做并且样本是令牌时,程序计数器将只指向一条指令,而不是所有这四条指令。

    这是一个例子 - 见下文。带有一堆 nop 指令的简单循环。请注意时钟信号如何分布在此配置文件中,间隙中恰好有三个指令。这可能与您看到的效果相似。

    或者,mov rcx,QWORD PTR [rdi+0x210]mov eax,DWORD PTR [rdi+0x1f4] 经常会错过缓存,而花在缓存上的周期归因于下一条指令,例如参见 here

    │ 段.text的反汇编: │ │ 00000000004004ed : │ 推 %rbp │ mov %rsp,%rbp │ movl $0x0,-0x4(%rbp) │ ↓ jmp 25 14.59│d:无 │ 无 │ 无 0.03 │ 无 14.58│没有 │ 无 │ 无 0.08 │ 无 13.89 │ 没有 │ 无 0.01 │ 无 0.08 │ 无 13.99│没有 │ 无 0.01 │ 无 0.05 │ 无 13.92│没有 │ 无 0.01 │ 无 0.07 │ 无 14.44 │ addl $0x1,-0x4(%rbp) 0.33│25:cmpl $0x3fffffff,-0x4(%rbp) 13.90 │ ↑ jbe d │ 流行 %rbp │ ← retq

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多