为什么在执行指针追逐时这条跳转指令如此昂贵?

问题描述

我有一个执行 pointer chasing 的程序,我正在尝试尽可能地优化指针追踪循环。 我注意到 perf record 检测到函数 myFunction() 中约 20% 的执行时间用于执行跳转指令(用于在读取特定值后退出循环)。

注意事项:

  • 指针追踪路径可以轻松放入 L1 数据缓存
  • 使用 __builtin_expect 来避免分支错误预测的成本没有明显效果

perf record 具有以下输出:

Samples: 153K of event 'cycles',10000 Hz,Event count (approx.): 35559166926                                                                                                                                                               
myFunction  /tmp/foobar [Percent: local hits]                                                                                                                                                                            
Percent│      endbr64                                                                                                                                                                                                                       
      ...
 80.09 │20:   mov     (%rdx,%rbx,1),%ebx                                                                                                                                                                                                    
  0.07 │      add     $0x1,%rax                                                                                                                                                                                                             
       │      cmp     $0xffffffff,%ebx                                                                                                                                                                                                      
 19.84 │    ↑ jne     20                                                                                                                                                                                                                    
      ...

我希望在这个循环中花费的大部分周期都用于从内存中读取值,这是由 perf 确认的。 我还希望剩余的周期在执行循环中剩余的指令时会有些均匀地花费。相反, perf 报告的是剩余周期的很大一部分用于执行跳转。

我怀疑通过了解用于执行这些指令的微操作,我可以更好地了解这些成本,但我有点不知从何开始。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)