我正在编写一个带有x86后端的即时编译器,并边走边学习x86汇编程序和机器代码。我在大约20年前使用过ARM汇编器,我对这些架构之间的成本模型差异感到惊讶。
具体地说,内存访问和分支在ARM上是昂贵的,但在x86上等价的堆栈操作和跳转是很便宜的。我相信现代的x86 CPU比ARM内核做的动态优化要多得多,我发现很难预测它们的效果。
在编写x86汇编器时,应该牢记什么是好的成本模型?哪些指令组合便宜,哪些指令组合昂贵?
例如,如果我的编译器总是生成用于加载整数或跳转到偏移量的长形式,即使整数很小或偏移量接近,也会更简单,但这会影响性能吗?
我还没有做过任何浮点运算,但我想尽快开始。普通代码和浮点代码之间的交互有什么不明显的地方吗?
我知道有很多关于x86优化的参考文献(例如Michael Abrash),但我有一种预感,超过几年的任何东西都不适用于现代x86 CPU,因为它们最近发生了太多变化。我说的对吗?
发布于 2012-03-31 23:10:06
最好的参考资料是Intel Optimization Manual,它提供了关于所有最新英特尔内核的体系结构风险和指令延迟的相当详细的信息,以及大量的优化示例。
另一个很好的参考是Agner Fog's optimization resources,它的优点是也涵盖了AMD核心。
请注意,特定的成本模型本质上是微体系结构特定的。没有一种所谓的"x86成本模型“具有任何真正的有效性。在指令级,Atom的性能特征与i7有很大的不同。
我还想指出的是,内存访问和分支在x86内核上实际上并不“便宜”--只是乱序执行模型已经变得如此复杂,以至于它可以在许多简单的场景中成功地隐藏它们的成本。
发布于 2012-04-02 17:34:36
Torbjörn Granlund的Instruction latencies and throughput for AMD and Intel x86 processors也不错。
编辑
Granlund的文档涉及在每个时钟周期可以发出多少特定类型的指令(即并行执行)的上下文中的指令吞吐量。他还声称,英特尔的文档并不总是准确的。
发布于 2016-08-08 08:30:50
当然,Agner Fog的报告和英特尔®64与IA-32架构优化参考手册都是必要的优秀参考资料。AMD还有一本优化手册:
适用于AMD系列15h处理器的
不过,要理解代码序列,两个英特尔工具是必不可少的:
™
IACA是你的成本模型。我在OSX上使用它,但VTune只能在Windows和Linux上运行。
您还可以深入研究英特尔专利文献和各种英特尔论文,以更好地了解事物的工作原理:
下一代英特尔酷睿Microarchitecture
的节能前端
https://stackoverflow.com/questions/9957004
复制相似问题