分享
 
 
 

详细解读多核心Cell处理器

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

一、引言

请看几件非常有趣的事情:

由于Intel在关于它们的多核心微处理器构架的将来计划上变得比以前更公开了,Intel的Spring IDF 2005变成了一个多核心CPU的节日。Intel的计划中有10款以上的多核心CPU设计,而它们在IDF上解释得很清楚了。

在GDC 2005上,AGEIA宣布它们已经开发了一个物理处理单元(Physics Processing Unit,PPU),它能够被用于处理非常现实的物理及人工智能模型。

Johan De Gelas在他探索更高处理能力的道路上更进了一步,发现多核心CPU在游戏市场中有相当大的潜力,不过要以增加程序调试时间为代价。

那么,这三件事有什么共同之处呢?三者的结合基本上概括了我们已经知道的关于Cell微处理器 - 多核心CPU的内容,它的一部分是为了相当难编程的并行物理/AI处理而设计的。

在宏观层面上,Cell是不难理解的;最让人感兴趣的是设计者如何达到目的。在这篇文章中,我们将集中于Cell的设计主张和构建模块,最终目的是理解Cell为什么会这样设计。

作为IBM,Sony和Toshiba之间的共同投资,Cell微处理器是Sony即将到来的Playstation 3的核心部件。不过,这一次Sony和Toshiba还打算在从消费电子到服务器和工作站的所有产品中使用Cell(或它的一部分)。如果你还没有什么概念的话,那也该知道Cell作为微处理器,特别是非x86的微处理器,已经让某些人寄予了非常高的期望了。

使用模式

在进入Cell的构架之前,让我们来谈一点关于Cell及其它微处理器当前面对的工作负荷类型。

在过去,办公应用程序性能是隐藏在微处理器发展背后的推动因素。在多重任务处理和E-mail应用上,以前是单个应用程序执行,而我们在很大程度上谈论的是办公应用软件,文字处理,电子制表软件等等。因此,大多数微处理器是为了惊人的单个应用程序,单个任务性能设计的。

由于微处理器变得更加强劲了,所以软件也升级了 - 多任务处理环境诞生了。然而,大多数的电脑用户仍然集中在单个应用程序使用上,所以微处理器发展继续侧重于单线程性能(单个应用程序,单个任务性能)。

几年过去了,单线程的性能要求提高了。Microsoft Word不再是作为界定的应用程序了,而像游戏,媒体处理和动态内容创建这些东西变成了占用最多CPU的应用软件。这就是我们现今面对的工作负荷,办公, 3D游戏,3D内容创建和媒体编码/解码/转码的混合消耗了我们的CPU周期。但为了了解Cell这么一个新构架的创建,你必须理解这些工作量的极限在哪。正如今天需要执行的应用程序类型与10年前运行的那些大不相同一样,同样的情况在下一个十年也会发生。而假定一个新的微处理器构架要5年左右来开发的话,那么现在引入一个面向这些新的使用模式的新构架是切实可行的。

Intel在最近的IDF上就将来的使用模式谈了很多,比如像实时声音识别(甚至是翻译),开放式搜索(例如Google图像搜索),游戏中更好的物理和AI模型,更多特性丰富的用户界面(例如手势识别)等等这些东西。这些是将来的使用模式,而同样地,它们对微处理器和相关的构架有不同的一套要求。

支持这些使用模式类型需要的性能等级明显比我们今天可用到的更高。按照惯例,从一代微处理器到下一代,性能的增长通过优化单线程性能来实现。有许多改进单线程性能的方法,要么提高时钟速度,要么增加每个时钟执行的指令数(IPC)。更进一步说,从一个单独的线程中能够实现越多的并行处理,性能就会越好 - 这类并行是指指令级的并行(ILP),它包括在一个线程中同时执行尽可能多的指令。

通过增加ILP改进性能所具有的问题是从一代到下一代,只能带来10% - 20%的性能增长。然而,我们谈到用于未来的使用模式要求明显多于过去已经获得的这类提升。由于功率限制阻止了时钟速度放得太高,那显然需要另一种改进性能的方法。

在微处理器行业中主要的厂商几乎一致认同,获得必要的性能提升的唯一办法就是向多核心构架迁移。通过多线程应用程序和多核心处理器的结合,应该能够满足这些类型的应用程序所需要的性能增长。与侧重于提高ILP来改进性能不同,这些多核心处理器是在线程级上并行操作来改进性能的(线程级并行 - TLP)。

不过事情并不是这么简单的。需要做出许多深思熟虑后的决定。在多核心微处理器中每个核心需要多大的运算能力?是需要强劲处理器的小型阵列还是较简单处理器的大型阵列?它们相互之间如何通信?怎样处理为多核心处理器提供足够的内存带宽呢?

Cell微处理器就是对这些问题的一个解答。

二、Cell的宏观概述

Cell是跟即将到来的AMD和Intel多核心CPU几乎一样的多核心处理器,唯一的差异是Cell的构架不是完全同类的核心集。

Cell的执行核心

Cell构架以9个独立核心的配置登场:一个PowerPC Processing Element(PPE)及八个Synergistic Processing Element(SPE)。PPE和SPE是明显不同的,但全部八个SPE是彼此相同的。

PPE是IBM对Cell方案的主要贡献。它似乎也跟被用在下一代Xbox控制台中的核心非常相似,就是说IBM对Cell所承担的义务并不是一定要让它用在从消费电子到PC的所有设备中,而仅仅是两个主要的游戏控制台而已。

PPE是一个新核心,不同于IBM制造的其它任何PowerPC核心。虽然PPE拥有现代任何通用微处理器的基本功能,但它有目的地作了简化。PPE在 Cell中的作用是处理任何通用微处理器能够运行的任务;基本上任何能够在Athlon 64上运行的就会在PPE上运行。

