英特尔APX,终于等到你

大约10年前,我以英特尔员工的身份到腾讯公司做技术分享,在提问环节里,第一个抢到话筒的同行以急切的语调提出了一个非常急切地问题:“Intel的硬件断点寄存器数量太少了,什么时候能增加啊?”

听到这个问题,我立刻知道这位同行的技术水平很深,他不仅知道很多软件工程师不知道的硬件断点,而且还知道这个功能的原理是依赖CPU硬件的,而且他知道X86 CPU的硬件断点寄存器数量很少,每个逻辑CPU只有4个地址寄存器,最多只支持4个硬件断点。这个设计是1985年推出的80386所定义的,几十年没有变化。

演讲是在腾讯大楼的一个大会议室里(如今记不清是哪一层了),台下的听众很多,我远远地能望见这个提问的同行,我清楚地听到了他的问题,也完全理解了他的问题。我对他的专业深度表示敬佩,而且对他的述求深表赞同,但是我却无法给他一个让他满意的答案,比如,“下一代CPU就会增加一倍...”。

事实上,在这个演讲之前,我曾经通过Intel公司内部的正式渠道,提交了正式的技术方案,详细设计了如何扩展调试寄存器,包括如何与老的设计保持兼容。但是方案发出后,经过一些人的review后,最终的结果是消极的。后来到美国出差时,我和一位资深的老同事聊天谈起这个问题,他说:“任何对经典386特征的修改都难推动......”

这几年创业,我仔细学习了ARM,当我越深的了解ARM时,我越感觉到X86的不足。X86多年停滞不前,已经被ARM超越了很远。

最近,因为要准备9月份的纳秒级优化训练营,我不得不又把注意力转回到x86上,因为在纳秒级优化所针对的听众里,他们主要还是用x86的。

首先,我把熟悉的几份经典技术文档更新了一下,特别是著名的SDM(软件开发者手册)和SOM(软件优化手册)。

在更新这些文档时,我意外地发现了一份新文档,Intel® Advanced Performance Extensions (Intel® APX) Architecture Specification(《英特尔高级性能扩展(APX)架构规约》)。

6313c2b76cfc049471b98b38e6f4dd22.png

打开这份文档,读了几句后,我意识到这是个大动作(Big Thing),是我期待许久的。

这几天在改进庐山研习班的讲义时,我把APX加入到了寄存器一讲的讲义里。

c44c361b5b61041a6988b180a8a5bab9.png

APX引入了多项变革,排在最前面的就是通用寄存器。经典386只有8个通用寄存器,AMD扩展的X64把8个扩展为16个。

APX把通用寄存器的数量从16个扩展为32个。

寄存器是CPU工作时可以快速访问到的临时空间,用图灵的话来说叫“

Quick reference temporary storage units (TS)”。

准备讲义时,我特意查阅了图灵写于1946年的ACE设计报告,在这个报告里,图灵将寄存器列在ACE的关键部件里,并且给出了建议的数量,50个,每个32位。

7b2d24c2087a654cc23a3eee6860b059.png

在今天流行的ARM64架构里,通用寄存器的数量是32个,每个64比特,总容量为256字节,与图灵当年的估计(200字节)竟然出奇的接近。

某种程度来说,影响CPU速度的关键因素是访问要计算的数据。当数据在寄存器中时,是最容易访问的。通用寄存器多,就可以让CPU把更多的数据放到寄存器里。

根据英特尔的官方资料,APX增加寄存器后对性能的改进是非常明显的。

Intel® APX doubles the number of general-purpose registers (GPRs) from 16 to 32. This allows the compiler to keep more values in registers; as a result, APX-compiled code contains 10% fewer loads and more than 20% fewer stores than the same code compiled for an Intel® 64 baseline.2 Register accesses are not only faster, but they also consume significantly less dynamic power than complex load and store operations.

除了通用寄存器,APX还引入了几个重磅特征:三操作数指令和谓词指令。

7a4ad6776811f631dcfb86c2d2bdb2a7.png

谓词指令是在指令中判断条件标志,可以减少分支语句,是消除分支的一种关键技术,在ARM上流行许久了。以前,x86曾引入cmov指令,但是太少了。APX做了一次彻底的升级,让很多指令都支持条件判断。

另外,APX还引入了成对保存和恢复寄存器的PUSH2和POP2指令,与ARM64的STP(Store Pair)和LDP(Load Pair)非常类似。

细看APX引入的变化,熟悉ARM的格友会觉得有很多ARMv8的影子,在我看来,也的确如此。但我觉得这是合理的。ARMv8里也有很多经典x86的影子。读ARMv8手册时我常有似曾相识的感觉,感觉到ARMv8的设计者们一定塾读过Intel 的SDM。

对于APX这样的改动,属于我开头说的“对经典x86特征的修改”,这样的修改涉及到软件接口(ABI)的变化,需要对上层建筑做较大的重构,包括编译器和操作系统。现在,已经可以搜索到一些关于APX的讨论,包括GCC的修改和支持。但是距离普通用户实际使用APX还要等待一段时间。

俗话说,方向对了,就不怕路远。非常高兴看到古老的x86终于在重重压力下向前迈出了一大步。

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

23c3a2714006dcfb533c65fa3f56f097.png

也欢迎关注格友公众号

6292609d66ffa9e3b420808b903c8b48.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值