Jon*_*rop 30 floating-point performance x86 assembly micro-optimization
我正在编写一个带有x86后端的JIT编译器,并且随时学习x86汇编器和机器代码.大约20年前我使用ARM汇编程序,并对这些体系结构之间的成本模型差异感到惊讶.
具体来说,内存访问和分支在ARM上很昂贵,但在x86上等效的堆栈操作和跳转很便宜.我相信现代x86 CPU比ARM内核做更多的动态优化,我发现很难预测它们的影响.
编写x86汇编程序时要记住什么是好的成本模型?哪些指令组合便宜又昂贵?
例如,如果它总是生成用于加载整数或跳转到偏移的长格式,即使整数很小或偏移量接近但这会影响性能,我的编译器会更简单吗?
我还没有做任何浮动点,但我很快就会接受它.普通代码和浮动代码之间的相互作用有什么不明显的吗?
我知道有很多关于x86优化的参考文献(例如Michael Abrash),但我有一个预感,而不是几年前的任何东西都不适用于现代的x86 CPU,因为它们最近发生了很大的变化.我对么?
Ste*_*non 35
最佳参考资料是英特尔优化手册,它提供了有关所有最新英特尔内核的架构危险和指令延迟的相当详细的信息,以及大量优化示例.
另一个很好的参考是Agner Fog的优化资源,它具有覆盖AMD核心的优点.
请注意,具体的成本模型本质上是微架构特定的.没有"x86成本模型"这样的东西具有任何真实的有效性.在指令级别,Atom的性能特征与i7大不相同.
我还要注意,内存访问和分支在x86内核上实际上并不"便宜" - 只是无序执行模型变得如此复杂,以至于它可以在许多简单的场景中成功地隐藏它们的成本.
TorbjörnGranlund 对AMD和Intel x86处理器的指令延迟和吞吐量也很好.
编辑
Granlund的文档涉及在每个时钟周期可以发出多少指令类型的上下文中的指令吞吐量(即,并行执行).他还声称英特尔的文档并不总是准确的.