PPE配备了64KB L1缓存和512KB L2缓存,并且拥有类似于Intel Hyper Threading的SMT技术。PPE使用了一个严格有序的核心,这在桌面x86市场上从最初的Pentium消亡以来就再没有见到过了(Pentium Pro把无序执行带到了x86市场),所以向有序核心的转变是一个引人注意的地方。PPE还只是一个2流程核心,那意味着它最多能够同时执行两条指令。作为对照,Athlon 64是3流程核心,所以立即可以感觉到,PPE是比任何桌面产品简单得多的核心。PPE还支持IBM的VMX指令集(即Altivec)。跟Cell处理器的其它核心非常相似的是,PPE被设计为运行在非常高的时钟速度下。

关于PPE没有太多让人感觉不平常的地方,也就是它是一个小,高速,有效率的核心。跟Pentium 4或Athlon 64相比,PPE无疑会落败,但PPE的构架符合性能需求上的变化。例如,商业/办公应用程序中的性能需要非常强劲,非常快的通用微处理器,但游戏控制台中的性能则不然。最初的Xbox使用了修改过的Intel Celeron 733MHz处理器,而当时最快的桌面产品有2.0GHz的Pentium 4和1.60GHz的Athlon XP。假如Cell的第一个应用是Sony的Playstation 3,那么PPE的简单是不出奇的。如果Cell想要进军PC的话,那PPE显然必须得到加强,或至少搭配多个PPE才行。

Cell的Die的主要部分由八个Synergistic Processing Element(SPE)组成。如果把PPE看作是通用微处理器的话,那么SPE就是稍微有些特殊侧重点的通用处理器了。

每个SPE是一个功能完整的独立微处理器,但被极度简化了,并且不像PPE那样通用。SPE没有缓存,但每个SPE却拥有256KB的局部存储器(稍后我们将讨论局部存储器和缓存之间的差异)。每个SPE还拥有总共达7个的执行单元,包括一个整数单元,所以SPE能够执行整数运算以及SIMD浮点计算。 SPE是双流程的,也就是说它们最多能够执行2条并行的指令。SPE和PPE两者都采用双流程,引起了对Cell晶体管数量和芯片大小的关注,因为增加流程宽度直接关系到这两个关键的项目。

SPE没有分支预报器,意味着它们完全依靠软件分支预报。编译器有方法能够消除分支,而SPE构架非常有助于像解开回路这样的事情。任何初级程序员对回路都很熟悉,在那里一行或多行代码被重复,直到满足某个条件为止。那个条件(例如i < 100)的校验通常会导致分支,所以消除那个分支的一个办法是简单地解开回路。如果在一个应该执行100次的回路中有一条语句,那要么可以把它留在回路中并照样执行,要么可以取消回路并简单地复制该语句100次。最终结果是相同的 - 唯一的差别是在一种情况下有分支条件,而另一种情况导致了更多行待执行的代码。

打开回路具有的问题是需要很多寄存器来解开若干循环,那就是每个SPE拥有128个寄存器的原因了。SPE原先应该使用VMX(Altivec) ISA,但由于需要多于32个的寄存器,SPE执行了新的ISA,支持128个寄存器。

每个SPE在每个时钟只能够处理两条指令,也就是说每个SPE最多能够同时执行两条指令。微处理器的流程宽度在很大程度上可以决定微处理器将有多大;例如,Itanium 2采用6流程核心,所以作为2流程核心的SPE明显小于大多数的通用微处理器。

最后,我们在SPE上看到的是它们牺牲了一些正常的改进ILP的技巧,以便能够在一个单独的Die上塞进更多的SPE,为了更大的TLP而有效地牺牲掉一些ILP。既然行业前进的方向是这样,那么向极其侧重TLP设计的迁移是很有意义的,但同时,它将相当依赖于使用非常特殊的开发模型的开发商。

很明显,Cell的设计师把SPE当作运行高度并行化工作量的手段,正如Derek Wilson在他关于AGEIA PhysX PPU的文章中所提到的:“特征很好地适应PC内专门的处理器的图形,它的性质之一就是任务是可无限并行化的。每个帧需要处理数十万,甚至上亿个的像素。渲染需要处理得越细致,并行任务就变得越多。这对物理模型同样成立。相对于现实世界,物理世界是连续的,而不是离散的。拥有越多的处理能力,就能够立刻模拟更多的东西,从而能够越实际地逼近现实世界。”

由于NVIDIA为Playstation 3提供GPU,所以Cell的SPE阵列在游戏控制台中由一个明确的目的 - 物理及AI处理。许多人认为,SPE的阵列能够接管GPU的像素处理工作量,但对于高性能控制台来说,那不是很有意义的选择。SPE阵列能够提供更好的基于CPU的3D渲染,但对于这个SPE阵列来说,那将是艰苦的工作,不如使用专门的GPU硬件。

Cell的On-Die内存控制器

多年以来,我们知道Rambus的内存和接口技术远远领先于竞争对手。问题是它以前从未在PC上得到很好地实现。在RDRAM用于PC的早期,Rambus品牌收到了相当负面的评价,并且由于Rambus对DDR世界的诉讼使得该公司的形象变得更差了。

Rambus在许多消费电子设备中已经获得了成功,例如HDTV及Playstation 2,所以当Cell宣布大量使用Rambus技术的时候,并不让人太过吃惊。正如我们早先报导的,在Cell上大约90%的针脚用到了Rambus技术。剩下的10%大部分是测试针脚,所以Rambus基本上掌握了出入Cell处理器的所有数据。它们以两个方法来做到这一点:

