希望拥有一台经典、庞大且计算能力强大的超级计算机吗?自己构建一台吧。
1976年,迪斯科还大行其道,冷战正处于高潮,而我要到9年之后才出生。那年,正是Cray-1在计算机领域大显身手之际,个人计算当时还处于发展的初期(MITS Altair一年前刚刚推出),同时Control Data和IBM等公司统领高端市场。Cray-1是人们印象中用于定义“超级计算机”的传奇机器之一。其采用独特的C型结构,运行速度高达惊人的80 MHz,桌面电脑直到20年之后才能达到这样的速度。Cray速度快,也极富吸引力。
现在,让我们把时间快进到33年后,那是2009年初的一个清晨,我起床后也想拥有一台Cray超级计算机。
我首先要回顾一下基于FPGA的复古计算机技术。我2007年12月从南加州大学毕业并获得BSEE学位,当时我把它称作“计算机招魂术”。作为新生代电子工程师,我对神秘的计算机架构特别感兴趣,觉得正好可以借此提高我的Verilog水平。我毕业时为自己买了一套Digilent公司的Spartan®-3E 1200开发板当礼物。我的第一台计算机则是1980年代的老古董NonVon-1。它属于首批“大型并行”机之一,类似于同样古老但更为成功的ConnecTIon Machine系列(不过主要用于数据库)。这是一台非常有趣的设备,采用8位处理器的二进制树状结构(带1位ALU)。
Cray-1是人们印象中用于定义“超级计算机”的传奇机器之一。其采用独特的C型结构,运行速度高达惊人的80MHz,桌面电脑直到20 之后才能达到这样的速度。
经过几个月的折腾,我总算造出了一台31节点的超级计算机,不过其计算能力还比不上现今任何一块手表。虽然这东西没什么用处,却让我明白了摩尔定律的巨大作用,也激发我进一步动手的欲望。
首台NonVon-1获得成功后,我又开始寻找新的项目(我的Verilog技能仍比较欠缺)。我认识到,低端FPGA已经能够处理一些比较高级的硬件了,目前甚至32位软处理器都比较常见了。
我努力寻找一个能焕发新生的新目标,也考虑了不少选择,包括UNIVAC这台有趣的设备,不过它确实有点太老了。Digital Equipment公司的PDP系列已经被硬件仿真过。Z80设备的软件仿真器也非常常见。因此,我想到了Cray。
Cray-1是什么?Cray-1是Seymour Cray于20世纪70年代初离开Control Data后所成立新公司Cray Research推出的首台设备。当时该设备计算能力强大,需要占用整个房间来放置计算机和磁盘才能保证数据接收。此外,它还拥有一个全职工程师团队来确保正常运行,甚至还需要自备发电设备才能确保加电启动。该设备重新定义了当时的“超级计算机”(毕竟这是 Cray),而且幸运的是它的设计美妙而简单,相关资料也非常齐备(图1所示)。Cray-1硬件参考手册(在因特网上很容易找到)非常详细,现在的用户往往只能拿到黑盒子,看到这么详细的说明肯定会感到震惊。几乎所有运算代码、寄存器及时序图都得到了妥善而详尽的保留。
图 1 — 让计算机爱好者感到幸运的是,Cray 的架构设计美妙而简单,而且相关资料保存完好。
这台计算机本身是一款64位流水线处理器,顺序指令发送,只有128条独特指令。它采用类似RISC的指令集,所有指令都既可在存储器和寄存器(加载或存储指令)之间,也可在两个 *** 作数寄存器和一个目的地寄存器之间(全部算术/逻辑指令)。指令为16位或32位长。该设备使用三种不同类型的寄存器:地址、标量和矢量寄存器。地址寄存器为24 位宽,并能够让设备对高达 4Megaword (32 MB) 的主存储器进行寻址。标量寄存器为64位宽,用于计算。每个矢量寄存器包括64个64位寄存器,从而能够在进行大矩阵科学计算时确保出色的性能。
在CPU中,指令可发送给13个独立的全流水线“功能单元”。高强度的流水线功能对实现Cray当时极高的80MHz时钟频率而言至关重要。不同的功能单元处理逻辑 *** 作、移位、乘法等。比方说,一个浮点乘法指令需要7个周期才能完成,但计算机每个周期都能发出一条新的乘法指令(假定不存在寄存器冲突)。该设计会产生一种有趣的情况,即没有“除法”指令,而是采用倒数近似值除法。也就是说,我们不是计算 X / Y,而是计算 (1 / Y) * X。单独的浮点“倒数近似值”函数单元可在14 个时钟周期内计算出倒数。
马拉松我刚开始着手这一项目时,并不完全确定是否能靠自己的力量重新构建如此复杂的计算设备。原始的Cray-1花了整个工作团队多年的时间才设计和构建完成。我有无足够的决心做下去呢?(结果是我确实做下去了。)我的FPGA能否真的满足要求?(结果是不能满足。)即便设计比较简单而直接,但设计规模仍然较大(目前需要约5,600行Verilog代码,而且数量还在不断增多)。我必须要保持信念。构建自己的超级计算机是一场马拉松,而不是一场冲刺赛。我只能一步步稳扎稳打地前进。
我开始逐一创建功能单元。就像改装汽车一样,构建完整的计算机也必须熟悉设计的各个方面,这是一种全新的体验。我探索乘法器和加法器设计。我重新打开教科书研究浮点算法。我学习如何使用Newton Raphson法三次迭代计算30位精度的倒数近似值。(我前面提到过硬件参考手册的详细度吧?)功能单元逐一成型。
这完全是一项业余时间的项目,因此项目只能一点点地慢慢推进。我从最简单的模块开始,很轻松地就完成了两个地址功能单元(一个简单的加法器和一个乘法器)。进入标量函数单元时(一个加法器、一个逻辑单元、一个移位器和一个总体 (populaTIon)/
前导零计数 (leading zero count)),进度就放缓了。处理三个浮点函数单元(一个加法器、一个乘法器和麻烦的倒数近似值单元)时,我已经感到动力不足了。如前所述,这就是一场马拉松,不是一场冲刺赛。我2009年初开始着手Cray-1项目,可能在这个项目上总共花了19到20个月的时间。
随后我的工作进度再度加快,开始接近浮点单元设计的尾声,在矢量单元方面的推进速度也开始加快。如前所述,Cray-1设计作为一款具有高计算强度的巨型机,拥有8个矢量寄存器,每个都包含64个64位寄存器。矢量指令执行时,比方说进行加法计算,每个运算对象录入后每个周期都添加并存储在第三个矢量上(结果矢量)。
Cray-1支持一个出色的特性,即“矢量链”。比方说,矢量加法单元只需三个周期即能生成首个结果。如果我们将两个含有64个条目的矢量相加,我们希望在所有64个条目都完成加法计算前就可以对结果进行 *** 作。矢量链使我们能够将加法器单元的结果直接“链接”到另一个单元的输入,不必等待 *** 作结束。我们可在获得首个结果的两个周期后让结果与第三个矢量相乘。对于一些大型矩阵计算而言,在80 MHz频率上我们几乎可以保持每个时钟周期两次浮点 *** 作,也就是峰值速率达160MFLOPS!直到20世纪 90年代中期,普通台式电脑还不及Cray-1的水平。
有了功能单元,我已经能看到长夜将近的黎明曙光了。显然,只需添加一些胶合逻辑就差不多完工了。是的,确实接近完工了。不过我发现,胶合逻辑的工作量其实很大。尽管Cray-1的相关存档非常齐备,但齐备的程度还不够。我非常清楚,我在一些不大不小细节的逆向工程方面遇到了困难,如指令发布、冒险检测以及矢量链等。有些问题,比如较宽的64位数据总线可用分立式逻辑芯片更方便地解决,而不必使用面向较窄数据路径的FPGA。矢量寄存器在布线时总是让我头疼。
此外, 我还要修改一些特性。Cray-1采用16组全SRAM存储器系统,体积跟我的冰箱差不多大,其4Megaword存储器可实现每秒640MB的带宽,我开发工具套件所用的简陋的DDR存储器芯片肯定达不到这样的性能。我使用几乎所有的FPGA片上BRAM也只能获得4 kiloword的存储器空间,这是我的Cray目前面临的最大瓶颈。而且我也必须忽略掉一些特性:
硬件障碍我在此简要介绍一下在设计过程中遇到的一些与FPGA相关的难题。首先,我最初的Spartan-3E 1200芯片已经证明不能满足要求。我在设计中添加了Cray的庞大矢量寄存器后,芯片有限的逻辑资源就不够用了。这时我开始有些犯憷,因为这时我的项目已经推进了1年多时间了,而且较大型FPGA的价格看似贵了很多。更大的Virtex® 芯片能方便地满足我的设计要求,但开发板的成本已经超出了我几年兴趣爱好所能承受的预算范畴。幸运的是,Digilent还出售了一款稍大型的Spartan-3E 1600开发板,价格对业余爱好者来说还能承担。实践证明,这块开发板对满足整个系统要求已经足够了(显著扩展了我所使用BRAM的容量)。
我遇到的另一个问题就是速度问题。尽管摩尔定律发展了30多年,但Cray-1原始的80MHz设计对我可怜的Spartan-3E而言还是太高了。我的原始设计最高速度大约为33 MHz,关键路径在级联加法器中,那是用在我简陋的浮点乘法器实施方案中的。幸运的是,Spartan-3E配套提供众多18位硬件乘法器,能够将速度提升到近50 MHz(面积却节省了5%),但这时设计的其它部分又遇到了麻烦。Cray-1具有大量64位数据路径,以及复杂的指令发布逻辑,这将Spartan-3E上的周期时间限制在20纳秒左右。目前我还算满意,而且较新的Spartan-6芯片将能满足8-0的水平要求。
外壳构造欢迎分享,转载请注明来源:内存溢出
评论列表(0条)