问题描述
我有一个执行 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 (将#修改为@)