首先,Cell包含了一个On-Die双通道XDR内存控制器,每条通道有36-bit宽(ECC为32-bit)。Cell的XDR内存总线运行在 400MHz下,但XDR内存以8倍于内存总线时钟的速度传输数据 - 那意味着获得了3.2GHz数据通讯数据。最终结果是类似于GPU显存带宽的25.6GB/s。我们知道,在增加处理器核心数量的时候,内存带宽需求会惊人地增长 - 由于Cell中的9个核心,XDR是理想的选择。注意到GeForce 6800GT就向它的GPU提供了32GB/s的显存带宽,所以看到Playstation 3的GPU搭配它自己的局部存储器以及能够共享系统内存和带宽也不会太令人吃惊。

标注为MIC的模块是XDR内存控制器,而XIO模块是物理层 - 所有的输入接收器和输出驱动器都在XIO模块中。数据管线也放在了XIO模块中。

正如在AMD的Athlon 64上已经看到的,拥有On-Die内存控制器显著减少了内存延时,这也发生在Cell上。

Cell的On-Die FlexIO接口

Cell另一个重要的I/O技术也受Rambus控制 - FlexIO接口。Cell配备了两个可配置的FlexIO接口,每个为48-bit宽,拥有6.4GHz数据通讯速度。

BEI模块是北桥接口,而FlexIO模块是物理FlexIO层。

“可配置”这个词是特别重要的,因为它意味着无需连接每条线路。进一步解释这个概念,就是不要把FlexIO接口看作只能连接到一个芯片的,而是具有不同宽度FlexIO接口的多个芯片。

Cell可配置FlexIO接口的一个可能的实现

虽然Cell的XDR接口提供了超过任何PC微处理器2倍的内存带宽,但Cell的FlexIO接口达到了76.8GB/s - 几乎10倍于AMD的Athlon 64芯片对芯片的带宽。

在Playstation 3中,几乎可以预料到NVIDIA的GPU和Cell处理器之间将占用这个极其巨大的带宽了,但它也可能被用做某些相当繁重的I/O接口。

在任何高性能游戏控制台中,主要的需求之一就是带宽,而由于Rambus,Cell拥有了足够的带宽。

三、Cell的有序构架

我们已经提到,PPE和SPE两者都是有序核心,但为了了解有序核心对性能的影响,我们首先必须知道一点背景知识。

相关性,指令排序和并行

什么是相关性?

在许多CPU文章中都提出了相关性这个概念。在非常基础的级别下,CPU接受到的指令流通常是这样的形式:

操作 目标单元格,来源1,来源2,...,来源n

指令格式将从一个CPU ISA变化到下一个,但一般的思想是CPU收到一个操作,一个目标单元格来存储操作的结果,以及一个或多个来源,在那上面获取数据来执行操作。取决于构架,目标单元格和来源可以是内存位置或寄存器。为了简化问题,我们假定目前所有的目标单元格和来源都是寄存器。

让我们来看一个填写一些数据的例子:

ADD R10,R1,R2

上面一行的汇编将被发送到CPU,告诉它把存储在R1(1号寄存器)和R2中的值加起来,并把结果存储到R10中。非常简单。现在我们再给CPU另一个要处理的操作:

MUL R11,R10,R3

这一次,我们把存储在R10和R3中的值相乘,并把结果存储在R11中。作为单独的一行操作,上面的代码是容易完成的,但在直接放到我们的第一个例子后的时候,我们遇到了一点问题:

ADD R10,R1,R2

MUL R11,R10,R3

ADD R9,R11,R4

第一行写入R10,同时第二行从R10中读取。在没有上下文的情况下,CPU可能在第一行完成前开始执行第二行 - 对第三和第二行的情况也一样。在这里我们遇到的是所谓的“写入后读取”(Read After Write,RAW)相关性。有许多类型的相关性,但理解了这个基础的例子就已经足以让我们进入即将到来的下一个话题了 - 这种相关性的影响。

相关性带来的问题是它限制了并行执行的能力。以Athlon 64为例。它有三个整数执行单元,所有这些执行我们上面使用的代码的能力是相等的。理论上Athlon 64能够同时执行并行的三行整数操作 - 假定操作之间不存在相关性。执行上面的代码时,Athlon 64整数执行单元中的两个将闲置,要等待代码的第一行被执行。

像我们上面讨论的这种简单的相关性,阻碍了现代流行微处理器发挥它们最佳性能的能力。它仿佛有三只手,但只能通过一次收拾一件物品来打扫房间;这样低下的效率真是令人沮丧啊。

围绕相关性调整指令

幸好,对代码中的相关性问题有多种解决办法;一是从硬件入手解决问题,另一个是在软件中解决问题。

软件编译器负责产生发送到CPU用于执行的汇编代码。因此,由于CPU内部工作的固有原理,一般来说编译器能够产生最少数据相关性的代码。

有微处理器构架是完全依靠编译器来实现指令级并行的,同时尽可能多地消除相关性。这些构架被认为是有序微处理器。

有序构架

顾名思义,有序微处理器只能按照指令被发送到CPU的顺序来执行它们。CPU最多可以并行执行多条指令,但它没有能力对指令重新排序,以更好地适应它的需要。

如果编译器足够好的话,那有序微处理器应该是优秀的。不过有两个关键的限制:

1. 对有序构架的二进制编译是非常依赖构架的

虽然Athlon 64和Pentium 4两者都完全能够运行x86代码,但它们采用了极其不同的微构架,具有不同的执行单元,并且各自擅长的领域有很大的差异。如果上述两个芯片都完全依靠编译器来实现并行和最大化性能的话,肯定有一个会遭受极大的损失。即使每个程序总会有两个版本,但那趋向于变得巨大而杂乱 - 特别是从升级/补丁的观点来看。编译器不得不密切关注着它正为之编译的构架,就算它像游戏控制台一样工作,没有众多厂商以共同的ISA提供不同构架的 CPU,但还是不如桌面x86市场的好。

