JBTALKS.CC
标题:
CPU GPU设计工作原理《转》
[打印本页]
作者:
eremitic
时间:
2008-7-26 10:09 AM
标题:
CPU GPU设计工作原理《转》
要说到设计的复杂程度,那还是CPU了!这个不用讨论,很简单的道理你看看显卡芯片的更新速度和CPU的更新速度就可见一斑了。还是简单说说他们的设计原理吧。
CPU:
但是,现在我要问一句:“什么是CPU?”我相信大多数人并不知道什么是CPU。当然,你可以回答CPU是中央处理器,或者来一句英文: Central Processing Unit。是的,没错。但,RISC和CISC是什么?什么是“9路超标量设计”、“20级流水线”?什么是“解码”,为什么Athlon和PIII的解码过程需要的时钟周期大大大于其他的RISC处理器?这些都不是一句“中央处理器”所能够回答的。
一、 指令系统
要讲CPU,就必须先讲一下指令系统。指令系统指的是一个CPU所能够处理的全部指令的集合,是一个CPU的根本属性。比如我们现在所用的CPU都是采用x86指令集的,他们都是同一类型的CPU,不管是PIII、Athlon或Joshua。我们也知道,世界上还有比PIII和Athlon快得多的 CPU,比如Alpha,但它们不是用x86指令集,不能使用数量庞大的基于x86指令集的程序,如Windows98。之所以说指令系统是一个CPU的根本属性,是因为指令系统决定了一个CPU能够运行什么样的程序。所有采用高级语言编出的程序,都需要翻译(编译或解释)成为机器语言后才能运行,这些机器语言中所包含的就是一条条的指令。
1、 指令的格式
一条指令一般包括两个部分:操作码和地址码。操作码其实就是指令序列号,用来告诉CPU需要执行的是那一条指令。地址码则复杂一些,主要包括源操作数地址、目的地址和下一条指令的地址。在某些指令中,地址码可以部分或全部省略,比如一条空指令就只有操作码而没有地址码。
举个例子吧,某个指令系统的指令长度为32位,操作码长度为8位,地址长度也为8位,且第一条指令是加,第二条指令是减。当它收到一个 “00000010000001000000000100000110”的指令时,先取出它的前8位操作码,即00000010,分析得出这是一个减法操作,有3个地址,分别是两个源操作数地址和一个目的地址。于是,CPU就到内存地址00000100处取出被减数,到00000001处取出减数,送到 ALU中进行减法运算,然后把结果送到00000110处。
这只是一个相当简单化的例子,实际情况要复杂的多。
2、 指令的分类与寻址方式
一般说来,现在的指令系统有以下几种类型的指令:
(1)算术逻辑运算指令
算术逻辑运算指令包括加减乘除等算术运算指令,以及与或非异或等逻辑运算指令。现在的指令系统还加入了一些十进制运算指令以及字符串运算指令等。
(2)浮点运算指令
用于对浮点数进行运算。浮点运算要大大复杂于整数运算,所以CPU中一般还会有专门负责浮点运算的浮点运算单元。现在的浮点指令中一般还加入了向量指令,用于直接对矩阵进行运算,对于现在的多媒体和3D处理很有用。
(3)位操作指令
学过C的人应该都知道C语言中有一组位操作语句,相对应的,指令系统中也有一组位操作指令,如左移一位右移一位等。对于计算机内部以二进制不码表示的数据来说,这种操作是非常简单快捷的。
(4)其他指令
上面三种都是运算型指令,除此之外还有许多非运算的其他指令。这些指令包括:数据传送指令、堆栈操作指令、转移类指令、输入输出指令和一些比较特殊的指令,如特权指令、多处理器控制指令和等待、停机、空操作等指令。
对于指令中的地址码,也会有许多不同的寻址(编址)方式,主要有直接寻址,间接寻址,寄存器寻址,基址寻址,变址寻址等,某些复杂的指令系统会有几十种甚至更多的寻址方式。
3、 CISC与RISC
CISC,Complex Instruction Set Computer,复杂指令系统计算机。RISC, Reduced Instruction Set Computer,精简指令系统计算机。虽然这两个名词是针对计算机的,但下文我们仍然只对指令集进行 研究。
(1)CISC的产生、发展和现状
一开始,计算机的指令系统只有很少一些基本指令,而其他的复杂指令全靠软件编译时通过简单指令的组合来实现。举个最简单的例子,一个a乘以b的操作就可以转换为a个b相加来做,这样就用不着乘法指令了。当然,最早的指令系统就已经有乘法指令了,这是为什么呢?因为用硬件实现乘法比加法组合来得快得多。
由于那时的计算机部件相当昂贵,而且速度很慢,为了提高速度,越来越多的复杂指令被加入了指令系统中。但是,很快又有一个问题:一个指令系统的指令数是受指令操作码的位数所限制的,如果操作码为8位,那么指令数最多为256条(2的8次方)。
那么怎么办呢?指令的宽度是很难增加的,聪明的设计师们又想出了一种方案:操作码扩展。前面说过,操作码的后面跟的是地址码,而有些指令是用不着地址码或只用少量的地址码的。那么,就可以把操作码扩展到这些位置。
举个简单的例子,如果一个指令系统的操作码为2位,那么可以有00、01、10、11四条不同的指令。现在把11作为保留,把操作码扩展到4位,那么就可以有00、01、10、1100、1101、1110、1111七条指令。其中1100、1101、1110、1111这四条指令的地址码必须少两位。
然后,为了达到操作码扩展的先决条件:减少地址码,设计师们又动足了脑筋,发明了各种各样的寻址方式,如基址寻址、相对寻址等,用以最大限度的压缩地址码长度,为操作码留出空间。
就这样,慢慢地,CISC指令系统就形成了,大量的复杂指令、可变的指令长度、多种的寻址方式是CISC的特点,也是CISC的缺点:因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。除了个人PC市场还在用x86指令集外,服务器以及更大的系统都早已不用CISC了。x86仍然存在的唯一理由就是为了兼容大量的x86平台上的软件。
(2)RISC的产生、发展和现状
1975年,IBM的设计师John Cocke研究了当时的IBM370CISC系统,发现其中占总指令数仅20%的简单指令却在程序调用中占了80%,而占指令数80%的复杂指令却只有20%的机会用到。由此,他提出了RISC的概念。
事实证明,RISC是成功的。80年代末,各公司的RISC CPU如雨后春笋般大量出现,占据了大量的市场。到了90年代,x86的CPU如pentium和k5也开始使用先进的RISC核心。
RISC的最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。由于下文所讲的CPU核心大部分是讲RISC核心,所以这里就不多介绍了,对于RISC核心的设计下面会详细谈到。
RISC目前正如日中天,Intel的Itanium也将最终抛弃x86而转向RISC结构。
作者:
eremitic
时间:
2008-7-26 10:10 AM
二、CPU内核结构
好吧,下面来看看CPU。CPU内核主要分为两部分:运算器和控制器。
(一) 运算器
1、 算术逻辑运算单元ALU(Arithmetic and Logic Unit)
ALU主要完成对二进制数据的定点算术运算(加减乘除)、逻辑运算(与或非异或)以及移位操作。在某些CPU中还有专门用于处理移位操作的移位器。
通常ALU由两个输入端和一个输出端。整数单元有时也称为IEU(Integer Execution Unit)。我们通常所说的“CPU是XX位的”就是指ALU所能处理的数据的位数。
2、 浮点运算单元FPU(Floating Point Unit)
FPU主要负责浮点运算和高精度整数运算。有些FPU还具有向量运算的功能,另外一些则有专门的向量处理单元。
3、通用寄存器组
通用寄存器组是一组最快的存储器,用来保存参加运算的操作数和中间结果。
在通用寄存器的设计上,RISC与CISC有着很大的不同。CISC的寄存器通常很少,主要是受了当时硬件成本所限。比如x86指令集只有8个通用寄存器。所以,CISC的CPU执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。而RISC系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。
对于x86指令集只支持8个通用寄存器的缺点,Intel和AMD的最新CPU都采用了一种叫做“寄存器重命名”的技术,这种技术使x86CPU的寄 存器可以突破8个的限制,达到32个甚至更多。不过,相对于RISC来说,这种技术的寄存器操作要多出一个时钟周期,用来对寄存器进行重命名。
4、 专用寄存器
专用寄存器通常是一些状态寄存器,不能通过程序改变,由CPU自己控制,表明某种状态。
(二) 控制器
运算器只能完成运算,而控制器用于控制着整个CPU的工作。
1、 指令控制器
指令控制器是控制器中相当重要的部分,它要完成取指令、分析指令等操作,然后交给执行单元(ALU或FPU)来执行,同时还要形成下一条指令的地址。
2、 时序控制器
时序控制器的作用是为每条指令按时间顺序提供控制信号。时序控制器包括时钟发生器和倍频定义单元,其中时钟发生器由石英晶体振荡器发出非常稳定的脉冲信号,就是CPU的主频;而倍频定义单元则定义了CPU主频是存储器频率(总线频率)的几倍。
3、 总线控制器
总线控制器主要用于控制CPU的内外部总线,包括地址总线、数据总线、控制总线等等。
4、中断控制器
中断控制器用于控制各种各样的中断请求,并根据优先级的高低对中断请求进行排队,逐个交给CPU处理。
(三) CPU核心的设计
CPU的性能是由什么决定的呢?单纯的一个ALU速度在一个CPU中并不起决定性作用,因为ALU的速度都差不多。而一个CPU的性能表现的决定性因素就在于CPU内核的设计。
1、超标量(Superscalar)
既然无法大幅提高ALU的速度,有什么替代的方法呢?并行处理的方法又一次产生了强大的作用。所谓的超标量CPU,就是只集成了多个ALU、多个FPU、多个译码器和多条流水线的CPU,以并行处理的方式来提高性能。
超标量技术应该是很容易理解的,不过有一点需要注意,就是不要去管“超标量”之前的那个数字,比如“9路超标量”,不同的厂商对于这个数字有着不同的定义,更多的这只是一种商业上的宣传手段。
2、流水线(Pipeline)
流水线是现代RISC核心的一个重要设计,它极大地提高了性能。
对于一条具体的指令执行过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令顺序执行,那么先是指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步,在指令控制器工作,完成第二条指令的前三步,在是运算器,完成第二条指令的后两部……很明显,当指令控制器工作是运算器基本上在休息,而当运算器在工作时指令控制器却在休息,造成了相当大的资源浪费。解决方法很容易想到,当指令控制器完成了第一条指令的前三步后,直接开始第二条指令的操作,运算单元也是。这样就形成了流水线系统,这是一条2级流水线。
如果是一个超标量系统,假设有三个指令控制单元和两个运算单元,那么就可以在完成了第一条指令的取址工作后直接开始第二条指令的取址,这时第一条指令在进行译码,然后第三条指令取址,第二条指令译码,第一条指令取操作数……这样就是一个5级流水线。很显然,5级流水线的平均理论速度是不用流水线的4 倍。
流水线系统最大限度地利用了CPU资源,使每个部件在每个时钟周期都工作,大大提高了效率。但是,流水线有两个非常大的问题:相关和转移。
在一个流水线系统中,如果第二条指令需要用到第一条指令的结果,这种情况叫做相关。以上面哪个5级流水线为例,当第二条指令需要取操作数时,第一条指令的运算还没有完成,如果这时第二条指令就去取操作数,就会得到错误的结果。所以,这时整条流水线不得不停顿下来,等待第一条指令的完成。这是很讨厌的问题,特别是对于比较长的流水线,比如20级,这种停顿通常要损失十几个时钟周期。目前解决这个问题的方法是乱序执行。乱序执行的原理是在两条相关指令中插入不相关的指令,使整条流水线顺畅。比如上面的例子中,开始执行第一条指令后直接开始执行第三条指令(假设第三条指令不相关),然后才开始执行第二条指令,这样当第二条指令需要取操作数时第一条指令刚好完成,而且第三条指令也快要完成了,整条流水线不会停顿。当然,流水线的阻塞现象还是不能完全避免的,尤其是当相关指令非常多的时候。
另一个大问题是条件转移。在上面的例子中,如果第一条指令是一个条件转移指令,那么系统就会不清楚下面应该执行那一条指令?这时就必须等第一条指令的判断结果出来才能执行第二条指令。条件转移所造成的流水线停顿甚至比相关还要严重的多。所以,现在采用分支预测技术来处理转移问题。虽然我们的程序中充满着分支,而且哪一条分支都是有可能的,但大多数情况下总是选择某一分支。比如一个循环的末尾是一个分支,除了最后一次我们需要跳出循环外,其他的时候我们总是选择继续循环这条分支。根据这些原理,分支预测技术可以在没有得到结果之前预测下一条指令是什么,并执行它。现在的分支预测技术能够达到90%以上的正确率,但是,一旦预测错误,CPU仍然不得不清理整条流水线并回到分支点。这将损失大量的时钟周期。所以,进一步提高分支预测的准确率也是正在研究的一个课题。
越是长的流水线,相关和转移两大问题也越严重,所以,流水线并不是越长越好,超标量也不是越多越好,找到一个速度与效率的平衡点才是最重要的。
三、CPU的外核
1、解码器(Decode Unit)
这是x86CPU才有的东西,它的作用是把长度不定的x86指令转换为长度固定的类似于RISC的指令,并交给RISC内核。解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。好在这些复杂指令很少会用到。
Athlon也好,PIII也好,老式的CISC的x86指令集严重制约了他们的性能表现。
2、一级缓存和二级缓存(Cache)
以及缓存和二级缓存是为了缓解较快的CPU与较慢的存储器之间的矛盾而产生的,以及缓存通常集成在CPU内核,而二级缓存则是以OnDie或OnBoard的方式以较快于存储器的速度运行。对于一些大数据交换量的工作,CPU的Cache显得尤为重要。
作者:
eremitic
时间:
2008-7-26 10:12 AM
标题:
GPU
一,GPU
GPU全称是Graphic Processing Unit—图形处理器,其最大的作用就是进行各种绘制计算机图形所需的运算。包括顶点设置,光影,像 素操作等。GPU实际上是一组图形函数的集合,而这些函数由硬件实现,主要用于处理3D游戏中物体移动时的坐标转换及光源处理。以前,这些工作都是由 CPU配合特定的软件来做的。GPU从某种意义上来讲就是为了取代CPU在图形处理过程中充当主角而出现的,一块标准的GPU主要包括 2D Engine,3D Engine ,Video Processing Engine,FSAA Engine,显存管理单元等等,其中,3D运算中起决定作用的是3D Engine,这是现代3D显卡的灵魂,也是区别GPU等级的重要标志。3D Engine在各公司的产品中都是宣传攻势的重点照顾对象,名字叫的一个比一个响,像nVidia的nFinitFX系列,CineFX系列,ATI的SmoothVision系列,一个 3D Engine通常包含着T&L单元,Vertex Processing Engine,Setup Engine, Piexl Shader等
二,API
说到API,也许很多人不容易理解。在计算机行业中,所有软件的程序接口,包括3D图形程序接口在内,统称为API (Application Program Interface)—应用程序接口。过去,如果您想让它们发挥最大功效,必须做的一件事,就是记录相关硬件设备的地址。现在,API已成为软、硬件之间一种连接的桥梁,这道工序就可以省略了。显卡芯片厂商根据标准来设计自己的硬件产品,以达到在API调用硬件资源时最优化,获得更好的性能。有了这个桥梁,便可实现不同厂家的硬件、软件最大范围兼容。目前PC游戏与显卡之间的桥梁主要有两个—DirecX和 OpenGL。可能会有人认为DriectX是一个专门的图形API,其实,DirectX并不局限于显示领域。目前的DirectX中包含有 Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、 Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。其中,Direct Graphics主要负责3D图形部分
初代的DriectX并不成功,技术上也不成熟,这种情况一直持续DriectX5.0,DirectX 5版本在D3D上有很大改善,对D3D的内容做了彻底修改,除此之外,许多应用程序接口的细节部分也得到了改进。加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强。因此,DirectX发展到DirectX 5才真正走向了成熟。而真正显现出DirectX的王者霸气并且的版本是革命的DirectX7.0
DirectX 7.0加入了硬件几何转换与光源处理,及T&L技术。虽然OpenGL中已有相关技术,但此前从未在娱乐级显卡中出现。 T&L技术将多边形设置,光影转换等大计量消耗CPU运算能力的工作转移给了GPU内的T&L单元进行,从而在一定程度上将CPU从繁重的劳力中解放了出来
随后的DirectX 8.0中,T&L被Shader所取代,各种Shader单元的应用带来了图形特效的质的飞跃,DirectX 8.0使 GPU真正成为了可编程的处理器。而DirectX 9.0则将各种Shader效果带入了FLOAT运算的时代在GPU出现的以前,显卡和CPU的关系有点像“主仆”,简单的说这时的显卡就是画笔,根据各种由CPU发出的指令和数据进行着色,材质的填充,渲染,输出等等。所以较早的娱乐用3D显卡又称 “3D加速卡”,由于大部分坐标处理的工作及光影特效需要由CPU亲自来执行,占用了CPU太多的运算时间,从而造成整体画面不能非常流畅地表现出来。随着时间的推移,CPU进行各种光影运算的速度变的越来越无法满足游戏开发商的要求,更多多边形以及特效的应用压榨光了几乎所有的CPU性能,矛盾产生了……如果说不堪忍受的游戏速度催生了GPU的话,那么为GPU准备“产床”的则是我们这个世界上唯一的软件帝国:微软—当矛盾接近临界点时, DriectX7.0来了。接着,1999年8月31日,NV10(就是GeForce)诞生了伴随着DriectX版本的变化,GPU的发展也经历了3 个阶段:
1、剪除,变形,光照—T&L以及第一代GPU
第一代GPU的最重要的特点就是在硬件级别上实现了T&L运算,其代表有:NV10/15(Geforce256/2GTS/MX),R100 (Radeon256/LE),Savage2000 等,由于这一代GPU的基本工作原理相同,所以这里我们以Geforce2GTS为例,来看看第一代的GPU是如何工作的首先,CPU将数据传递给GPU进行处理,数据先进入T&L单元中的Transform Engine,在这里,数据将以顶 点的形式接受视野范围的判断,当处理单元判断某部分顶点处于观察者的视线范围以外时,Transform Engine将把这部分顶点“剪除”以使其不会 干扰后续的流水线操作, 具个简单的例子:当你在某FPS游戏中突然打开狙击枪的狙击镜,视野变成了一个圆形的空洞,而其他部分则为黑色,这时 Transform Engine将去除这个圆形视野范围以外的所有顶点,不过,这里进行的只是视野范围的判断,Transform Engine去除在你的视线范围内但是被其它东西挡住了的物体,另外,每一个三角形可能被旋转,放大/缩小,上升,下降,左偏,右移等。 这就是多边形转换转换。 Transform Engine根据你的视角,改变了由程序提供的组成3D物体的顶点的坐标。经过Lighting Engine处理后的图象经过判断 处理后的数据将流入T&L单元中的Lighting Engine,根据光源的类型,距离,角度,数目,应用方式等不同参数,每一个多边形都会有不同的光影表现和光影关系,因而需要不同的光线函数予以表征,在Lighting Engine中,处理单元将根据软件提出的光源分布情况为每个顶点计算 出它所具有的光线矢量,以便后续进行的光线纹理贴图,着色等操作
经过Lighting Engine处理的画面
其实,经由T&L单元处理过的数据还只是抽象的数据,并不是具体的图形,上面两副图仅仅是方便读者进行想象的示意图。
接下来数据将流入Setup Engine,在这里,运算单元将进行三角形的设置工作,这是整个绘图过程中最重要的一个步骤,Setup Engine甚至直接影响着一块GPU的执行效能。三角形的设置过程是由一个一个的多边形组成的,或者是用更好的三角形代替原来的三角形。在三维图像中可能会有些三角形被它前面的三角形挡住,但是在这个阶段3D芯片还不知道哪些三角形会被挡住。所以三角形建立单元接收到的是一个个由三个顶点组成的完整三角形。三角形的每个角(或顶点)都有对应的X轴、Y轴和Z轴坐标值,这些坐标值确定了它们在3D景物中的位置。同时,三角形的设置也确定了像素填充的范围
经过Setup Engine处理的画面
最终着色完毕的画面
在三角形设置完毕后,T&L单元的全部运算就完成了。接下来数据将进入NV15独有的NSR像素处理单元进行一定的像素处理,接着流入像素流水线进行后续的纹理像素填充等操作,这部分操作在DriectX7.0中的变化并不明显,基本的渲染填充过程与过去的显卡几无二异
T&L虽然再一定程度上缓解了CPU运算能力的不济所带来的瓶颈,使得系统在图形方面的资源得到了再分配和增强,但同时,T&L也将新的矛盾转到了GPU上
T&L是一组相对固定的简单的图形函数,所实现的特效受到了函数本身语句的限制,虽然这种固定的指令集设计可以带来比较高的执行效率,但这种设置使得DX7下所能实现的特效受到了指令集的约束,许多逼真的特效无法实现,程序员的思想也被限定在一个相对狭窄的范围内。
[
本帖最后由 eremitic 于 2008-7-26 10:17 AM 编辑
]
作者:
eremitic
时间:
2008-7-26 10:12 AM
2、我要看到你飘逸的秀发和迷人的微笑—可编程Shader以及第二代GPU
DriectX8.0在传统T&L的基础上加入了两个新的概念—可编程的Vertex Shader和Piexl Shader,同样的,第二代 GPU的标志就是硬件级别的可编程Shader运算,代表产品为NV2X(Geforce3/4Ti),R2XX(Radeon8500)等
可编程Shader的复杂程度远非T&L可比,为了方便大家理解第二代GPU的特点,我们先来认识一下什么是可编程Shader,以及可编程Shader运算单元
可编程Vertex Shader及顶点处理器:
可编程Vertex Shader让程序员能够对特定物体,甚至整个画面的每一个顶点,指定特别的运算程序,却不需要CPU介入。每一个顶点都携带相当多的信息,比如坐标,重量,法线,颜色,纹理坐标,雾和点大小数据。顶点处理器能够以简短的程序来改变上述这些信息。这些小程序直接由顶点着色引擎本身执 行,不必劳驾CPU。 典型的T&L引擎将程序员限制在3D运算的光影转换之前,在有了顶点处理器的支持之后,游戏设计师对游戏场景里的3D物 体能够为所欲为的操纵变化,而且不需要用到中央处理器。
这导致了一场革新,程序可以改变顶点的坐标,这样基本上改变物体的形状,以达到更接近真实的移动、移动残影、混色、内插(在两种外型间转换),以及变形,比如改变角色脸部的骨骼和皮肤一个产生一个适时的微笑。也可改变顶点上的颜色数据和纹理坐标,物体表面的颜色达到设计师所想要的色彩效果、投影、凹凸贴图设置(如Blinn Bump mapping)或者其它投射的纹理。光源也可以为程序员随心所欲的调整,不再像过去那样需要对光源的效果进行笨拙的光线纹理贴图,而这些在以前是不可想象的。这一切都归功于可编程Vertex Shader和顶点处理器的出现
Blinn Bump mapping
可编程Piexl Shader以及像素处理器
在NV15中,nVidia曾经尝试加入一个叫NSR的像素处理单元,它可以在数据进入像素流水线之前对每个像素进行一系列运算操作,虽然同为每像素操作,但NSR与Piexl Shader可不能同日而语, NSR对于像素的运算只有7种,同T&L一样,它依然是固定模式的,程序员依然要依照 规定好的条条框框写出程序,而Piexl Shader则不同,我们可以用许多不同方式去编程,以实现不同的特效,下面就是一般的像素处理器所具备的特 性:
· 阴影贴图
· 快速纹理载入
· 影像乘法,对称核心
· 支持4096x4096或512x512x512 纹理
· 立方体贴图每边可4096x4096x32-位
· 支持YUYV的纹理(自动转换成RGB三原色)
· 支持全景贴图
可以指向任何一个图像,如背景缓冲区(back buffer),而可直接当作纹理使用
· 边缘色彩及边缘纹理
· 硬件同步化读/写
对同一张纹理的读及写允许全流水线操作。
可以对背景缓冲区着色,然后马上能当作纹理使用
· Pass through colors
· 支持DX6规格的环境凹凸/亮度贴图(就是环境凹凸贴图)
· 简单的纹理,S,T 在alpha/红(AB)及蓝/绿 (BG)
· 等向的双方向性反射分布功能光源
· 内积产生色彩贴图或Z坐标
· 真实反射凹凸贴图
这看起来似乎有点抽象,简单的说,可编程Piexl Shader实现了一个非常重要的特效—真实的毛发
古老街道上昏暗灯光中的狼人
在3D渲染中,渲染真实的毛发一直是一件非常困难的事情,大量的多边形给多边形生成带来了严峻的考验,而每一根毛发之间复杂多变的即时光影关系更不是几个简单固定的指令所能实现的。Piexl Shader的可编程性和运算能力很好的解决了这个问题
好啦,现在让我们来看看第二代GPU是如何完整处理一个画面的吧
首先,来自CPU的各种物理参数进入GPU,Vertex Shader将对顶点数据进行基本的判断,如果没有需要处理的Vertex效果,则顶点数据直 接进入Transform&Lighting Unit进行传统的T&L操作以节约时间提高效率,如果需要处理各种Vertex效果,则 Vertex Shader将先对各种Vertex Programs的指令进行运算,一般的Vertex Programs中往往包含了过去转换,剪切,光照运算等所需要实现的效果,故经由Vertex Shader处理的效果一般不需要再进行Transform&Lighting操作;另外,当遇到涉及到曲面镶嵌(把曲面,比如弓形转换成为多边形或者三角形)的场合时,CPU可以直接将数据交给Vertex Shader进行处理
另外,在DX8.0的Transform过程中,Vertex Shader可以完成Z值的剔除,也就是Back Face Culling—阴面隐去,这就意味着除了视野以外的顶点外,视野内被前面顶点遮住的顶点也会被一并剪除,这大大减轻了需要进行操作的顶点数目
接下来,经由Vertex Shader处理完成的各种数据将流入Setup Engine,在这里一如既往的进行三角形的设置工作,到这里为止,Vertex Shader的工作就完成了
过去,设置好的三角形本来应该带着各自所有的参数进入像素流水线内进行纹理填充和渲染,但现在则不同,在填充之前我们还需要进行Piexl Shader的操作
其实Piexl Shader并非独立存在的,它位于纹理填充单元之后,数据流入像素流水线后先进入纹理填充单元进行纹理填充,然后便是 Piexl Shader单元,经由Piexl Shader单元进行各种处理运算之后再进入像素填充单元进行具体的着色,再经由雾化等操作后,一个完整的画面就算完成了
值得注意的是,第二代GPU中普遍引入了独立的显示数据管理机制,他们位于Vertex Shader,Setup Engine以及像素流水线之间,负责数据的更有效率的传输、组合,各种无效值的剔除,数据的压缩以及寄存器的管理等工作,这个单元的出现对整个GPU的工作效率的保证其到了至管重要的作用。
HyperZ系列:HyperZ技术本身就是一种类似nVIDIA的“Z-封闭甄别”的技术,但是比nVIDIA还更进一步。它的主要功能简单说来就是分析在Z轴上的场景,被遮挡的就会被忽略掉,只渲染我们能看到的部分场景;然后对渲染过的Z轴场景进行压缩处理,数据的压缩可减少他所占用的空间,从而在存取Z-Buffer数据的时候可以保留更多的显存带宽。而且这是一种画面质量没有损害的压缩算法,并不影响画面质量。最后一步就是把经过渲染的场景中的Z -Buffer信息立刻清除掉,这样就更加大了显存带宽的利用率。
LMA(光速显存架构)系列:光速显存架构采用的第一个技术是“显存交错控制”技术, LMA中的显存控制器划分成了4个独立的显存控制单元,每个单元最大可以进行32bit图形相关数据的存取工作,并且这4个单元之间以及它们和图形处理单元之间都保持密切的通讯联系,并随时协调平衡各个子单元之间的数据流量,因此整体来看LMA的显存控制单元还是可以进行128bit数据的存储,但是保证了显存带宽的充分利用。光速显存架构采用的第二个技术是“无损Z压缩算法”。传统的图形芯片对于每个待渲染的图形象素都要进行Z轴数据的读写工作,因此存储这些数据的Z缓存一向是消耗显存带宽的大户。LMA中集成了硬件 “无损Z压缩”单元,采用“无损Z压缩算法”对Z-缓存数据进行4:1的完全无损压缩。 光速显存架构采用的第三个技术是“Z-封闭甄别”。排除了图象中被遮盖住而不可见的部分,这样GPU就不做隐面模型构建(节省处理器的多边形运算资源),并且渲染管线也不对隐面进行渲染(无需从帧缓存中读写隐面资料数据,节省渲染管线的象素和纹理生成资源并完全消灭了隐面资料对显存带宽的占用)。最后,LMA还包括了4组高速Cache,对数据传输进行缓冲。
作者:
eremitic
时间:
2008-7-26 10:13 AM
3、梦中的镜花水月—可编程Shader2.0以及第三代GPU
当你第一次看到3Dmark03中的MotherNature时,你有没有感觉到震撼?
更加宽泛的色彩范围能够使得图形的逼真度上升,这就是Shader2.0的由来,Shader2.0的核心实际上就是以扩大指令数目以及FLOAT数据形式的应用来提高色彩表达的精确度,而第三代GPU的Shader单元也由此而具备了高精度FLOAT色彩数据的运算能力。从一般角度来讲,第三代GPU同第二代GPU相比在基本的操作控制形式等方面并没有本质的区别,但是由于Shader2.0更大的指令长度和指令个数,以及通用程序+子程序调用的程序形式等使得第三代GPU在处理高精度的庞大指令时效率上有了明显的提升,同时也使得第三代GPU的可编程性跃上了一个新的台阶
让我们来看看第三代GPU到底有哪些改进吧
Vexter Shader部分
第三代GPU的顶点处理器部分除了一般的操作功能外还具备流程控制能力,包括循环,跳跃以及子程序调用等,这些控制指令以及更多向量(或标量)寄存器的应用使得顶点处理器能够以更高的效率执行Vertex Programs,提高了Vertex的处理速度。同时,加大的指令长度和指令数量使得顶点处理器的功能得到了进一步的强化。另外,在第三代GPU中,传统的T&L数据将完全交由顶点处理器来执行,Transform& Lighting Unit将彻底被顶点处理器“吞并”,这也是第三代GPU的一个重要特点
Piexl Shader部分
第二代GPU的Piexl Shader只能实现INT数据的运算,这势必会带来最终运算结果的不精确,而数据的不精确导致了颜色表现的不准确,干扰了最终画面的质量以及效果的表现,第三代GPU的重点改进就是运算单元和寄存器所支持的运算格式,现在Piexl Shader可以进行更高精度的FLOAT 运算和输出,从而使得图形的色彩显示更加精确
暴光正确的图象
数据精度不当而无法实现的特种暴光
另外,第三代GPU的像素处理器每周期所能处理的材质以及指令也分别增加了数倍,这些新特性使得第三代GPU可以处理各种复杂程度的效果,营造一个更为真实的3D画面,比如更加真实的水面效果
INT Piexl Shader所表现的水面效果
FLOAT Piexl Shader所表现的水面效果
传统的INT无法表现宽泛的波浪效果,程序员害怕数据精度范围狭窄引起的上溢或者下溢的发生而不得不在一个很小的物理参数范围内控制涟漪水面所需的波长、波浪的大小、移动速度以及反射和折射效果等,现在,由于数据精度的提升,像素处理器完全可以处理一个非常宽泛的数据精度范围,避免数据的溢出,这就使得更加真实的水面效果得以被表现。第三代GPU的代表是NV3X系列,R3XX系列等,其中R3XX系列的基本处理方式和顺序与第二代GPU在本质上基本相同,仅仅是Vertex Shader和Piexl Shader的具体操作细节和运算精度上有些许不同,而NV3X虽然在基本原理上也与之大略相同,但从流水线的角度来看则与完全不同,应该算是个“异类”。产生过程,只分析一下NV3X
以NV35为例:
首先,他具有8个纹理帖图单元,但8个纹理贴图单元并不在固定分布于每一条Piexl流水线,而是集簇在一起,根据情况来搭配,可以是4*2、8*1。
其次,他具有12条Shader流水线,但没有全盘采用浮点渲染流水线,而只是把12条Shader流水线中的8条做成具备浮点处理能力;不过全部12条Shader流水线都具备Fixed-Point Shader的执行能力。
另外,NV3X将流水线后部的各种渲染单元,如雾化,Alpha混合等大幅削减,使得流水线在一定程度上公用这些单元
NV30的构架组成形式基本上与之相当,只是数目上略有不同
由于这个构架并不是传统意义上的4*2或者8*1的固定构架,我们不能象过去那样说NV35“每个流水线具有2个纹理帖图单元”或者“每条管线具有3个Shader流水线”……我们只能说“NV35单位周期可以完成8次左右的纹理贴图或者12次Shader操作”
另外,由于NV3X对于Fixed-Point Shader的支持精度是FP16和FP32,同时NV3X的Shader流水线的单位Fixed- Point Shader处理精度是16位,所以当遇到32位Fixed-Point Shader数据时,能进行Fixed-Point Shader 数据处理的8条Shader流水线也会根据情况进行搭配来运算32位的Fixed-Point Shader数据
Pixel Programs往往是由多条指令构成的,不同的指令需要不同的执行时间来完成,每个像素必须在应用在它“身上”的Pixel Shader 操作完成后才能由像素流水线写入到帧缓存里。故此,对于应用了Piexl Shader的像素实际上是需要多个以上的周期才能写入到帧缓存里,如果采用8 条完整的渲染流水线的话,流水线后面的雾化、色彩混合等单元很多时候都会处在等待阶段,这部分单元需要占用的晶体管数量不在少数,如果这样浪费就怪可惜的,砍掉后其中的雾化等单元后,对整体的性能虽然有一些影响,但是却可以把节省下来的晶体管用于加强Pixel Shader的功能和性能上来,同时可以 保证比较高的多重纹理效率,利大于弊。
简单的,这个有点诡异的体系节省晶体管的同时能确保相对较好的Pixel Shader效能,同时还有极高的多重贴图效能
nVidia本指望4条Pixel管线+ 12条Shader流水线的设计能够在现在以及未来较长的一段时间的游戏里提供超过4条甚至8条 Pixel Pipeline显卡的效能。不过,实际情况却与nVidia的初衷有些背道而驰,Shader的完美应用带来的一个结果就是越来越好的非多纹理光效果,传统的多纹理贴图才能表现的很好的光效果现在只需要进行一次贴图或者直接使用Shader就可以达到,这使得NV3X的设计成为了空架子,实用意义大大降低,而在单纹理处理过程中由于NV3X的后续效果单元被削减,它的渲染效能注定没有传统的完整流水线高,另外,由于DX9中的最终FP精度被定义为FP24,这导致了NV3X的相对低下的FP效能。最终,本来“先进”的NV3X构架落的个整体效能低下的下场
从本质上来讲,图形数据在NV3X中的实际处理过程依然是沿着顶点处理器—Setup Engine—像素流水线的顺序进行的,这与R3XX以及所有的
...nv3x 是 nvidia 的 fx 5 系列 的核心代号 , r3xx 是 radeon 9xxx 系列的核心代号 -
第二代GPU是相同的
天堂的入口—可编程Shader3.0,DriectX Next以及未来的GPU
在微软刚刚公布的Driect9.0C中,Vertex Shader和Piexl Shader已经具有了几乎相同的能力,而在nVidia新发布的第 四代GPU—NV40中,我们发现Vertex Shader包含了4个纹理取样器,可以使用texld指令进行查表操作, NV40可以在一个 shader pass里完成4个纹理的读取,这个对于通用替换贴图而言相当的重要,有了vertex texturing功能后, vertex shader就能读取纹理信息直接映射到顶点上,以实现displacement mapping(位移映射)等等效果,用不同的纹理和较少的顶点传输时间就能实现外形复杂、平滑的模型,这表明GPU中Vertex Shader的功能正在逐渐接近Piexl Shader。随着GPU的发 展,未来GPU中的Vertex Shader和Piexl Shader最终将被合并成一个统一的处理单元—Intergrated Shader,两种处理单元将使用完全相同的语法以及指令集,Shader的统一将带来完全不同与现在的数据执行处理方式,GPU的内部结构将发生本质的变化, Intergrated Shader带来了更低晶体管数目的解决方案,以更少的晶体管数目来完成现在需要数亿晶体管才能完成的功能,同时统一 Shader将引出类似全通用I/O接口的设计以利资源的更合理的传输和分配,同时,为了解决越来越庞大的数据量,虚拟显存、无限资源访问以及帧缓冲操作等技术的引入也势在必行。另外,我们在DirectX Next中还发现了整数指令集,处理器等特殊的定义,这些新颖的设计为我们勾勒出了未来GPU的轮 廓
整数指令集
在编程中不必在担心指令限制是一个很大的进步,不过想使得GPU更为通用还需要更多的工作。一个需要提高的主要区域就是整数处理能力。目前基于在着色器中处理的所有数据都是浮点,这对于大多数显卡操作而言是没有问题的,不过不适合动态分支预测、非内插式显存搜索(如顶点缓冲的索引)等操作。在目前的GPU 中,唯一的内存寻址就是纹理查找,使用的也是浮点值。这样的情况对于纹理定位而言没有什么问题,不过对于通用内存寻址而言就不合适了,这里的连续内存块可以完全彼此没有关联,采用内插式查找没有任何意义。微软对于这样的情况,在4.0版的Shader模型中引入了全新的、完整的整数指令集。拓扑处理器实际上,目前的显卡可以在某些情况下新生成三角形,比如在用到直线以及点的时候。大多数的娱乐级显卡只具备对三角形进行光栅化处理的能力,这也就意味着所有的点、线就必须转化为三角形。点和线在最后都将以2个三角形结束,这样就需要用到2-6个顶点(根据索引方式的不同而变化)。从本质上来说,这样的做法是有益处的,通过可编程的管线,显示先前应该遮蔽的场景也就无需通过CPU,而可以通过微软的“拓扑处理器”直接完成。从逻辑上来说,这个拓扑处理器和镶嵌单元是相互独立的,这个处理器在两种操作集中均可以使用。由目前的趋势来看,未来的GPU将向着高运算能力,高精度,高通用性的方向发展,GPU在工作方式上将越来越接近CPU,由于高通用性等CPU特性的引入,GPU可能在一定程度上替代一部分CPU在非绘图领域的工作,也许在未来我们会看到由全GPU组成的图形工作站。尽管未来GPU需要面对由于这些改进而带来得的诸多问题,尤其是通用性导致的效率低下,比如Intergrated Shader的效率 低下,但随着时间的推移,各种问题都将会得到妥善的解决。
[
本帖最后由 eremitic 于 2008-7-26 10:24 AM 编辑
]
作者:
real.gigaleon
时间:
2008-7-26 01:17 PM
老文章,但是里面的知识确实是很多人应该了解的东西,建议大家好好的去读
作者:
eremitic
时间:
2008-7-27 08:35 AM
标题:
从core看处理器发展方向 1 转〉chiphell ,yangjunfeng
个人认为这张文章里面也有讲述一些处理器架构和设计,虽然只是原作者的个人想法
距离core2的发布已经一年多了,直到k10的发布也没有超过core,做为一个近乎完美的处理器,我们有必要对其进行一下深入分析,从中间也能大致看到近一段时间cpu的发展方向。
众所周知core带着5大新技能有备而来,Intel Wide Dynamic(宽位动态执行)、Intel Intelligent Power Capability(智能功率能力)、Intel Adcanced Smart Cache(高级智能高速缓存)、Intel Smart Memoru Acess(智能缓存加速)及Intel Adcanced Digital Media Boost(高级数字媒体增强技术),当我们深入core的核心架构时候就会知道core是于Mobile架构的Yonah核心作出改良。
Core的发布宣布了cpu效能和功耗控制的竞争,Pentium Pro开始,Intel加入了Dynamic execution动态执行,令x86处理器首次支援Data Flow Analysis(全局数据流分析)、Speculative Execution(预测执行)、Out of Order Execution(乱序执行)及Super Scalar(超标量)等RISC(精简指令集计算机)的处理器技术技术。直至Pentium 4的NetBurst架构则被再度改良称为Advanced Dynamic Executive,它采用更深的Out of Order Speculative Executive引擎,以善用高Pipeline Stage架构减少浪费,同时改善Branch-Prediction(分支预测)机制减少造成分支预测错误,全是为了高时脉政策而铺路。Core这次带来的Intel Wide Dynamic(宽位动态执行)明显和netburst不同,它的出发点在于如何提高每周期指令处理数目,改善执行时间及提升处理器的能源效益,Core 微架构拥有4组Decoder(编译器)(3 Simple decoders(简单编译器) + 1 Complex decoder(复杂编译器)),core不只是在编译器的数量上增加了,更重要的就是core宣传已久的Macro-Fusion(宏融合)技术,宏融合技术的出现同样是为了单周期cpu接受指令数和执行效率,Core可以让常见的指令组例如一个Compare指令配随后拥有一个Jump指令,便可把这个指令组合成单一的Micro-Op指令,这令Core微架构在特定情况下每个周期有运算五组指令,据Intel表示大部份x86程序,约每十至十五个指令就会出现一组可透过Macro -Fusion被组合,因此减少了程序执行所需运算时间、提升效能却不会增加处理器的功耗,为此Intel亦改良ALU(Arithmetic Logic Unit)部份以支援Macro-Fusion技术。4个编译器都具有融合能力,但整个单元每周期只能完成一次宏指令融合。并且作为cpu的处理前站,除了在占用更少ROB和RS的情况下,宏融合还节约了内核前端的带宽,Core的解码单元能比过去快的多得清空IQ指令列队(Instruction Queue),而内核执行带宽也同样宽阔了很多,因为单个的ALU能同时执行2个X86指令。Core同样保留了Banias的微指令融合技术,这么做同样是为了提升了核心的执行效率同时保持高能源效益。Core的ROB重排序缓冲区( Reorder Buffer)和RS预留缓存(Reservation Station)要比过去的Pentium M大了接近一倍,而事实上还必须考虑到新的宏指令融合(Macro-Fusion)、微指令融合(Micro-ops Fusion)等高效率的融合技术,这样以来,Core的内部转接速度至少要比Pentium M提高了3倍以上。
现在的处理器设计中,内存和处理器的距离(以CPU周期衡量)不断增大,花费如此多的晶体管资源在分支预测硬件的构建上因为能获得和这种投入相称的回报。 Core在分支预测中上投入了大量的晶体管,作为连接内存和CPU的重要环节,在BP分支预测上投入宝贵的晶体管资源是十分值得的。相对于预测错误后让CPU浪费时间和电耗来等待再次预测,一次准确的预测不仅仅节约了处理时间、提高了性能,也同样降低了CPU的功耗。 Core的三重分支预测单元实际上与Pentium M的预测单元是一样的,在Core的分支预测核心中存在一个双模态预测器和一个球型预测器,这些预测器记录下过去的执行历史并随时通知内核前端的ROB和 RS,ROB和RS从BTB分支目标缓冲器(Branch Target Buffer)中快速取回所需要的数据地址,并且增加了循环回路预测(Loop Detector)与间接分支预测(Indirect Branch Predictor),循环回路预测:分支历史表(Branch History Tables)不能够记录下足够详细的循环回路历史来准确预测下次的运算,所以每次循环回路的运行都浪费了大量的亢余时间。 循环回路预测(Loop Detector)则可以记录下每个循环回路结束前的所有的详细分支地址,当下一次同样的循环回路程序需要运算时,内核前端的ROB和RS就可以以 100%的准确度来快速完成任务,Core构架拥有一个专门的运算法则来进行这种循环回路预测。间接分支预测:间接分支预测(Indirect Branch Predictor)在运用时并不是立即分支,而是从寄存器中装载需要的预测目标,它实际上是一个首选目标地址的历史记录表。在ROB和RS需要间接分支的时候它就可以提供帮助,ROB和RS就可以快速提取到适用的结果,这与P6构架用可预测的条件分支替换间接分支来改善性能是相反的。
在cpu的指标上,缓存一直是我们关心的要点,其目的就是减少对系统主存的访问,因为访问主存的延迟实在太高了。Intel第一代双核心处理器设计只是单纯地把两颗核心封装在一起,并分享同一个Front Side Bus(FSB)频宽,当其中一颗核心使用FSB时,另一颗便需要等待另一颗的完成才能使用FSB,加上Intel FSB设计是单向存取,还需要透过北桥来读取系统记忆体资料,均严重加重Intel的FSB工作量,两颗核心亦没有直接沟通的桥梁,如果CPU 0的L2 Cache需要读取CPU 1的L2 Cache,更是需要经过FSB及北桥才能达至出现严重的延迟。Core对此作出了大幅改良,全新的Intel Advanced Smart Cache有效加强多核心架构的效率,传统的双核心设计每个独立的核心都有自己的L2 Cache, Core则是透过核心内部的Shared Bus Router(共享资源调度器)共用相同的L2 Cache,当CPU 1运算完毕后把结果存在L2 Cache时,CPU 0便可透过Shared Bus Router读取CPU 1放在共用L2 Cache上资料,大幅减低读取上的延迟并减少使用FSB频宽,同时加入L2 & DCU Data Pre-fetchers及Deeper Write output缓冲记忆体,大幅增加了Cache的命中率。相比现时K8的双核心L2 Cache架构,也是比不上Advanced Smart Cache设计,因为共用L2 Cache能进一步减少了Cache Misses的情况,K8在CPU 0需要读取CPU 1 L2 Cache的资料时,需要向System Request Interface提向要求并透过Crossbar Switch就把取读资料,但CPU 0发现读取自己的L2 Cache没有该笔资料才会要求读取CPU 1的L2 Cache资料,情况等同于CPU 0的L3 Cache,而共用的L2 Cache设计却没有以上需要,Smart Cache架构还有很多不同的好处,例如当两颗核心工作量不平均时,如果独立L2 Cache的双核心架构有机会出现其中一颗核心工作量过少,L2 Cache没有被有效地应用,但另一颗核心的L2 Cache却因工作量过重,L2 Cache容量没法应付而需要传取系统记忆体,值得注意的是它并无法借用另一颗核心的L2 Cache空间,但SmartCache因L2 Cache是共用的而没有这个问题。Shared Bus Router除了更有效处理L2 Cache读取外,还会为双核心使用FSB传输进行排程,新加入的Bandwidth Adaptation机制改善了双核心共用FSB时的效率,减少不必要的延迟,其实这个Shared Bus Router设计确实有点像K8的System Request Interface及Crossbar Switch的用途。此外,Intel Advanced SmartCache架构用在行动处理器上亦很有优势,系统工作量不高或是处于闲置状态下,Core可以把其中一颗核心关掉,以减少处理器的功耗,不过却可以保持4MB L2 Cache运是保持工作,而且Shared Bus Router更可以因应L2 Cache的需求量改变L2 Cache的大小,在不必要时关掉部份L2 Cache以减低功耗,但在独立L2 Cache的双核心,如果要把其中一个Cache关掉,则必需要把其中一颗核心的L2 Cache资料移交出来,而且Cache亦会和核心同时被关闭,并没法因应需求实时改变或关掉部份L2 Cache的容量以减低功耗。Core同时亦改良了记忆体传取效能,每颗核心均拥有3个独立Prefetchers(预取器)(2 Data and & 1 Instruction),及2个L2 Prefetchers,能同时地侦出Multiple Streaming及Strided Acess Patterns(跨度地址模式),让核心需要的资料提早准备就绪于L1之中,两组L2 Prefetchers则会分析L2 Cache资料并保留有日后需要的资料于L2 Cache之中。Core的L1 Cache设
[
本帖最后由 eremitic 于 2008-7-27 08:40 AM 编辑
]
作者:
eremitic
时间:
2008-7-27 08:37 AM
标题:
从core看处理器发展方向 2
以上是core强大的指令并行能力,下面就来看看core强大的整数和浮点以及sse的运算性能,Core拥有3个64-bit整数执行单元(Integer Execution Units),每个单元可以独立处理一条64-bit整数数据,这样Core就有了一套64-bit的CIU复杂整数单元(Complex Integer Unit),这和P6构架相同。然后Core另外有2个SIU简单整数处理单元(Simple Integer Units)来快速运算较简单的任务,其中一个SIU将和分支执行单元BEU来共同完成部分的宏指令融合micro-ops fusion。对于INTEL的X86 CPU来说,这是首次可以在一周期内完成一阶64-bit的整数运算,这使Core已经走到了IBM PowerPC 970的前面-PowerPC 970需要有2个周期的延迟。另外,因为3个IEU整数执行核心使用了各自独立的PORT数据出口,所以整个Core处理器可以在一周期内同时执行3组 64-bit的整数运算。有着如此强大的整数处理单元,Core在性能上将比现有Pentium 4快的多,它在移动平台、服务器、3D图形上4倍于Pentium 4的性能表现将使全世界对INTEL CPU眼目一新。Core构架拥有2个浮点执行单元(Floating-Point Execution Units)同时处理向量和标量的浮点数据,位于PORT 1的FPEU-1浮点执行单元负责加减等简单的处理,而PORT 2的FPEU-2浮点执行单元则负责乘除等运算,这样在Core中就将FADD/VFADD和FMUL/VFMUL划分为两组,使其具备了在一周期中完成两条浮点指令的能力。当INTEL最初兼容128-bit向量执行时,情况可能和编程人员及用户所预想不太一样,采用在P6和Banias构架上的 SSE、SSE2和SSE3有2个重大的弱点,在ISA指令集架构方面,SSE最主要的缺点就是不支持3指令运算(Three-Operand),而支持 Three-Operand的AltiVec则成为了当时更好的ISA。P6构架的内部浮点处理和MMX都只有64-bit的带宽,所以进入SSE执行核心的只能是64-bit数据。为了让64-bit的SSE来处理128-bit指令,P6构架必须把128-bit的数据切割为2个64-bit的连续部分来处理。这样折衷的处理方案使P6构架在处理128-bit数据时增加了一倍以上的延迟,而当时PowerPC G4的AltiVec只需要1个周期就能完成。同样不幸的是,Netburst的Pentium 4和Pentium M构架也都有这个弱点。全新的Core终于拥有了一个周期完成128-bit向量运算的能力,INTEL终于把浮点和整数运算的内部带宽扩大到了128- bit,这不仅改进了延迟一周期的缺点,只有过去半数的微指令处理量也同样提高了解码、派址和带宽利用等多方面的速度。这样全新构架的CPU将可以把 128-bit的大量multiply/add/load/store/compare/jump等6套指令集成在一个周期中全部完成,其运用性能的飞跃幅度可想而知。Core 微架构采用集中式保留站(central reservation station),而 K8 处理器采用分布式调度器(distributed scheduler)。集中式保留站的优势是拥有更高的利用率,而分布式调度器能容纳更多的表项。NetBurst 微架构也采用分布式调度器。使用集中式保留站也是把 Core 微架构称作“P8 微架构”的理由之一,这是相对古老的 P6 微架构的第二项巨大的提升。它利用保留站并调度与分配执行单元来执行微指令。执行结束后,执行结果被存储到乱序缓冲区内。这样的设计方式无疑是继承自 Yonah、Dothan 甚至 P6 微架构。
功耗问题是困扰netbrust的难题,当core引入并加强了功耗管理并配上intel最新的工艺技术,这个世界终于安静了。Core架构针对功耗上作出重良的改善称为Intel Intelligent Power Capability技术,处理器在制程技术作出优化,例如采用先进的65奈米Strained Silicon技术、加入Low-K Dielectric物质及增加金属层,相比上代90奈米制程减少漏电情况达1千倍。但最值得注意的是,Intel加入了细微的逻辑控制机能独立开关各运算单元,只有需要时才会被开启,避免闲置时出现不必要的功耗浪费,称为Sleep Transistors(休眠晶体管技术) 技术,此外,把核心各个Buses及Array采用独立控制其VCC电压,当这些部份被闲置时会被运作于低功耗模式中。以往要实现达成Power Gating是十分困难,因为在元件开关的过程需要消耗一定程度的能源,而且需要克服由休眠至恢复工作出现的延迟值,故此在Intel Intelligent Power Capability设计考虑到如何优化Sleep Transistor的应用,并确保不会因Sleep Transistors技术而影响效能表现。在Computex TW 06期间,Intel就曾展示一台Core 2 Duo E6300(1.86GHz/2MB L2/1066MHz FSB)在没有采用风扇辅助下完全负载前景播放HD WMV9影片、背景同时不断重覆Lame Audio Encoding WAV to MP3压缩,经过20分钟后仍能保持正常运作,用手触摸处理器散热器表面只是微热,相反北桥散热器的温度要比它还要烫手,很难想像这颗65W TDP的处理器竟有如高水准表现,据Intel表示由于影片压缩工作部份核心元件并不会被使用,会被关掉或是运作于低功耗模式中,纵使其他核心部份正部完全负载。这里我就顺便介绍一下intel新的工艺技术。
高k电介质和金属栅极
二氧化硅用于晶体管栅极电介质(绝缘层)已经有几十年的历史,它的优点是加工方便,成本低廉,适合超大规模集成电路工艺。不过,当晶体管制造工艺发展到 90nm工艺的时候,二氧化硅电介质层的厚度减少到1.2nm,这一数值仅仅相当于5个原子的直径,由于隧道效应,电子可以从这极薄的绝缘层中通过,从而产生很大的漏电电流并导致严重的发热,同时,源极和漏极之间的硅层也越来越薄,在晶体管处于“关”状态的时候,仍然会有电流通过,从而产生明显的阈下泄漏,如果不采取任何的技术措施,45nm处理器仅仅阀下泄漏的功率就将达到100w。为了解决漏电问题,从90nm工艺开始,英特尔引入了应变硅技术,它利用参杂的其他元素使硅晶格产生应变,从而有效地降低了漏电电流,而在65nm制程处理器上,英特尔采用了第二代应变硅技术,使得漏电电流进一步降低到 90nm工艺的四分之一。在应变硅技术和其他节能技术的帮助下,拥有2.9亿多个晶体管的英特尔双核酷睿2处理器的tdp被控制在65w的水平。amd和 ibm的解决方案则是采用soi(绝缘体上硅)技术,在硅片的表面上生成一层很薄的二氧化硅绝缘层,再在绝缘层上覆盖硅,并使用这层绝缘体上的硅层制造晶体管,不过,应变硅技术和soi技术虽然能够有效的降低漏电电流,但却不能从根本上解决栅极电介质的漏电问题。随着制造工艺更加先进,晶体管的体积进一步缩小,绝缘层将会变得更薄,使用二氧化硅介电常数更高的材料(高k电介质)来制造绝缘层才能有效应对先进制造工艺对于绝缘层性能的苛刻要求。
高k电介质
高k电介质/金属栅极晶体管的基本结构和普通晶体管没有什么不同。但它采用了比二氧化硅介电常数更高的高k材料,与之配合,原来的硅栅极也变为金属栅极。在英特尔早期的研究报告中,所涉及的高k材料包括二氧化铪,二氧化钛和二氧化锆,这三种金属氧化物所含金属元素同属周期表第四副族,它们随晶型和交变电流频率不同,介电常数也不同。从目前英特尔公布的资料来看,在45nm工艺制程中,英特尔最终选择了价格最昂贵,性能也最好的二氧化铪。
在硅基板上制造一层纳米级别的金属氧化物绝缘层已经有比较成熟的方法--单原子层沉淀法,在英特尔早期发表的文献中显示,高k电介质层也采用了这种方法来制造。首先,硅表面经过预清洁处理后,产生大量的羟基,这些羟基于气态的金属四氯化合物发生气/固界面反应,金属离子于硅表面的氧键合,在硅表面生成金属氧化物,然后再通入水蒸气,金属氯氧化物的两个氯离子与水发生反应,生成金属碱式氧化物,重新拥有两个羟基,这两个羟基又可以与金属四氯氧化物气体反应,从而使第二层金属氧化物沉积下来,重复这些步骤,就可以得到二氧化锆和二氧化铪的纳米级镀层,厚度也可以精确控制。高k电介质的应用可以将栅极的漏电电流减少到使用二氧化硅绝缘层时的十几分之一,也能将源极和漏极之间的漏电电流降低到原来的五分之一,晶体管性能则能提高20%以上。不过,由于采用金属栅极和高k电介质必然增加制造成本,还会带来良率的问题,而且下一代处理器的缓存容量也将继续提升,虽然45nm工艺在同样的300毫米晶圆上能够制造的晶体管数目大约是65nm工艺的两倍,但是penryn以及后续的32nm工艺处理器的成本可能不会获得较大降低。
金属栅极
金属栅极技术是高k电介质技术的重要补充。英特尔的科学家在研究高k电介质的时候,发现如果仍然采用多晶硅在高k电介质层上制造栅极的话,将会产生阀电压阻塞和声子散射效应,导致过高的开关电压和电子运动速度变慢,从而使晶体管性能急剧恶化。这种现象的发生原因是多晶硅和高k电介质层会在界面上相互渗透,硅原子置换金属氧化物晶格中的氧原子,从而在界面层中造成缺陷点,金属栅极则可以避免这些缺点。近年来的会议报告显示,英特尔数年来已经实验了多种“p型 ”金属合金,“n型”金属合金和中间类型金属合金,其中包括钛合金,金合金以及硅化镍等等。
high-k金属门
新材料有效阻遏漏电流
晶体管是半导体芯片的基本构成元素,我们知道,在数字芯片中,所有的数据都是由0,1组合的二进制码来表示的,晶体管的开,关两种状态就可以分别表示 0,1。由于生产工艺的限制,集成电路中的晶体管都为平面结构,它的基本结构包括决定晶体管电流产生及流向的源极,漏极,控制晶体管导通或闭合状态的栅极,以及源栅极导通时电流流经的硅通道和该硅通道与栅极之间的栅介质。栅极和栅介质的作用就是利用它在硅通道和栅极之间产生较高的场效应(即高-k,k是一种描述一种材料存储电荷的能力),同时又要求栅介质本身是完美的绝缘体,以防止电流通过栅介质发生泄漏。在过去,栅介质绝缘层一直都是采用二氧化硅材料制作的,但随着工艺的进步,二氧化硅栅介质的不足日趋显露。新工艺的导入总是让晶体管的几何尺寸变得更小,晶体管的二氧化硅介质也就变得越来越薄,这一方面增加栅极电极和通道的耦合(增加场效应),即增强“开”状态下的电流,同时降低“闭合”状态时的源极,漏极漏电,令晶体管的电气性能获得提升。但另一方面,栅极栅介质太薄,二氧化硅层起到的绝缘作用就会变差,导致栅极漏电电流不断增大,漏电流越大,处理器工作所产生的无效功耗和额外发热量就会更大,这在很大程度上抵消了晶体管性能提升的好处。在90nm工艺之前,晶体管的漏电流问题尚不十分突出,栅介质变薄的好处大于坏处,但在90nm之后,漏电流现象变得明显,完全抵消了栅介质变薄的好处,当初英特尔的prescott芯片在引入90nm之后依然高功耗,高发热,很大程度上就是未能妥善解决这一问题。另外一点,传统设计要求在栅介质上产生一个耗尽层,这等于是增加了栅介质的厚度,对于晶体管性能有不良的影响,这种矛盾在65nm工艺中就已经相当的尖锐。ibm和amd通过soi技术来解决上述问题,不过英特尔认为soi技术会带来较高的成本,而且效果回事十分理想,因而更倾向于引入新型高k值材料来代替二氧化硅。在新一代45nm技术中,半导体工业面临的情况就更为严峻。栅介质的厚度进一步压缩到1.2nm,相当于5个硅原子厚度,倘若继续使用传统的制造工艺,那么栅极漏电电流将成为不可承受的问题。此时,英特尔也终于将高k值材料代入实际应用,它采用了铪基高-k材料(HfSiON)来代替传统的二氧化硅,这种材料对电子泄漏的阻隔效果可以达到二氧化硅的10000倍,电子泄漏基本被阻断,即便未来将绝缘层厚度降到0.1纳米,这种材料仍然可以拥有良好的电子隔绝效果。同时,新材料削除了耗尽区,有效解决了增加场效应和绝缘性能的矛盾,令此两项过去相互牵制的指标都获得较大提升。不过,由于高k值介质与现行的硅栅电极不兼容,所以英特尔开发出了新的金属栅极材料来代替它,使之实现更优良的电子通过率,目前英特尔仍将栅极材料特定金属配方列为绝密,我们尚无法知晓其中的细节,只是可以肯定这种金属栅极采用的是多种金属材料的组合。铪基高-k材料与金属栅极让英特尔的45nm技术获得了空前的成功,英特尔表示,新一代45nm技术使得晶体管的性能提升了20%以上,同时源极,漏极氧化物漏电功率分别比现行技术降低5/10倍以上,大幅度提高了晶体管的能效。而在密度方面,45nm技术比现行的65nm技术提升了2倍左右,英特尔可以轻松的在相同面积的芯片上塞进更多的晶体管,或是在晶体管大小不变的情况下降低芯片尺寸,达到节约成本的目的。
作者:
eremitic
时间:
2008-7-27 08:38 AM
标题:
从core看处理器发展方向 3
晶体管:控制电子通行的开关,源极与漏极之间构成回路
栅极:用于检测晶体管是否处于开或是关状态,过去栅极介质通常都是硅,栅极介质改用高k材料之后,栅极本身的材料也要求改用金属
源极:当晶体管处于开状态时,电流的起始端于此
漏极:当晶体管处于关状态时,电流的终点于此
通道:源极与漏极之间的电流通行路径
栅极介质:位于栅极与通道之间的绝缘体,现有技术多采用二氧化硅材料
漏电流:穿过栅极介质,不希望出现的电流,栅极介质的厚度越薄,漏电流现象就会越严重,高k值材料可以有效阻遏漏电流的发生。
高k值材料:取代二氧化硅做为栅极介质,英特尔在自己的45nm技术中采用铪基材料,绝缘效果要远高于二氧化硅
soi:绝缘层上覆硅,在半导体的绝缘层上(如二氧化硅)通过特殊工艺,再覆上非常薄的一层硅,然后在这层soi层上再制造电子设备。该工艺可以有效的减少晶体管各个电极向硅基底流动的漏电流,使得电流只能在晶体管内部流动,,这也使得晶体管充放电速度大大加快,随之提升数字电路的开关速度,相比传统工艺,可提升25%-35%。英特尔认为soi虽然阻隔了各电极与硅基底的漏电流,但对于同级晶体管之间的阻隔效果并不理想。
以上就是intel处理器工艺制作的一些简单资料,希望对初级用户有帮助。
说了这么多的core,下面该说一下通过core的架构看未来一段时间cpu的发展方向了。
通过core和k10的架构我们不难发现指令并行性的提高是现阶所不能回避的问题,指令并行性的提升依靠的是强大的解码器,更宽的连接传输带宽,core 不仅增加了一个Simple decoders,而且为了提升分支预测的能力及准确性,Branch Predictor的Bandwitdh提升20B(K8、Banias为16B,Netburst为4B),这些都是体现了"Wide"的意念。不仅要宽还要准确,这也是分支预测重要地位的所在,更多的传输端口和红融合以及早就出现的微指令融合都是为了高效能而努力着。由于cpu只能和内存之间交换数据,内存和cpu之间的传输带宽也成为了每次芯片组和处理器发布是首要提到的参数,core的Smart Memory Access和k8以来的集成内存控制器都是为了提高内存和cpu之间的数据交换更加准确和快速,HT总线和FSB前端总线都是为了提供更大的速度而存在着。Intel有着amd所欠缺的工艺制作工艺和产能,所以intel历来的cpu都是提供着庞大的L2缓存,但是由于大量的晶体管的使用,Advanced Smart Cache的出现更是来的及时,k10同样为了功耗的控制为每个核心使用各自独立的PLL电路这和core的Intelligent Power Capability都是为了智能的功耗管理而努力着。这样一来我们可以总结出:1,智能的电源管理;2,先进的sse多媒体指令集;3,更准确的分支预测;4,准确快速的内存预取技术;5,多核心处理器内部资料传输。这一切都是为了更高的单周期指令执行数所带来的高效能。
随着gpu的不断发展,gpgpu不断的走进我们的视野,先阶段cpu缺乏的是gpu强大的指令并行性能力,而gpu最缺乏的莫过于cpu所强大的可编程性。但随着dx10的发布,我们不难看出gpu在一步步的拥有者物理运算,虚拟技术等等,所以协处理器和混合处理器的发展成了雨后春笋,amd再度发起了链接架构的革新,首先提出torrenza协处理器平台,该平台仍然以HT总线为连接中枢,所不同的是应用范围被扩大了,可以用来连接浮点协处理器,多媒体协处理器以及图形模块。Intel所倡导的协处理器便是披露已久的many core计划,其关键点是处理器内集成大量的加速单元,例如浮点加速器,多媒体加速器,java解释器,flash加速器等等,这些加速断垣围绕着若干枚 cpu核心,接受来自cpu的任务并将任务传回。从intel所透露的cpu/gpu混合架构来看,可能抛弃乱序执行,多核心顺序执行为主,大幅度减少内核的晶体管使用量,和采用想安腾那样的VLIW(超长指令集)是cpu融合cpu的第一步,第二就是引入先进的缓存设计,使用统一缓存,实现动态缓存容量分配。
不管是混合处理器还是高速量多的协处理器,处理器的发展一步步的向着统一化,高度集成化发展,这是必然的,这也是计算机小型化,
移动化和嵌入式系统的基本要求。
原贴地址:
http://bbs.chiphell.com/viewthre ... &extra=page%3D4
~因为还有些针对文章的回复
[
本帖最后由 eremitic 于 2008-7-27 08:44 AM 编辑
]
作者:
与世隔绝
时间:
2008-7-28 12:38 PM
好長啊,不過還是要謝謝樓主分享
欢迎光临 JBTALKS.CC (https://jbtalks.my/)
Powered by Discuz! X2.5