『译』计算机体系结构发展史(五)_标量

系列文章第五篇(对应M.6)




M.6 The Development of SIMD Supercomputers, Vector Computers, Multimedia SIMD Instruction Extensions, and Graphical Processor Units (Chapter 4)


在这一回顾历史的章节中,我们以可能是最“臭名昭著”的超级计算机Illiac IV开始,作为早期SIMD(单指令,多数据)体系结构的代表,然后转向也许是最著名的超级计算机Cray-1,矢量体系结构的代表。然后是Multimedia SIMD Extensions,它之所以得名,一定程度上是由于“ Bunny People”(穿着模仿半导体生产线上使用的超净工作服跳迪斯科)的广告。最后,我们以GPU的历史作为结束,这并不那么“丰富多彩”。

SIMD Supercomputers

The cost of a general multiprocessor is, however, very high and further design options were considered which would decrease the cost without seriously degrading the power or efficiency of the system. The options consist of recentralizing one of the three major components. … Centralizing the [control unit] gives rise to the basic organization of [an] … array processor such as the Illiac IV.

Bouknight et al. [1972]

… with Iliac IV, programming the machine was very difficult and the architecture probably was not very well suited to some of the applications we were trying to run. The key idea was that I did not think we had a very good match in Iliac IV between applications and architecture.

David Kuck 

Software designer for the Illiac IV and early pioneer in parallel software

David Kuck 

An oral history conducted in 1991 by Andrew Goldstein, IEEE History Center, New Brunswick, N.J.

SIMD模型是最早的并行计算模型之一,其历史可以追溯到第一个大型多处理器系统Illiac IV。这些计算机没有像矢量体系结构那样流水地进行数据计算,而是通过功能单元的阵列进行并行计算。因此,它们也可能被视为阵列处理器。

SIMD风格计算机的思想最早来自Unger [1958]和Slotnick,Borck and McReynolds [1962]。Slotnick的Solomon设计了Illiac IV(也许是最“臭名昭著”的超级计算机项目)的基础。尽管成功地推出了在后来的项目中证明有用的多种技术,但它作为计算机还是失败了。即使只建造了计划中的多处理器系统的四分之一,但成本从1966年的800万美元增加到1972年的3,100万美元。(以2011年的美元价值计算,即从5400万美元增加到1.52亿美元。)整个系统的实际性能最多为15 MFLOPS,而最初的预测是1000 MFLOPS [Hord 1982]。该计算机于1972年交付给NASA Ames Research,但还需要经过三年的工程才能投入使用。这些事件减慢了对SIMD的研究,但是Danny Hillis [1985]在所谓的Connection Machine中恢复了这种架构,它具有65,536个1位处理器。

SIMD多处理器设计的最基本的权衡是性能与处理器数量之间的关系。80年代的SIMD超级计算机都强调了高度的并行性而非在单个处理器的性能。例如,Connec- tionMultiprocessor 2提供了65,536个单比特处理器,而Illiac IV则计划使用64个64比特处理器。大规模并行SIMD多处理器依靠互连或通信网络交换处理单元间的数据。

在80年代,首先是Thinking Machines使用,继而由MasPar复活之后,SIMD架构在超级计算机领域逐渐消失,主要原因有两个:首先,它太僵化了。许多重要问题本身并不是数据并行的,并且体系结构无法有效的缩减规模。也就是说,与替代产品相比,小规模的SIMD多处理器系统的性价比通常较低。其次,SIMD无法利用80年代SISD(单指令,单数据)微处理器技术的巨大性能和成本优势,该技术每18个月的性能就翻一番。SIMD多处理器系统的设计者并没有利用这种低成本技术,而必须为其多处理器构系统研制定制的处理器。

Vector Computers

I’m certainly not inventing vector processors. There are three kinds that I know of existing today. They are represented by the Illiac-IV, the (CDC) Star processor, and the TI (ASC) processor. Those three were all pioneering processors. … One of the problems of being a pioneer is you always make mistakes and I never, never want to be a pioneer. It’s always best to come second when you can look at the mistakes the pioneers made.

Seymour Cray 

Public lecture at Lawrence Livermore Laboratories on the introduction of the Cray-1 (1976)