2. 不可预知的内存延时

缓存在绝大多数时候是个好东西。微处理器上的缓存尽力保存了频繁使用的数据,所以它应该被做得与CPU通信的延时非常低。问题是缓存增加了一个不可预知的等级到它从内存获取数据的时间上。一次缓存冲突可能意味着数据要在10 - 20个周期后到达。一次缓存失败可能意味着好几百个周期的延误。至于有序微处理器,它不能根据数据可用性对指令重新排序,那么如果数据在缓存中不可用的话,CPU就不得不等待更长的时间以把它从主存中取出来,整个CPU不得不闲置,直到那个数据被从主存中读出。即使有其它的指令能够被执行,有序微处理器也无法有效处理待执行指令的重新排序,以克服不可预知的内存延时。

如果找到办法解决有序构架的限制的话,会有一些非常实际的好处:

1. 微处理器设计大为简化

为了处理待执行指令的重新排序,无序微处理器增加了数目惊人的复杂单元。我们将在下一节中更详细地讨论它们。通过把这个复杂度转移到软件/编译器那边,极大地简化了微处理器的复杂性,并为其它能够产生更好性能收益的单元剩下了晶体管额度。越低的复杂性也意味着越小的功耗和发热量。

2. 更短的管线

一般来说,为了处理指令的重新排序,构架的管线级数不得不增加,导致了更高的功耗,并且(由于更高的分支预报损失)而需要更精确的分支预报器。虽然对于较长的管线设计而言,增加管线深度的影响不会很大,但相对于较短的设计,增幅可能达到40%以上。

在历史上,简单的有序核心的思想一度被抛弃,因为有明显的另一个选择:无序构架。

四、无序构架

与有序构架相对的是无序构架。无序构架还是按照程序最初的顺序编译指令,并且仍然按顺序撤销指令,但实际的流程/指令的执行可能是无序完成的。

让我们来看看所有这些意味着什么吧。如果CPU改变了发送给它的代码的意图,那是毫无用处的。坦白地说,如果双击文件变成执行一串格式化命令的话,那CPU就没有价值了。虽然那是一个极端的例子,但为了确保这样的事情不会发生,CPU必须遵循两个准则:

指令必须按照程序最初的顺序进行编译(也就是通过CPU解释来找出它们正要求它做什么)

指令必须按照程序最初的顺序撤销(也就是每个操作的结果必须按照与它被发送到CPU的相同顺序被写入内存/磁盘)

有序和无序构架两者都遵循这两个准则 - 在这两个阶段之间无序构架所做的处理不同。我们前面提到了有序构架不能对待执行指令重新排序。假如我们拥有一个有序CPU,它有一个加法器和一个载入/存储单元,它被要求执行下列代码(为了简单,我们在这里不讨论带有网络的情况):

LD R10,R11

ADD R5,R10,R10

ADD R9,R9,#1

...

在第一条指令中,我们从存储在R11中的内存地址中载入数据到R10。然后,我们对刚从内存中取出的值做自加运算,并把结果存储在R5中。第三行,也是最后一行对存储在R9中的值赋予1的增量,并保存到R9中。快速浏览一下代码就发现,第二行不能在第一行之前执行。那样做将改变代码的目的(如果想要对某个值做自加运算,首先需要确保有这个值)。不过第三行是完全独立于第一跟第二行的。

对于有序微处理器,如果第一行要载入的数据就包含在缓存中的话,那么该指令将花费大约1 - 30个时钟周期来完成(根据构架和它所处的缓存级数而有所不同)。第二行在执行前将不得不等足那1 - 30个周期,然后到它执行了以后才轮到第三行。如果被请求的数据不是存储在缓存中的话(或许我们是第一次用到这个值,而我们又没有用到内存中存储在它附近的值),那我们有问题了。出乎意料地,第一行不是用大约1 - 30个周期来完成;现在它将用200个以上的时钟周期来完成。对于第二行倒没什么影响,因为它无论如何都要等第一行完成了才能执行,但对于第三行来说,它可以很容易地在CPU正等着从内存中取出数据的时候执行。跟在第三行后面的任何独立指令也受到缓存失败的影响。

然而,至于无序微处理器,缓存失败的情况就大相廷径了。代码仍然按照顺序解码,意味着它以跟有序CPU相同的顺序获得指令1,2及3,但这时候我们有了在第一和第二行之前执行第三行的能力,而不是空等着第一行完成。如果发生缓存失败,这就给了无序微处理器一个相当大的性能优势,因为它不是在那等着浪费时钟周期而什么都不干。那么,无序CPU是怎么工作的呢?

如果有人以任何你想要的顺序让你做一系列的事情,那你只用简单地接受这个列表并完成它就行了。但如果他们又让你以他们规定的顺序报告返回你已经完成的事情,那你肯定要先把它们写下来,再重新组织它们为符合需要的顺序。

无序CPU的工作非常接近于同样的方法,只是以一个指令窗口代替了待办事项列表。指令窗口的功能类似于待办列表 - 它有所有以最初的顺序解码的指令,并保留了一个记录以确保这些指令按照它们被解码的顺序撤销。

在指令窗口旁边,无序CPU还有一个时序安排窗口 ? 就是在这个“窗口”中完成所有的指令重新排序的。时序安排窗口包含了正确的推理来标出相关和独立的指令,并在等待相关指令为执行作准备的时候把所有的独立指令发送到执行单元。

当先前的相关指令(也就是等待来自主存中的数据或等待其它指令完成的指令)变成独立时,它们就能够被执行了,也是按照打乱的顺序的。

