Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux 直线代码中的指令造成的开销差异很大_Linux_Linux Kernel_Profiling_Perf - Fatal编程技术网

Linux 直线代码中的指令造成的开销差异很大

Linux 直线代码中的指令造成的开销差异很大,linux,linux-kernel,profiling,perf,Linux,Linux Kernel,Profiling,Perf,我试图理解Linux块层中的[blk\u account\u io\u completion][1]中的开销。使用perf annotate我得到以下代码片段(节略)。有人能解释一下为什么add和test指令与使用它们执行的相邻指令相比会有这样的开销吗 : part_stat_add(cpu, part, sectors[rw], bytes >> 9); 0.13 : ffffffff813336eb

我试图理解Linux块层中的
[blk\u account\u io\u completion][1]
中的开销。使用
perf annotate
我得到以下代码片段(节略)。有人能解释一下为什么
add
test
指令与使用它们执行的相邻指令相比会有这样的开销吗

         :                      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>
:部分统计添加(cpu、部分、扇区[rw],字节>>9);
0.13:FFFFFF813336EB:movsxd r8,r8d
0.00:ffffffffff813336ee:leardx[rax*8+0x0]
0.00:ffffffff813336f6:mov rcx,QWORD PTR[rdi+0x210]
72.04:ffffffff813336fd:添加rcx,QWORD PTR[r8*8-0x7e2df6a0]
0.22:ffffffffffff81333705:add QWORD PTR[rcx+rdx*1],rsi
0.61:ffffffff81333709:mov eax,DWORD PTR[rdi+0x1f4]
26.52:ffffffff8133370f:测试eax,eax
0.00:FFFFFF81333711:je FFFFFFFFFF81333733

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

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

或者,可能是
mov-rcx、QWORD-PTR[rdi+0x210]
mov-eax、DWORD-PTR[rdi+0x1f4]
经常错过缓存,而在缓存上花费的周期归因于下一条指令,如所示

│ 第节的分解。正文: │ │ 0000000000 4004ED: │ 推送%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│ 添加$0x1,-0x4(%rbp) 0.33│25:cmpl$0x3fffffff,-0x4(%rbp) 13.90│ ↑ jbe d │ 弹出%rbp │ ← retq │ Disassembly of section .text: │ │ 00000000004004ed : │ push %rbp │ mov %rsp,%rbp │ movl $0x0,-0x4(%rbp) │ ↓ jmp 25 14.59 │ d: nop │ nop │ nop 0.03 │ nop 14.58 │ nop │ nop │ nop 0.08 │ nop 13.89 │ nop │ nop 0.01 │ nop 0.08 │ nop 13.99 │ nop │ nop 0.01 │ nop 0.05 │ nop 13.92 │ nop │ nop 0.01 │ nop 0.07 │ nop 14.44 │ addl $0x1,-0x4(%rbp) 0.33 │25: cmpl $0x3fffffff,-0x4(%rbp) 13.90 │ ↑ jbe d │ pop %rbp │ ← retq