最早的矢量处理器是1972年发布的Control Data Corporation(CDC)STAR-100(Hintz and Tate [1972])和Texas Instruments ASC(Watson [1972])。它们都是内存到内存的矢量处理器。它们的标量单元相对较慢 - STAR对标量和矢量使用相同的功能单元 - 导致标量流水线非常深。两种处理器的启动开销都很高,并且需要处理数百至数千个元素的向量。标量和向量之间的交叉可能超过50个元素。在两这个处理器的设计上,似乎没有给予Amdahl’s law足够的重视。

Seymour Cray在CDC从事6600和7600的工作,他创立了Cray Research,并于1976年推出了Cray-1(Russell [1978])。Cray-1使用矢量寄存器架构,显着降低了启动开销并减少了的内存带宽的需求,他还对非单位步幅的访问提供了有效的支持和并发明指令链接技术(chaining)。最重要的是,Cray-1也是当时世界上最快的标量处理器。标量和矢量性能的良好匹配可能是Cray-1成功的最重要因素。一些客户购买该处理器主要是因为其出色的标量性能。许多后续的矢量处理器都基于这个第一个商业上成功的矢量处理器的体系结构。Baskett和Keller [1977]对Cray-1进行了很好的分析。

1981年,CDC开始销售CYBER 205(Lincoln [1982]),具有与STAR相同的基本架构,但在各方面都有性能的改进。另外,它的矢量单元具备最多四个通路(lane)的可扩展性,每个通道包括多个功能单元和一个宽的load-store通道,每个时钟可以提供多个字的数据。CYBER 205的峰值性能大大超过了Cray-1。但是,在运行实际程序时,性能差异要小得多。

1983年,Cray Research发行了第一台Cray X-MP(Chen [1983])。通过改进的时钟速率(从Cray-1上的12.5 ns,提升为9.5 ns),更好的链接支持(允许有RAW依赖的矢量操作并行运行)和多个访存流水线,该处理器保持了Cray Research在超级计算机领域的领先地位。之后,Cray-2推出,这是一种全新的设计,最多可配置四个处理器。Cray-2的一个新特性是使用了DRAM,这使得计算机可能拥有非常大的内存。第一个具有256M字(64位字)内存的Cray-2所包含的内存比之前售出的所有Cray机器的内存加起来还要多!Cray-2的时钟比X-MP快得多,但流水线也更深。但是,它没有使用链接技术,内存延迟巨大,并且每个处理器只有一个内存通道。一般来说,Cray-2只有在需要非常大的主内存的应用场景中才比Cray X-MP快。

同年,日本的处理器供应商进入了超级计算机市场。首先是富士通VP100和VP200(Miura and Uchida [1983]),然后是日立S810和NEC SX/2(Watanabe [1987])。这些处理器在性能上被证明接近Cray X-MP。通常,这三个处理器的峰值性能比Cray X-MP高得多;但是,由于巨大的启动开销,它们的典型性能通常反而低于Cray X-MP。Cray X-MP更适合多处理器配置,首先提供了双处理器版本,后来提供了四处理器版本。相比之下,三个日本的处理器则具有可扩展的矢量功能。

1988年,Cray Research推出了Cray Y-MP,它是X-MP的更大,更快的版本。Y-MP最多允许八个处理器,并将时钟周期降低到6 ns。尽管,单处理器的日本超级计算机可能比单处理器的Y-MP更快,但如果是具有八个处理器的完整版本,Y-MP通常是最快的超级计算机。1989年末,Cray Research被拆分为两家公司,两家公司的目标都是研发90年代初可用的高端处理器。Seymour Cray领导了Cray Computer Corporation,直到1995年公司灭亡。他们的最初处理器Cray-3计划在砷化镓工艺上实现,但是他们无法开发出可靠且具有成本效益的实现技术。Seymour Cray在1996年因车祸不幸去世之前不久,成立了另一家公司来开发高性能系统,但这次使用的是一般商用组件(commodity components)。

同时,Cray Research专注于C90,这是一种新的高端处理器,系统最多可配置16个处理器,时钟频率为240 MHz。该处理器于1991年交付。1993年,Cray Research推出了他们的第一个高度并行处理器系统T3D,它使用多达2048个Digital Alpha21064微处理器。1995年,他们宣布推出新的低端矢量计算机J90和高端机T90。T90与C90极为相似,但采用了三维封装和光学时钟分配,其时钟频率是C90的两倍(460 MHz)。