你可能立即会说,增加的指令窗口,时序安排窗口,所有检测独立指令的相关推理以及没有提到的处理无序执行但有序撤销的推理,所有这些导致了更复杂的微处理器。但对于无序微处理器还有另一个重要的问题 - 性能上的增长和指令级并行是非常依赖于指令窗口的大小的。

这个窗口安排得越大,就完全能够执行越多的并行,因为CPU面对着一个更广的指令集合,从中选出独立的指令。同时,窗口安排得越大,时钟速度就会越低。例如,Itanium有非常大的指令窗口来满足它的执行单元,而Pentium 4为了达到更高的时钟速度,只有一个小得多的窗口。

尽管有着这样那样的不足,但所有的流行x86微处理器无一例外地采用了无序核心,因为保持单核心构造简单在制造工艺提升时并不是应予优先考虑的事情。无序构架的好处有两方面:

指令的动态重新排序让CPU回避了内存延时,可以获得更高的时钟速度。对于每次缓存失败,Pentium 4 3.6GHz不得不等待大约230个时钟周期来从主存中取出数据,这在CPU看来是许多的空闲时间。能够在期间通过执行其它的独立指令来利用这个空闲时间,是像Pentium 4和Athlon 64这类构架逃脱它们如此高内存频率倍频的惩罚的一个方法。

进一步增加指令级并行 - 通过对待执行指令的重新排序,无序构架能够在编译器无能为力的地方改善ILP。

所以,AMD和Intel两者显然已经为通用x86微处理器计算过了,无序是最有意义的。那么,为什么Cell的设计者又重起炉灶,为处理器配备了9个独立的有序核心呢?

要回忆起的第一件事是从有序构架中能够获得相当可靠的性能。Itanium是有序微处理器,基于类似于Cell的设计,通过它编译器应该能够实现无序核心的那种并行。最近一代的Itanium核心运行在流行x86核心的一半速度下,然而CPU每个时钟能够执行大约两倍于最快的x86 CPU的指令。引用Intel的Justin Rattner关于Itanium的话说,“一个适当设计的指令集应该毫无问题地帮到有序构架。”所以,很可能相同的情况也适用于Cell...

五、Cell的方法 - 不带缓存的有序

记住,Cell的设计者在估计他们使用的每个晶体管导致的性能增长的同时设计了该处理器(有点夸张了,他们没有计算到2亿3千4百万个晶体管中的每一个,但他们非常严密地估计了每个构架上的决策)。在这样做的过程中,鉴于无序核心将增加的复杂性,有序vs.无序的思想肯定引起了巨大的争论。

由于无序的主要好处是减少了对内存延时的敏感性,因此Cell设计者们提出了另一个选择 - 具有可控制的(理解为可预知的)内存延时的有序核心怎么样?

有序微处理器有一个缺陷,就是一旦引入了缓存就不再能够控制内存延时了。大多数时候,设计良好的缓存将提供访问所需数据的低延时。但考虑Cell面对的应用程序类型(至少是最初的设计意图) - 3D渲染,游戏,物理学,媒体解码等等 - 所有的应用程序都不依赖大容量缓存。看看Intel任何一款拥有巨大缓存的CPU,注意到缓存超过一定数量以后,3D渲染,游戏和解码性能通常不会再有很大的提升了。例如,Pentium 4 660(3.60GHz - 2MB L2)在Business Winstone 2004中较Pentium 4 560(3.60GHz - 1MB L2)有13%的增长,但在3D游戏中平均性能增长小于2%。在3dsmax中,完全没有由于额外的缓存造成的性能收益。在我们的媒体解码测试中同样可以看到类似的性能持平。Playstation 3的使用模式不会是用来运行Microsoft Office的;它将与许多这类“媒体相关”的应用程序打交道,像3D游戏和媒体解码。对于这些应用程序类型而言,巨大的缓存是完全没有必要的 - 低延时内存访问是必需的,许多的内存带宽是重要的,但没有缓存也能获得这两样东西。那怎么做呢?Cell会说明怎么做的。

每个SPE配备了256KB的局部存储器,注意,并不是缓存。局部存储器是不会自行工作的。如果想要在其中存放点什么的话,需要发给SPE一条存储指令。缓存是自动起作用的;它使用与硬件紧密联系的算法来对它应该存储什么做出合理的推测。SPE的局部存储器大小与缓存相仿,但却像主存一样工作。另一个重要的方面是局部存储器是基于SRAM的,而不是基于DRAM的,所以就获得了与缓存类似的访问时间(对于SPE是6个周期),而不是主存访问时间(也就是上百个周期)。

那么重点是什么呢?虽然没有缓存,但引入了延时非常低的局部存储器,所以每个SPE有效地拥有了可控制,可预知的内存延时。这意味着一个聪明的开发者或巧妙的编译器能够为每个SPE极其精确地安排指令的时间。编译器会准确地知道,来自局部存储器的数据何时将准备好,从而能够围绕内存延时确定指令和操作的时间,就像无序微处理器那么好,但却没有附加的硬件复杂性。如果SPE需要存储在跟 Cell相连的主存中的数据,那么延时是可以预知的,这还是因为没有了缓存,不必担心事情会搞乱。

把 SPE做成有序核心对于它们的任务来说是很有意义的。然而,PPE做成有序则更多是受到空间/复杂性的限制。虽然SPE处理了更多指定的任务,但PPE在 Cell中的任务是处理所有的通用任务,那些在SPE的阵列上执行得并不理想。这个方法具有的问题是,为了像一个性能相对可靠的通用处理器那样运行,它需要缓存 - 而我们已经说明了缓存可能会怎样拖累有序核心了。如果Cell构架有薄弱环节的话,那就是PPE了,但要再次指出,Cell不是面向通用计算的,尽管有人可能会这样颠倒来用。

