Skip to content

Latest commit

 

History

History
35 lines (18 loc) · 6.12 KB

presentation.md

File metadata and controls

35 lines (18 loc) · 6.12 KB

各位老师、同学大家好:

我们是清华大学的 NOP 团队,下面我们将进行“龙芯杯”决赛展示答辩。

我们的展示分为 微架构设计、SoC 设计与系统软件、总结致谢三部分。

首先是微架构设计部分。

选好执行模型,是迈向成功的第一步。我们在 LA32R 指令集上实现了一款乱序五发射 CPU —— NOP。选择乱序,主要是出于三点考虑。其一,是乱序相比顺序带来的性能红利,在等待某些指令的结果时,乱序仍可继续推进流水线,减少停顿;其二,乱序更贴近实际,现代的处理器几乎全是乱序超标量的执行模式;其三,“挑战是一种信仰”,我们致力于挑战自我,在中国自主研发的 龙芯 指令系统上,做首个开源完善的乱序超标量处理器。

但是,欲戴王冠,必承其重。乱序超标量 CPU 的开发给我们带来了多方面的挑战。首先,乱序带来了顺序执行中不存在的相关,只有解决这些冲突,才能真正减少停顿,提升吞吐率;其次,为了分支恢复、保序访存和精确异常的实现,纵使指令可以乱序执行,但指令执行的效果必須顺序提交;最后,乱序执行的复杂逻辑增加了组合逻辑的延迟和实现布线的难度,从而限制了处理器运行的最高频率。

纵使困难重重,兵来将挡,水来土掩。我们最终设计并实现了如图所示的乱序五发射架构。我们的架构分前后端两部分,前端采用五级流水,包括两级取址、译码、重命名与分发;后端五路流水则包括三路算术、一路乘除、一路访存。为了解决乱序执行的指令相关问题,我们采用了寄存器重命名技术来避免指令相关冲突。为了保证指令执行在逻辑上的顺序性,我们增加了重排序缓存与 StoreBuffer,来实现指令的顺序提交。同时,为了解决复杂逻辑带来的高延迟,我们分析关键路径,对流水线进行了合理的切分。

最终,因为乱,所以快,我们在性能测试上收获了显著的提升。如表所示,对比性能测试基线,我们总体上取得了高达 3.00 的加速比。我们平均每周期执行的指令数突破了 1 的分水岭,达到了 1.02,是“龙芯杯”历史上首个平均 IPC 大于 1 的处理器。

一只木桶盛水的多少,取决于其中最低的那块木板。在上述乱序五发射的执行模型上,我们继续探究如何进一步解放我们处理器的性能边界。

首先,为了保证运行频率,我们的流水线最深有 13 个流水段。如此深的流水线设计,在分支恢复时会带来极其严峻的代价。我们注意到这一点,并对分支预测模块进行了重点优化。我们的分支预测分为三个主要模块:相关预测器、分支目标缓存,及返回地址栈。相关预测器综合考虑全局模式与局部倾向,预测是否跳转,而跳转的目标地址信息由 BTB 与 RAS 共同提供。BTB 会缓存分支指令的最近跳转地址,RAS 则基于函数调用规范,在函数返回时,预测跳转到调用者的下条指令。我们针对分支预测以及返回地址栈的有效性进行了消融实验,可以看到它们的确对分支正确率有很大提升。

然后,我们观察到占流水线暂停时间最长的,是缓存缺失重填导致的访存。在经过多次实验收集数据,兼顾缺失率、缺失开销、处理器主频的权衡之后,我们最终选择了容量大小均为 8KiB 的 L1 I/D Cache。两 Cache 的缓存块大小均为 64 字节,均设置 64 行,每个缓存设置 2 路,采用 LRU 替换策略。

最后,是对访存相关的优化。我们首先注意到,LA32R 中全相连的 TLB 查找逻辑成为了性能优化的瓶颈。大道至简,我们将该地址翻译过程切分到两个流水段进行,带来了主频的一次大幅提升。但是,这让访存流水段的深度进一步加深,常见的 Load / Use 指令对中间要间隔 4 个空周期才能完成。为此,我们引入了推测唤醒技术,将大部分 Load Use 对的间隔变成了 3 个空周期,朴素访存逻辑带来了26.7% 的性能提升。

接下来,我们介绍系统软件适配与 NOP-SoC 系统。

检验 CPU 正确性的终极标准,是能够稳定运行复杂的系统软件。我们移植了 Chiplab-PMON,并修复了其中若干 bug 及未定义行为。我们针对 SoC 移植了 la32r-Linux。对于测试程序,我们从最新版 buildroot 构建了完善的用户文件系统。为便于调试和装载,我们设计 PMON - Linux 的两级启动引导系统。系统上电复位后首先将 PMON 从 SPI Flash 解压到内存,PMON 再通过网络加载 Linux 镜像,引导 Linux 启动。实验表明,我们的系统可正常运行PMON,Linux及各类预置的用户程序。

同时,我们设计了如图所示的 SoC 系统,可以稳定驱动板上除 USB 外的全部外设,提供极致的用户体验。所驱动的一系列外设,列举在右侧。

作为演示,我们的系统可以从 PS/2 键盘获得用户输入,并在 VGA 和 LCD 屏幕上正确显示结果。我们同样可以运行复杂的用户程序,例如,我们可以执行 JavaScript 解释器 QJS,可以在 VGA 上玩 2048 小游戏。进一步地,将开发板连接外网,用户可以使用命令行浏览器直接浏览网页,在互联网的世界中漫游。从下方白底的状态提示中可以看到,运行在我们 CPU 上的浏览器在正常发送 HTTP 请求,并下载数据进行显示。

最后是总结致谢部分。性能上,我们达到了 107.69M 主频,IPC 1.02,对性能测试基线加速比 3.00;功能上,我们的 CPU 从基础的指令测试开始,最终走到 Linux,并提供了 NOP-SoC ,海量的外设及稳定丰富系统软件适配。极致的功能和性能背后,是细心、坚持和汗水。我们要感谢在开发过程中为我们提供帮助的老师、学长以及和我们并肩作战的同学们。没有你们,我们将难以完成这个 CPU 的设计和开发。

谢谢大家,我们的展示到此结束,请各位评委老师批评指正。