首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 OProfile 彻底了解性能(4)内核评测的例子

用 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 中 。
返回列表