有序PPE的不利方面在于通过把核心做成只有2个流程而尽可能多地简化了,就是说它最多只能并行执行两个操作。不过,对有序低效率设计的执行潜力损失在某种意义下被最小化了,至少没有许多晶体管被浪费在把PPE做成非常宽大的芯片上。一个好的编译器应该能够确保那两个流程端口被尽可能频繁地占用,即使微处理器是有序的也一样。PPE还能够一次处理两个线程,这也有意掩盖了有序核心对于通用代码的无能。

在构架上,如果有什么让Cell无法被用在PC环境中的话,那就是PPE了。不过,拥有更强劲PPE或PPE阵列的新Cell能够改变这种情况。

六、制造工艺,Die大小和时钟速度

过去十年,Intel在工艺上的优势是造成它们在微处理器上技术领先的主要原因,常常有争论说不会有一个公司能够达到接近于Intel的制造水平 - 除了IBM以外。

Cell原型有着一些相当卓越的制造规格:

90nm SOI制造工艺

221 mm2的Die面积

2亿3千4百万个晶体管

4GHz的额定时钟速度

在它最初发布的时候,芯片似乎很大块,但它的规格比起Intel即将到来的Pentium D处理器来显得极为出色;让我们来看看后者的重要参数:

Intel Pentium D处理器

90nm拉制硅制造工艺

206 mm2的Die面积

2亿3千万个晶体管

2.8GHz - 3.2GHz时钟速度

由于稍微大一些的芯片和多出几百万个晶体管,Cell能够运行在比Intel即将到来的Pentium D最少高25%的时钟频率下。我们将马上讨论这一点...

动态逻辑电路

乍一看,运行在3 - 5GHz之间的90nm SOI Cell给人非常深刻的印象。毕竟,IBM当前生产的最快的90nm CPU运行在2.5GHz下,就连时钟速度之王Intel,在它们的90nm工艺上也不能逾越3.8GHz的极限。但让我们更深入一点地来研究。

Pentium 4有两个运行在两倍于它的内部时钟速度下的ALU - 那么在Pentium 4 660的情况下,那意味着更频繁使用的执行单元中的两个运转在7.2GHz下的 - 在90nm工艺上。所以,有可能在当前的90nm工艺上获得运行在更高时钟速度下的产品,甚至达到3 - 5GHz的范围 - 它只需要有点创造性的逻辑电路设计。

已经被证实,为了控制晶体管数量和提高操作频率,Cell正使用某种动态逻辑电路来代替静态CMOS。Intel在它们的双芯ALU中使用了许多专门的逻辑电路技术来达到7GHz以上的操作频率,而Intel已经论证了类似于Cell中用到的动态逻辑电路的技术。

图表右边的Sleep Transistor到这篇文章的末尾看起来应该非常自然了

为了理解动态电路的工作原理,必须了解晶体管在芯片上是怎样起作用的。

晶体管原理

读者先前已经听到我们计算晶体管了,但理解晶体管怎样起作用,对于理解IBM如何能够对Cell谈论3 - 5GHz的时钟速度是至关重要的。

我们将在保持这个章节尽可能简短而又有教益的情况下,提供关于晶体管如何制造和它们背后的物理性质的详细资料。把晶体管比作类似于电灯开关的“开关”是相当普遍的,那么晶体管怎样发挥像一个开关的作用呢?下面,我们有一个P型晶体管的表示法:

晶体管上标出有三个点:输出端(D),选通电极(G)和输入端(S)。在微处理器中,通常让输入端连接Vcc(把Vcc看作是负载CPU核心电压的线路),而输出端接地 - 很多时候是间接地(也就是10个晶体管被连成串,最顶上的输入端连接Vcc,而最底下的输出端接地)。

对P型晶体管选通电极的输入是让它像一个开关一样运行的关键。如果给选通电极合适的电压,从而使得它变成逻辑上的1或更高的话,电流就不流入晶体管了。如果没有给选通电极以任何电压,那电流就可以流过。就像一个电灯开关那样,把它拨到一边灯就会亮;拨到另一边则重归于黑暗。

在这里我们将要讨论的还有一种晶体管:N型晶体管:

晶体管上的三个点是一样的,但输出端和输入端互换了位置。N型晶体管的功能也不同。在这里,如果对选通电极加以适当的电压,电流将通过;如果没有施加电压,就不会有电流流过晶体管。

CMOS电路通过使用成对的N和P型晶体管来工作(那就是CMOS中Complementary项的由来)。到目前为止,CMOS电路在流行微处理器中是最普遍的了,但正如你很快将看到的,那并不意味着它们是没有缺点的。

七、了解门电路

任何微处理器的基本组成模块就是门电路。门电路是电学上模拟特殊逻辑功能的晶体管的汇集。例如,一个2输入的AND门电路将接收两个输入信号,而只有在两个输入都是1时才输出1。XOR门电路将在两个输入不同时输出1。NOR门电路将在所有输入都是0时输出1。

这些门电路的联合被用来实现微处理器中的一切操作,包括像加法器,乘法器等这些功能单元。

在这里我们有一个用逻辑门电路实现的一位数加法器。它会把任何两个一位数加起来并输出结果。

然而,每个门电路有许多的实现方法,只要门电路的结果独立于实现方法而保持一致就行了。这就像解数学问题;有多种方法来求出答案 - 只是有些可能比其它的更有效率。

设计逻辑门电路一个非常流行的方法是使用所谓的静态CMOS。静态CMOS设计是相对容易实现的,并且有大量用于自动化(也就是电脑控制)静态CMOS设计的库可用。静态CMOS设计具有两个问题:

静态CMOS电路并不是有可能最快的电路,那就是为什么它们没有被用在Intel的双芯ALU中的原因,在那里高时钟速度是必需的。

静态CMOS设计使用了相当多的晶体管。对于每个m输入门电路来说,需要2×m个晶体管(m个PMOS和m个NMOS晶体管),那对于高输入端门电路(拥有许多输入的门电路)来说,它使得晶体管数量成倍地增加。按照SIMD构架的情况,高输入端门电路是很普通的。

让我们来看一个静态CMOS NOR门电路:

注意到的第一件事情是,对于我们添加的每一个NMOS晶体管,必有一个互补的PMOS晶体管。于是对NOR门电路的每个附加输入,我们不得不增加两个晶体管 - 一个PMOS和一个NMOS - 因此得到2×m个晶体管。

这里有另一个问题 - NOR门电路是不带时钟的。大型的门电路组合被装配好之后通常会放在一个被称为插销的元件后面,它负责计时。一类大型组合就是用于一级管线的所有电路。这对于静态CMOS门电路来说实在不是一个问题,因为它极大地简化了对芯片的时钟发送(因为不必发送时钟信号到每个门电路,只要到插销即可,而一般门电路远比插销多得多)。

设计和实现静态CMOS门电路是极其简单的。硬件描述语言(Hardware Description Language,HDL),“写入”芯片中的编程语言都有常见的静态CMOS库,也就是说芯片设计商可以专注于编写代码来制成芯片,不必手工设计它的电路。但由于成就通常是与困难成正比的,所以静态CMOS设计并不是世界上最快的。像Intel的7.2GHz ALU就不是使用静态CMOS逻辑电路设计的,Cell也不是。

八、Cell的动态逻辑电路

虽然它超出了这篇文章的范围,但静态CMOS电路具有的主要问题之一就是P型晶体管,即对每个N型晶体管,还必须使用一个P型晶体管。

还有一个可供选择的就是所谓的动态或伪NMOS逻辑电路,它在完成相同功能的同时绕开了静态CMOS的问题。让我们再看一下静态CMOS NOR门电路:

图表顶部的两个晶体管是P型晶体管。当A或B是高电平(也就是拥有逻辑值1)时,那么P型晶体管选通电极保持打开,没有电流通过。在这种情况下,电路的输出是地线或是0,因为在顶部互补的N型晶体管跟它们的P型搭档作用相反(也就是输入是高电平时电流能够通过)。

因此,NOR门电路在所有输入是0时输出一个1,那正是NOR门电路应有的功能。

现在,让我们看一下同一个NOR门电路的伪NMOS实现:

在这里要注意几件事情。首先也是最重要的,时钟信号约束了两个晶体管(顶部的P型和底部的N型),但在我们的静态CMOS例子中没有直接到NOR门电路的时钟信号。在这里有一个时钟信号供应给门电路了。

Cell的实现更进了一步。电路顶部的P型晶体管和底部的N型晶体管被赋予了不重叠的相位,也就是两个时钟不是同时处于高/低电平的。

在这里门电路工作的方式如下:输入首先被作用于提供了时钟的晶体管之间的逻辑输入。顶部晶体管的选通电极是关闭的,使得晶体管处于充电状态。然后选通电极打开,而下面晶体管的选通电极关闭,以输出到地线。保留的电荷就是电路的输出。

这样做的重要意义在于,因为功率只消耗在两个不重叠的相位期间,所以总功耗低于静态CMOS的。不利之处是时钟信号发送变得困难得多。

另一个好处是减少了晶体管数量。在2输入NOR门电路的例子中,我们的静态CMOS设计使用了4个晶体管,而伪NMOS实现也使用了4个晶体管。但对于 3输入NOR门电路,静态CMOS实现需要6个晶体管,而伪NMOS实现需要5个。原因是对于CMOS电路,有1个P型晶体管就要有1个N型的,而在伪 NMOS电路中,只要比实现逻辑功能需要的最小数目多出两个晶体管就行了。对于100输入的NOR门电路(不切实际,但是一个好的例子),静态CMOS实现将需要200个晶体管,而伪NMOS实现只需要102个。

通过更有效地使用晶体管和降低功耗,Cell的伪NMOS逻辑电路设计能够获得更高的时钟频率。增加的成本是出自制造和设计阶段的中:

我们之前提到,由于Cell中使用了类似于伪NMOS的设计,时钟发送变得愈加困难了。Cell需要的时钟树可能相当地复杂,但鉴于IBM在该领域的专长,它不是一个不能克服的问题。

设计伪NMOS逻辑电路不容易,并没有普遍可用的库来从中引出电路设计。还是考虑到IBM的规模和专长,这不是个大问题,但它的确成为了小型芯片制造商的障碍。

制造那样的高速动态逻辑电路通常需要像SOI这类技术,但这对IBM来说也不是问题,因为它们已经研究SOI有相当长一段时间了。Cell采用90nm SOI工艺制造一点都不出奇。

在门电路级上,就像逻辑电路级一样,Cell是从高速和晶体管的有效使用出发设计的。

九、追求每个晶体管高性能的CPU蓝图

鉴于Cell是以每个晶体管的高性能为衡量标准来设计的,所以它的构架的确有几分在最低晶体管数量下追求最大性能收益的技术蓝图的样子。到现在我们已经检查了Cell构架的许多方面了,让我们来回顾一下那些构架上经过深思熟虑后做出的决定:

1. On-Die内存控制器

我们已经在Athlon 64上见过这个了,而On-Die内存控制器看来是在最小晶体管花费下改进整体性能的最好方法之一。此外,作为对Cell的内存选择,我们还看到 Rambus的XDR内存的使用,而不是常规的DDR。高频率和高带宽是Cell的强项,而为了实现它,除了采用Rambus的技术之外别无它法。