1995年,Cray Research被Silicon Graphics收购。1998年,它发布了SV1系统,该系统将更快的CMOS处理器嫁接到了J90存储系统上。它还给每个CPU添加了用于向量的高速数据缓存,以满足不断增长的内存带宽需求。Silicon Graphics在2000年将Cray Research出售给了Tera Computer,合资公司更名为Cray Inc。

日本的超级计算机制造商继续发展其设计。在2001年,NEC SX/5通常被认为是可用的最快的矢量超级计算机,它具有16条通道,时钟频率为312 MHz,并且多达16个处理器共享同一存储器。NEC SX/6于2001年发布,是第一款商用单芯片矢量微处理器,在单个裸片上集成了乱序的四发射超标量处理器,标量指令和数据高速缓存以及八通道矢量单元[Kitagawa  et al. 2003]。Earth Simulator由640个节点构成,通过全连接的交叉开关相连,的其中每个节点包括八个共享本地内存的SX-6矢量微处理器。2004年发布的SX-8将通道数减少到4,但将矢量时钟速率增加到2 GHz。标量单元以较低的1 GHz时钟频率运行,这是矢量计算机中的常见模式,由于竞争冒险不多,可以简化在矢量单元中使用较深的流水线。

2002年,Cray Inc.发布了基于全新矢量指令集架构的X1。X1 SSP处理器芯片将乱序的超标量,与运行在400 MHz的标量高速缓存,和运行在800 MHz的两通道矢量单元集成在了一起。当将四个SSP芯片组合在一起形成MSP时,得到的12.8 GFLOPS的峰值矢量性能可与现代NEC SX机器竞争。X1E的增强功能于2004年交付,将时钟频率分别提高到565和1130 MHz。许多想法是从Cray T3E设计中借鉴的,该设计是使用现成微处理器的MIMD(多指令,多数据)计算机。X1具有一个新的指令集,该指令集架构具有更多的寄存器,并且具有在共享地址空间中在处理器本地分布的内存。其中的乱序的标量单元和矢量单元是解耦的,以便标量单元可以领先于矢量单元。当数据被阻塞而使用MSP缓存的时候,矢量会变短,这与八通道矢量单元并不能很好的匹配。为了处理这些较短的矢量,每个只有两个矢量通道的处理器都可以处理不同的循环。

Cray X2于2007年发布,鉴于市场规模很难证明投资新的芯片是合理的,它可能是最后一个Cray矢量架构。该处理器具有1.3 GHz时钟速率和8个矢量通道,可实现单精度的42 GFLOP/sec处理器峰值性能。它包括L1和L2缓存。每个节点都是4路SMP,最多具有128 GB的DRAM,最大规模为8K个节点。

NEC SX-9每个节点最多有16个处理器,每个处理器有8条通道并以3.2 GHz运行。它于2008年发布,双精度矢量的峰值性能为102 GFLOP/sec,16个处理器的SMP可以具有1024 GB的DRAM,最大规模为512个节点。

伊利诺伊大学的Kuck和他的同事[1974]开创了现代矢量化编译器技术的基础和数据依赖的概念。Padua and Wolfe [1986]很好地概述了矢量化编译器技术。

Multimedia SIMD Instruction Extensions

What could a computer hardware company … possibly have in common with disco dancing. A lot, if one goes by an advertisement campaign released by the world’s largest microprocessor company … Intel, in 1997.

IBS Center for Management Research

“Dancing Its Way Towards Leadership,” 2002

回顾历史,1957年的TX-2对ALU进行了划分,以支持当时的媒体应用,但这些想法逐渐消失,而在30年后的个人计算机时代重新被发现。由于每个台式计算机的微处理器需要自己的图形化显示,因此随着晶体管预算的增加,不可避免地也会增加对图形操作的支持。许多图形系统使用8个比特来表示3种原色中的每一种,再加上8比特来表示像素的透明度。用于电话会议和视频游戏的扬声器和麦克风的使用需要对声音处理的支持。音频样本需要8比特以上的精度,但是16比特就足够了。

