几年前,我给我弟弟解释过这样一个问题,为什么没有 128 bit 的处理器。看到这个帖子,我就把之前写的东西放上来好了。当然要理解这个问题还是需要了解一些计算机相关的背景知识的。
针对帖子本身添加几句,不用妄想原生 128bit 指令集了。现在没有,在可以遇见的未来也不会有。(如果有请一定记得回来打我脸 :D)
没有 cpu 支持的 128bit 指令是因为:没有 128bit 的处理器。讨论仅限 x86 范围,或者一般意义上的通用处理器,事实上专业领域里,比如 GPU 大概十年前就过渡到 128bit 了。
================
我先明确下 128-bit 的定义。
很明显 128bit 不是指的 cpu 指令(instruction)宽度,opcode+[oprand] 的组合数非常有限。
第二个是说 2^128 bits 寻址,这是没有意义的,后面我会解释即使是 64bits 还有进一步提高寻址的能力。即使是 64bits 寻址,在短期内都是够用的。
128-bit 说的是原生寄存器宽度。32bit 处理器的原生宽度是 32,可以拆分用作 16/8;64bit 处理器寄存器原生宽度是 64,可以拆分用作 32/16/8;以此类推。
在这个定义之下,现在的很多 cpu 都可以说是 128bit 了,比如支持 SSE/AVX 的话,就有超过 128bit 宽度的寄存器可调用。原生 64bit 寄存器,配合少量 128bit 寄存器的方案远比全部原生 128bit 有意义。
================
为什么没有 128bit 的 cpu 呢?很简单,不需要,不仅仅是现在不需要,未来的很长一段时间也不需要。现有 64bit 处理器已经够用了。这种够用是从尺度和精度两方面都作了考量的判断。
尺度方面,可以参考这个宇宙尺度
http://htwins.net/scale2/ 信息图。图中是以 10 为基数的,可以约等于 2^3,介于 10^±(20~40) 即 2^±(64~128) 的具体事物,要远远少于 2^±(0~64) 的量级。而真正用到如此大尺度的时候,人类会用合适的单位(比如科学计数法)来处理。如果真的用 128bit 处理器做现在 64bit 处理器的事情,那么 cpu 绝大多数时间会用零填充数据寄存器。
夸张一点说,现有 64bit 处理器真正用到整个 64bit 的时候,频率最高的操作是寻址。这是由现有处理器物理设计所决定的,关于这一点后面会详细解释。
精度方面,标准 ieee 四精度浮点,即 decimal128 标准,就是 128bit 的,能够提供 34 位有效数字,这个数字在绝大多数时间也是超过需求的。早在 8087 处理器上(1978 年第一代 x86 处理器 8086 的改进型)就通过协处理器支持了 80bit 的单精度运算硬件支持,现代 x86 在独立浮点处理器的基础上,逐渐开发出如 SSE/AVX 等基于 SIMD (单指令多数据)的指令集。
得益于 x86 可变指令长度的特点,结合 SIMD 可以很容易做到,cpu 本身低位宽,却可以在一个指令周期内处理高位宽的数据。限制指令集位宽的其实是寄存器位宽和数量,而非 cpu 的寻址宽度。如果不限制单一指令周期的话,无论是 64bit 还是 32bit 等等,都可以处理无限宽度的数据。
反过来说,为什么 64bit 够用了,128bit 会浪费?
工程上,生产 cpu 是难度很大的事情。简单说,多少位宽的处理器,就至少要有多少线的物理连接,通过电路来建立 cpu 与内存间的通道。这个线,包括构建其他基本算术单元的电路宽度,就是所谓的制程。随着制程的进步,微观结构带来的负面效应,比如漏电就越明显,同时布局难度也会增加。在 cpu 这样的高频电路里,对于信号的同时性要求非常高。一个 128bit 的处理器,所有内部的连线,比 64bit 几乎都要增加一倍。这些连线的布局甚至不能弯折,由此设计和生产难度都会大幅度提高。
这里 cpu 的设计采取了一个巧妙的办法,用少量的物理连接,实现超量的逻辑线性寻址空间。在 32bit 向 64bit 过渡时,这个技术叫做 PAE 物理内存扩展,那段时期 32bit 的支持 PAE 的处理器和操作系统配合,一样可以访问超过 4GB 的内存。第一代 8086 的线性和物理寻址位宽分别是 16/20 bits,自从 PAE 技术诞生了之后,物理地址位宽就被定格在了 36 bits,即使内存总线的宽度从 16 上升到了 64。
换句话说,这种间接寻址的意义是,无论 128/256 甚至更高位宽的 cpu,都可以通过对内存控制器的升级而实现对超量内存的访问。对于 cpu 生产的意义是,总线(bus)的宽度不再成为制约 cpu 电路布局的关键点。自然更难生产的 128bit 处理器就不多见了。
================
一点引申:相同设计的 128bit cpu 会比 64bit 慢。(就如同 32/64 过渡时期一样)
物理延迟和逻辑延迟相互影响。
128bit 内部布局更复杂,信号传递的时间更长。基本 ALC 由于门限增加也会变慢。这是物理延迟。
逻辑上,128bit 寄存器比 64bit 占用多一倍的缓存空间,在多级内存访问机制下,同等容量缓存命中率会低。如果加大缓存虽然能降低逻辑延迟,但会进一步增大物理延迟。
32/64 过渡这个问题不明显是因为处理器制造工艺进步明显,而现在这种进步幅度大大不如从前了。
================
总结:纯 128bit 需求请不要考虑通用处理器,有的是 DSP 可以高效完成目标。