|
- d1 C6 a7 m' Z [* [8 m: Q" K
& G9 A- l& D7 h% n8 o S4 ^# G; E0 W
D.2.1 编译器能用多媒体指令吗? 7 E& A, W% b1 u% B/ ?% H; k
引入SIMD多媒体指令的原因和70年代晚期以前在超级计算机中提供向量处理单元的原因相似。很容易为向量处理器构造一个手工矩阵算术包。而用向量运算来编译一个用高级语言写成的程序就难得多了,尽管超级计算机提供商在这上面也取得一些成果。通常这些成果都集中在Fortran上;对于常规编程来说语义上的弱点使Fortran成为一种可怜的语言,但是这让它变成了一种很容易优化的语言,因为边际效应非常明显。
5 s" f+ Y0 O( X人们一致认为向量化的Fortran编译器在旧的程序上工作的不是很好(“dusty decks”, 一句迷人的Fortran行话)。这样的编译器要求编程人员书写或者修改程序中的循环来使适应优化器的要求,这样才能带来显著的好处。这样可能是一种好的分工:循环可以使用固定格式,但程序员还可以将它们理解为顺序代码,但实际上这些循环编译的结果是一些很难懂的并行代码。术语”optimizer friendly”是含糊不清的:并行处理理论将会把它定义为: “特定种类的边际效应的缺少,尽管实际的编译器可以查找遵循一些严格的多的规定的循环,这样哑模式匹配器就可以将它们安全的识别出来,然后进行向量化处理”。
% ~2 b# A4 S/ w6 KC的向量化困难的多。这是因为它使用的内存和基于指针的模型,这种模型对于任何数组访问都是隐式操作的。这使得除了最简单的循环以外很难消除其他的边际作用。在产品化上还没有做多少工作。
# V4 Z5 F% Z! u2 X% a k' ?由于这段历史,开发能够采用多媒体SIMD指令成功优化程序的C/C++编译器的前景如何呢?我猜测在最近前景不好。Intel的MMX是最广泛使用的现代SIMD指令集,但当前也只有汇编语言用户才会使用(注1)。我不希望看到使用x86 MMX的编译器。如果MMX得到大规模的成功使用,并且依赖于汇编子程序,结果就会是这些程序被x86架构所束缚住了;this would hardly be something that Intel would be in a hurry to change.
3 \5 {0 s1 @! F2 E7 X1 f$ @0 g很多人预测在1998年或者1999年Intel会引入一种更好的ISA扩展。这种扩展将会增加更多的数据格式到”MMX的后代”中,包括成对的单精度浮点数。如果这种能力更强的指令得到编译器的支持,那就可能出现很多同时适用于MIPS V的软件。
( O; ^; _ Y2 t0 x9 S G% N% G9 R' g/ [
* t! v9 c9 h% |3 wD.2.2 使用MDMX的应用程序 4 ~8 v5 t% C5 T, _' O
, n5 u4 P2 V$ V) U就像x86 MMX, MDMX对3D图像和视频应用将会比较有用,在这些应用中CPU把像素值推给软调制解调器所需的低精度信号处理单元。 7 n7 G" ~ r5 D2 [* X6 F" b
不幸的是,”near display”3D渲染的性能依赖于谨慎的与显存的集成。 甚至配置很好的CPU也竞争不过廉价的PC世界的加速器,这些加速器与大显存之间无缝结合(注2)。图像和视频处理应用确实在这个等级上运行访问像素的程序,尽管这些这都是些桌面PC应用。
: `( W$ {$ u: k: H N( @( e! g, |软调制解调器可能对那些希望使用电话的低端消费品设备会比较有用。它们和便宜的集成式调制解调器设备展开竞争,在更大范围里它们要与不断发展的进入家庭的数字电话竞争。
2 ?9 r y3 j% e5 B在我看来MDMX在游戏控制台上与CPU/视频系统紧密结合将会是最好的机会。 0 p9 w3 e0 u+ y# N9 L/ g2 d2 e
+ y+ o6 B# a8 T2 I& tD.2.3 MIPS V的应用
0 c% t8 H7 W) t, z成对单精度浮点指令和格式是为在高端图像和多媒体应用中出现的重复浮点计算增加带宽。尽管看起来象是硅图像公司(SGI)的市场,3D图像使用的增长会使这种能力在更广的范围里更有有用。
Q1 Q9 a$ k# b; X" W7 h对于MIPS有限的编译器支持看起来比对MDMX的支持更为真实。尽管成对操作看起来好像是超标量CPU的双发射指令的一种替代,它们实际上是相互补充的。SIMD指令采用的并行机制来自于编译器中的更高一级操作,而低级调度还可以可能同时发射两条指令:一条对式浮点指令,另外一条指令负责整数或者管理操作。 ( e/ s' C$ ~( @' b% g. f
+ H5 f8 r5 R/ h$ G----------------------------------------------------------------------------------------------------
3 n0 T$ W& R% W5 S1.一个愤世嫉俗的人可能会说由于任何x86的克隆都需要MMX,那么MMX够用了。他还会说MMX到底是不是真的在用的问题已经离题太远了。而且从中受益的游戏和图像程序都是那些疯狂的汇编爱好者编写的。
8 M! l% K4 ]- m& h/ O2.如果有人使用与大内存和集成式视频刷新数据通道无缝结合的方式构造CPU的话,它们还有可能展开竞争。但是我没有看到那种MIPS产品的更多迹象。
4 t& C, _: D2 K% M" O8 J; [# t. l2 Q$ X
D.2.4 MDMX/MIPS V有可能成功 5 f$ Z: b0 N8 B$ N, `( K8 q
SGI 1997年做出的放弃发展它的H1高端处理器项目的决定使这两种指令集(译者注:MDMX 和MIPS V)一直没能正式发布。但是我相信至少有一种面向嵌入式市场的CPU会支持MDMX。到底会发生什么是很有趣的。 4 x/ E# l: Y$ ~0 \( V
在目前为止没有CPU支持MIPS V;但是它比MDMX有更长的生存周期,将还会是1999年发布的CPU有用的附属物。
. X# n! ^( `) G' w1 \9 L 9 G5 `* g. k4 g
- i/ d8 R0 i t' s0 p
指令集 5 Q9 d! T& O. ~& n7 V- r4 T' L
(1)CISC指令集 1 w! U2 Q8 j6 t# B( g0 _
CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set 6 F- c& H2 q8 J* N' ?& J
Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是现在新起的X86-64(也被成AMD64)都是属于CISC的范畴。 & Z% D" S s4 K4 m
0 g& ~# S* }4 ]7 h x0 |
; L4 ^; F, E }; o
要知道什么是指令集还要从当今的X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将X86指令集和X87指令集统称为X86指令集。
W; M+ X2 B0 h) U+ J
) E6 G$ U& o; G- K% Z$ j
5 a4 ~- Q/ f2 O! h* e2 j 虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到过去的PII至强、PIII至强、Pentium : `# ?; G# f/ a7 z& M' t- C9 O: j
3,最后到今天的Pentium ! b9 l: U ]5 a/ }
4系列、至强(不包括至强Nocona),但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel ' e; j1 y5 [4 U8 o4 d: H9 _6 D& c7 j
X86系列及其兼容CPU(如AMD Athlon : b, ?5 @2 f6 Z8 D! ]
MP、)都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器CPU两类。 8 ]: T% U' s0 p6 {# @3 x
|5 p& x) N7 f% m
5 |, u0 o$ N" P) J+ C
(2)RISC指令集
9 g& d @/ h2 m4 l. _8 r5 j RISC是英文“Reduced Instruction Set Computing ”
- r2 z& }3 O3 O4 O2 _) u! ?2 N 的缩写,中文意思是“精简指令集”。它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本高。并且复杂指令需要复杂的操作,必然会降低计算机的速度。基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ! ?3 g" {+ L/ H6 Y& x Q
,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。RISC指令集是高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。目前在中高档服务器中普遍采用这一指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的操作系统UNIX,现在Linux也属于类似UNIX的操作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容。 # T- _1 E2 H& i" F5 u( F
% d& r R; Q/ |! a
, O2 ?$ B. [1 j' M
目前,在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器。
% G. E E$ k6 K* w$ \9 ~& o7 w" ]# `5 v2 C
- a* }8 K- g: j7 a (3)IA-64
& E( ^* W3 o' v$ H EPIC(Explicitly Parallel Instruction ) v" m# e# d; H* |+ w- j4 @
Computers,精确并行指令计算机)是否是RISC和CISC体系的继承者的争论已经有很多,单以EPIC体系来说,它更像Intel的处理器迈向RISC体系的重要步骤。从理论上说,EPIC体系设计的CPU,在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得多。 ! F7 l9 h! W8 \0 d% \2 l+ `
- Y7 y9 }! F* Q6 U0 `& K& _3 e, G* G, @1 `- Q9 H. g
Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器,也是IA-64系列中的第一款。微软也已开发了代号为Win64的操作系统,在软件上加以支持。在Intel采用了X86指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是,它们想摆脱容量巨大的x86架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了。IA-64
* y0 Q+ {( |# ^+ Y S 在很多方面来说,都比x86有了长足的进步。突破了传统IA32架构的许多限制,在数据的处理能力,系统的稳定性、安全性、可用性、可观理性等方面获得了突破性的提高。 |5 }" B4 z0 u, F4 x/ i8 i
& f0 T& ~6 O m6 T' I" y
, x7 F) ^* b6 T3 Z& W IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium、Itanium2
+ h9 D3 g- y7 C* T* L& P ……)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码的最好途径(最好的途径是直接在x86处理器上运行x86代码),因此Itanium
9 q# J2 R, i% O% D5 _9 a 和Itanium2在运行x86应用程序时候的性能非常糟糕。这也成为X86-64产生的根本原因。 2 {! v" I( G1 k3 g! ]" V3 W% t4 ~" n& f
- @2 t, p; g K$ O9 M
(4)X86-64 (AMD64 / EM64T)
* V8 G9 N% @0 R8 M% r0 Q. m" S# \ . O: K8 F! i- A- y4 R+ o
AMD公司设计,可以在同一时间内处理64位的整数运算,并兼容于X86-32架构。其中支持64位逻辑定址,同时提供转换为32位定址选项;但数据操作指令默认为32位和8位,提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位运算操作,就要将结果扩展成完整的64位。这样,指令中有“直接执行”和“转换执行”的区别,其指令字段是8位或32位,可以避免字段过长。 i+ o- [9 j. @2 @" N* U9 O1 B
, q0 |$ m- G! u, O# V/ y8 [; T# \) K W! L7 ~
x86-64(也叫AMD64)的产生也并非空穴来风,x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86。AMD充分考虑顾客的需求,加强x86指令集的功能,使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64。在技术上AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作为原有X86处理器寄存器的扩充,但在而在32位环境下并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位。在SSE单元中新加入了8个新寄存器以提供对SSE2的支持。寄存器数量的增加将带来性能的提升。与此同时,为了同时支持32和64位代码及寄存器,x86-64架构允许处理器工作在以下两种模式:Long / [/ k8 L6 _! \
Mode(长模式)和Legacy Mode(遗传模式),Long模式又分为两种子模式(64bit模式和Compatibility
, b" O' E: J* ]- x) [ mode兼容模式)。该标准已经被引进在AMD服务器处理器中的Opteron处理器。
* i" ~, F6 ]' P) m! C0 g
) Y/ q! x6 Z' Q }7 ]: G' n 而今年也推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E,这是英特尔64位扩展技术的名字,用来区别X86指令集。Intel的EM64T支持。 |
|