每个微处理器都对字节和半字数据类型有特殊的支持,以便它们存储在内存中时会占用较少的空间。但是,由于在典型的整数程序中对这些数据类型的算术运算的使用频率不高,因此除了数据传输外几乎没有运算上支持。英特尔i860在公司内部被认为是图形加速器。它的架构师认识到,许多图形和音频应用程序对这些数据的向量执行相同的操作[Atkins 1991; Kohn 1989]。尽管向量单元超出了1989年i860的晶体管预算,但通过在64位ALU中划分进位链,它可以同时执行8个8位操作数,4个16位操作数,或者两个32位操作数的短向量操作。这种分区的ALU的额外开销很小。能够用上这种技术的应用程序包括MPEG(视频),视频游戏(3D图形),数字摄影和电话会议(音频和图像处理)。

随着时间的流逝,这种多媒体支持已经像病毒一样扩展到几乎每个台式机微处理器。惠普是第一个成功提供这种支持的台式机RISC,但是很快其他所有制造商在1990年代都开始采用这种想法。

这些扩展最初称为“subword parallelism”或“vector”。自从英特尔市场营销部门使用SIMD来描述1996年发布的80x86的MMX指令扩展以来,该名字就广受欢迎,部分原因是成功的电视广告活动(迪斯科舞者穿着模仿半导体生产线中的超净工作服)。

Graphical Processor Units

It’s been almost three years since GPU computing broke into the mainstream of HPC with the introduction of NVIDIA’s CUDA API in September 2007. Adoption of the technology since then has proceeded at a surprisingly strong and steady pace. Many organizations that began with small pilot projects a year or two ago have moved on to enterprise deployment, and GPU accelerated machines are now represented on the TOP500 list starting at position two. The relatively rapid adoption of CUDA by a community not known for the rapid adoption of much of anything is a noteworthy signal. Contrary to the accepted wisdom that GPU computing is more difficult, I believe its success thus far signals that it is no more complicated than good CPU programming. Further, it more clearly and succinctly expresses the parallelism of a large class of problems leading to code that is easier to maintain, more scalable and better positioned to map to future many-core architectures.

Vincent Natol

“Kudos for CUDA,” HPCwire (2010)

3D图形管线硬件,从80年代初期的大型昂贵系统发展到小型工作站,然后在90年代中后期发展到PC的图形加速器。在此期间,发生了三个主要变化:

  • 性能领先的图形子系统的价格从50,000美元降至200美元。
  • 性能从每秒5000万像素增加到每秒10亿像素,从每秒10万个顶点增加到每秒1000万个顶点。
  • 本机硬件功能已从线框(多边形轮廓)演变为平坦着色(flat-shaded, constant color)的多边形,再过渡到平滑着色(smooth-shaded,interpolated color)的多边形,再到具有纹理贴图(texture mapping)和多重纹理(rudimentary multitexturing)的全场景抗锯齿(full-scene anti-aliasing)技术。

Scalable GPUs

从一开始,可伸缩性就一直是图形系统的一个吸引人的特征。工作站图形系统通过改变安装的像素处理器电路板的数量,为客户提供选择像素处理能力的方法。在90年代中期之前,PC上图形处理的可伸缩能力。只有一个选项 - VGA控制器。随着具有3D功能的加速器的出现,市场出现了容纳一系列产品的空间。3dfx在其Voodoo2上引入了带有原始SLI(扫描线交错)的多板缩放功能,该性能在当时一直保持着最高水平(1998年)。同样在1998年,NVIDIA通过Riva TNT Ultra(高性能)和Vanta(低成本)在单一体系结构上推出了不同的产品,首先是通过速度筛选和封装,然后是单独的芯片设计(GeForce 2 GTS和GeForce 2 MX)。目前,对于某一代给定的架构,需要四到五个单独的GPU芯片设计来涵盖台式机不同的性能和价格需求。此外,笔记本电脑和工作站系统中还需要单独的产品。收购3dfx之后,NVIDIA从GeForce 6800开始在2004年继续采用多GPU SLI概念 — 透明地对程序员和用户提供多GPU可扩展性。在整个伸缩范围内,功能行为是相同的。一个应用程序在一个体系结构系列的任何实现上都可以保持不变。

Graphics Pipelines

