31. 不同的微处理器间的比较
下面的表格概括了奔腾家族处理器之间的一些重要的区别:
PPlain | PMMX | PPro | PII | PIII | |
代码cache, kb | 8 | 16 | 8 | 16 | 16 |
数据cache, kb | 8 | 16 | 8 | 16 | 16 |
具备2级cache, kb | 0 | 0 | 256 | 512 *) | 512 *) |
MMX指令 | 不支持 | 支持 | 不支持 | 支持 | 支持 |
XMM指令 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
条件传输指令 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
乱序执行 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
分支预测 | 差 | 好 | 好 | 好 | 好 |
分支目标缓存的表项数目(BTB entry) | 256 | 256 | 512 | 512 | 512 |
返回站缓存的尺寸(RSB size) | 0 | 4 | 16 | 16 | 16 |
分支预测失败的惩罚 | 3-4 | 4-5 | 10-20 | 10-20 | 10-20 |
部分寄存器延迟 | 0 | 0 | 5 | 5 | 5 |
FMUL的执行时间 | 3 | 3 | 5 | 5 | 5 |
FMUL的吞吐率 | 1/2 | 1/2 | 1/2 | 1/2 | 1/2 |
IMUL的执行时间 | 9 | 9 | 4 | 4 | 4 |
IMUL的吞吐率 | 1/9 | 1/9 | 1/1 | 1/1 | 1/1 |
*)Celeron:0-128,Xeon:512及512以上,和许多其它的变种处理器有。
在一些处理器上,2级cache以一半速度运行。
上表的注释:
如果无法将程序的关键部分控制在较小的内存空间里的话,代码cache的尺寸就很重要了。
如果关键部分处理的数据量不小的话,那么数据cache的尺寸很重要。
MMX和XMM指令对于处理大块并行数据的程序很有用,比如声音和图像处理。
在其它应用下可能用MMX和XMM指令也没多大优势。
条件传输指令很有用,用于避免那些不大好预测的条件跳转。
乱序执行改进了性能,尤其对于未优化的代码而言。 它包括自动进行指令重排和寄存器重命名。
具备好的分支预测方法的处理器能够预知简单的重复模式的转移。
如果分支预测失败的代价很高的话,那么好的分支预测机制就是最重要的。
当子过程在不同的位置被调用时,返回栈缓存(RSB)改进了返回指令的预测。
部分寄存器延迟使得混合处理不同尺寸的数据(8,16,32位)变得更困难。
乘法指令的延迟时间是指在依赖链中花去的时间。
1/2的吞吐率意味着执行可以被流水化,每2个时钟周期可以开始一个新的乘法指令。 这指明了处理并行数据可以达到的速度。
本文档中描述的大多数优化对于其它类型的处理器没什么副作用(要有也是很小的副作用),包括非Intel处理器。
但同时,也要意识到几个问题:
在PPlain和PMMX上规划浮点代码时,经常需要大量的FXCH指令。
在老式的处理器上会减慢执行速度,但在奔腾家族和高级的非Intel处理器上不会。
在PMMX,PII和PIII上利用MMX指令,以及在PPro,PII和PIII上利用条件传输指令,如果想让你的代码兼容早期处理器的话,可能会出现问题。
解决办法是将你的代码写成几个版本,每个分别为特定的处理器优化。 在运行的时候,你的程序要检测处理器类型,然后选择版本适当的代码(27.10节)。