2. SMT

On-Die多线程也已经被证明是在最少晶体管作用下提高性能的一个好方法了。对Pentium 4的核心引入Hyper Threading需要不到5%的Die增大,这只是给出一个可度量的概念。至于SMT的性能收益将明显取决于CPU的构架。在Pentium 4的情况下,性能收益在从0 - 20%的范围。在Cell的有序PPE核心的情况下,性能收益可能会更多。不必说,如果实现得好,并且有适当的OS及软件支持的话,那SMT就是一个有意义的特性,而且不会造成晶体管预算紧张。

3. 更简单,有序,流程有限的核心 - 但个数很多

接下来的这个设计决策比头两个更有争议,完全是因为它与大多数我们熟悉的当前一代桌面微处理器的设计策略背道而驰。通过把PPE和SPE只做成2流程的,每个单独的核心保持了易处理的大小。较狭窄的核心明显牺牲了提高ILP的能力,但这样做可以在单个Die上塞进更多的核心 - Cell设计者们强调为了TLP而牺牲ILP。

去掉了额外的逻辑电路和无序核心需要的窗口,进一步帮助减少了晶体管数量,但前提是要确保拥有可靠的编译器,或是有愿意处理更多的构架特征来获得良好性能的开发商。

看看Intel对2015年平台的规划,它们谈论的微处理器类型是类似于Cell的产品 - 被更小的核心环绕着的一把强劲的通用核心,其中一些小核心是分化更细的硬件。

然而,Intel谈到引入那些类似于Cell的构架的期限离今天还早得很;在规划上,第一个类Cell构架至少要到2009 - 2015年之间才会出现。

过去,当Intel主导一次主要的构架转变的时候,总是它们说了算。Cell是规则的一个例外还是它将成为一个超前的构架,这还有待观察。

十、结束语

对Cell作任何结论都需要多方面地研究作为一个整体的构架和平台。

首先从游戏行业的观点来看,更明确的就是Playstation 3:

Cell的构架类似于Microsoft Xbox的下一个版本和即将到来的PC微处理器,极其重视多线程。下一代Xbox将同时执行3到6个线程,而桌面PC微处理器将执行2 - 4个。问题是在Xbox 2/360和PC准备使用多个通用核心的时候,Cell则依靠更多的专用硬件来保证它的最佳性能。Cell的SPE作为衍生的Altivec/VMX是一个优势,那意味着经常与任何基于POWER的构架打交道的开发者应该更熟悉这个ISA,但开发Cell的方法vs.开发PC的方法是根本对立的,而新的 Xbox则夹在中间。

这里的问题是大型游戏开发公司在涉及到硬件时,通常为最常见的标准开发和进行优化,并向其它平台提供辅助改进的端口。鉴于Cell的构架,它看起来几乎不可能作为开发的适当“基础”平台。我们斗胆说一句,为PC或下一代Xbox开发以及从那里移植过来的游戏将不能充分利用到Cell的性能潜力,除非花费大量的时间重写代码。

专做控制台游戏的开发公司,特别是那些与Sony紧密合作的,或许比只开发一次,跨多个平台移植的开发商更能有效得多地利用Cell的能力。鉴于EA最近的收购和无节制的获取许可,这应该是一个非常有效的举动。

有了Cell,Sony就等于有了让程序员望而生畏的硬件复杂度,但如果有人愿意承担复杂构架的重任的话,那就是游戏开发商了。而在试图获得最大性能的同时还要把移植到多个平台计算在内,那问题就复杂得多了。

作为PC市场中潜在的竞争者,Cell在进入AMD/Intel的视野之前还有很长的一段路要走。x86市场拥有的最大优势是向下兼容性,那是让其它 ISA置身PC行业之外的主要因素。无论如何鼓吹Cell的好处,该处理器也不能避免x86市场中其它竞争者走过的路 - 一个兼容的ISA是必需的。正如Intel的Justin Rattner评价它的,“尽管那个构架中有好的思想,但PC构架是非常有价值的,它将逐渐合并那些思想。”

最让人感兴趣的地方还是Intel高瞻远瞩的多核心设计与今天的Cell在宏观水平上的类似。主要的差异是Intel的类Cell设计将基于32nm或更小的工艺,而Cell正采用90nm工艺 - 那意味着Intel可以构想在单个Die上放上许多比Cell更复杂的核心。Intel有能力做出那种向类Cell设计的跃迁,因为它们的微处理器已经有了非常庞大的用户基础。但IBM,Sony和Toshiba却不能 - 要做出这么大的举动,Cell首先必须获得非常巨大的用户群。不幸的是,Cell在Playstation 3和Sony/Toshiba CE设备之外几乎看不到未来。

必须记住的最重要一点是Cell的构架不是什么革命性的,之前就有过。TI的MVP 320C8X就是一个很像Cell的多处理器DSP。所以,虽然Cell是在之前已经尝试过的设计方法下取得的最好结果,但它在为数不多的几个应用之外并没有历史性的突破。

姑且不论正在谈论的游戏平台,仅Cell提供的核心阵列处理精密复杂的物理及AI模型的能力就很有前途。AGEIA PhysX PPU的发布(它已经赢得了Ubisoft和Epic Games的赞许)提供了Cell作为高性能游戏CPU可行性的进一步例证。

对游戏中更现实的物理环境和AI的要求并不是幻想;问题是Intel即将到来的双核心和多核心CPU(拥有进一步优化的SIMD单元)将为游戏开发商提供足够的并行运行和性能,还是PPU将把类Cell构架提前带到桌面PC上?这个问题的答案可能甚至比GPU的出现更能影响桌面PC的未来。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有