早期的图形硬件虽然可配置,但不能由应用程序开发人员编程。尽管,每一代都提都有改进,但是,开发人员的要求变得越来越复杂,他们需要的更多新功能要比内置固定功能更多。Lindholm等人描述的NVIDIA GeForce 3 [2001]迈出了实现真正的通用着色器可编程的第一步。它向应用程序开发人员开放了浮点顶点引擎(floating-point vertex engine)的专用内部指令集。这与Microsoft DirectX 8和OpenGL顶点着色器扩展的发布正好吻合。在DirectX 9时期,GPU将常规可编程性和浮点功能扩展到像素片段(pixel fragment)阶段,并支持在顶点阶段(vertex stage)使用纹理(texture)。于2002年推出的ATI Radeon 9700具有一个使用DirectX 9和OpenGL编程的可编程24位浮点像素片段处理器。GeForce FX添加了32位浮点像素处理器。至少就应用程序员而言,这是统一不同阶段的功能的总体趋势的一部分。NVIDIA的GeForce 6800和7800系列采用了单独的处理器设计和专门用于顶点和像素片段处理的硬件。XBox 360于2005年推出了早期的统一处理器GPU,允许顶点和像素着色器在同一处理器上运行。

GPGPU: An Intermediate Step

随着支持DirectX 9的GPU的出现,一些研究人员注意到了GPU的原始性能的潜力,并开始探索使用GPU解决复杂的并行问题。DirectX 9 GPU仅设计用于匹配图形API所需的功能。为了访问计算资源,程序员必须将其问题转换为图形操作。例如,要同时运行像素着色器的许多实例,必须向GPU发布一个三角形(如果需要,可以裁剪为矩形)。由于着色器无法执行对存储器的任意分散操作(scatter),将结果写入内存的唯一方法是将其作为像素颜色值,并将帧缓冲区操作阶段配置为将结果写入(或混合,如果需要)到二维帧缓冲区。此外,从一次计算到下一次计算获得结果的唯一方法是将所有并行结果写入像素帧缓冲区,然后使用该帧缓冲区作为纹理贴图,作为下一阶段计算的像素片段着色器的输入。在这个时代,将通用计算映射到GPU很麻烦。然而,无畏的研究人员通过艰苦的努力展示了一些有用的应用程序。该领域被称为“ GPGPU”,即GPU上的通用计算。

GPU Computing

在为GeForce 8800开发Tesla架构时,NVIDIA意识到,如果程序员可以将GPU视为处理器,它的潜在用途将会更大。NVIDIA选择了一种编程方法,程序员可以在其中明确声明工作负载的数据并行性。

对于DirectX 10代,NVIDIA已经开始开发一种高效的浮点和整数处理器,该处理器可以运行多种并行工作负载以支持逻辑图形管线。设计该处理器利用了一般情况下一组线程会执行相同的代码路径。NVIDIA增加了整数字节的访存指令,以支持编译的C程序的要求。它引入了线程块(cooperative thread array),线程块网格(grid of thread blocks)和屏障同步(barrier synchronization),以调度和管理高度并行的计算工作。另外,架构中引入了原子内存操作。NVIDIA开发了CUDA C/C ++编译器,库和运行时软件,以使程序员能够轻松使用新的并行计算模型并开发应用程序。

为了创建与供应商无关的GPU编程语言,大量公司为OpenCL语言设计编译器,该编译器具有CUDA的许多功能,但可以在更多平台上运行。在2011年,如果为GPU编写CUDA代码,则性能要比用OpenCL编写的代码高得多。

AMD收购第二大GPU供应商ATI表明了GPU计算的广泛普及。本版本即将完成时(注:这段文字描述的内容大约是2011到2012年)公开的AMD Fusion架构是传统GPU和传统CPU之间的初步融合。NVIDIA还发布了Project Denver项目,该项目在单个地址空间中将ARM标量处理器与NVIDIA GPU相结合。当这些系统正式售卖后,分析和讨论它们的集成的紧密程度,以及这种集成对数据并行和图形应用程序的性能和能耗的影响,将是非常有趣的。

- 第五部分完 -


参考资料见『译』计算机体系结构发展史(五)


题图由stable diffusion生成

prompt: a beautiful oil and canvas painting of computers and network technology, abstract, by Monet, trending on artstation

本文为个人兴趣之作,仅代表本人观点,与就职单位无关