用 OProfile 彻底了解性能(4)内核评测的例子
- UID
- 1066743
|
用 OProfile 彻底了解性能(4)内核评测的例子
下面列出的评测数据是通过用于 2.5.70 内核的 kernbench 基准为事件 BR_MISS_PRED_TAKEN_RET 收集的。总共为 vma_merge 收集了 23,360 个采样,为 do_mmap_pgoff 收集了20,717 个采样。
清单 6. 内核的评测数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # oprofpp -l -i /boot/vmlinux | tail -20
c0143510 4719 1.26446 page_add_rmap
c0117740 4791 1.28375 schedule
c0140320 4825 1.29286 find_vma_prepare
c010f720 4862 1.30278 sys_mmap2
c0134fc0 5005 1.34109 __alloc_pages
c0123670 5473 1.46649 run_timer_softirq
c0134800 5648 1.51339 bad_range
c0139250 6571 1.7607 mark_page_accessed
c0143bd0 6919 1.85395 __pte_chain_free
c013f180 6973 1.86842 do_no_page
c0140ec0 7393 1.98096 get_unmapped_area
c01400f0 8020 2.14896 vm_enough_memory
c0140ff0 9897 2.65191 find_vma
c01594e0 10939 2.93111 link_path_walk
c0134e70 11467 3.07259 buffered_rmqueue
c0117370 11690 3.13234 scheduler_tick
c013eeb0 17463 4.67922 do_anonymous_page
c01153e0 20322 5.44529 do_page_fault
c01408e0 20717 5.55113 do_mmap_pgoff
c0140600 23360 6.25933 vma_merge
|
转移的错误预测可以通过删掉转移来排除。在 Intel IA32 处理器中,转移可以通过使用 SETcc 指令或使用P6 处理器的条件转移指令 move CMOVcc 或者 FCMOVcc 来删除。
下面的C代码行表示了条件转移:
(A > B) ? C1 : C2;
下面是上述该C代码的等价汇编指令:
清单 7. 等价的汇编指令1
2
3
4
5
6
7
| cmp A, B ; compare
jge L30 ; conditional branch
mov ebx, CONST1
jmp L31 ; unconditional branch
L30:
mov ebx, CONST2
L31:
|
可以优化这段代码,以消除类似如下的转移:
清单 8. 删除转移后的等价汇编指令1
2
3
4
5
6
| xor ebx, ebx ;
cmp A, B
setge b1 ; if ebx = 0 or 1
dec ebx
and ebx, (CONST2-CONST1)
add ebx, min(CONST2,CONST1) ; ebx = CONST1 or CONST2
|
经过优化的代码将寄存器 EBX 设置为 0,然后比较 A 和 B。如果 A 大于或等于 B, EBX 则被置为 1。 EBX 的值被减少,并且与两个常量值的差执行与( AND )操作。这就将 EBX 或者设置为 0,或者将其设置为两个值的差。通过加上两个常量值中较小的一个,这样就把正确的值写到了 EBX 中 。 |
|
|
|
|
|