NSCSCC2022 龙芯杯参赛总结

转载自: 我的个人博客

我参加的是2022年龙芯杯个人赛,从2022年2月左右开始准备,到2022年8月完赛。以下为我的参赛历程与感想。

赛事简介

全称 : “龙芯杯”全国大学生计算机系统能力培养大赛

全国大学生计算机系统能力大赛(National Student Computer System Capability Challenge, NSCSCC)是由教育部高等学校计算机类专业教学指导委员会和系统能力培养研究专家组共同发起,以学科竞赛推动专业建设和计算机领域创新人才培养体系改革、培育我国高端芯片及核心系统的技术突破与产业化后备人才为目标,面向高校大学生举办的全国性大赛。

大赛共分3个赛道:CPU、编译系统、操作系统。其中,CPU赛道即“龙芯杯”竞赛。

“龙芯杯”竞赛分3个赛道:MIPS团队赛、MIPS个人赛 和 LoongArch挑战赛。

  • MIPS团队赛 :
    开发支持32位MIPS基准指令集的简易计算机系统。加分项:运行操作系统、实现加速器、设计可演示的应用

  • MIPS个人赛 :
    开发支持32位MIPS基准指令集的简易计算机系统。完成三级功能测试(最多22条指令),支持SRAM、UART,运行监控程序。
    总成绩 = 功能测试 得分 + 性能测试 得分

  • LoongArch挑战赛 :
    开发支持LoongArch32 Reduced指令集的简易计算机系统,并在自己编写的CPU上启动Linux操作系统。
    总成绩 = 70% * benchmark基准测试成绩 + 30% * 系统展示及答辩

*详细内容可参考龙芯官方wiki

个人赛要做什么?

  • 一个支持MIPS基准指令集的MIPS位系统
  • 使用实验板上的SRAM作为存储
  • CPU核能够通过接口与各I/O设备互联通信
  • 支持MIPS-C3指令集(总共39条指令左右),运行提供的MIPS监控程序
  • 决赛:使用汇编语言现场写算法题,编译后放到自己做的CPU上跑

前期准备

2022NSCSCC的时间线如下,仅供参考。
在这里插入图片描述

我们学校组织备赛开始得较早,在2021年12月底即组织了宣讲和预报名,年后即开始了每周进度汇报会。虽然前期的进度不算快,但每周前进一小步,还是积累了不少东西

理论部分,首先阅读《计算机组成与设计》学习设计相关的理论知识,之后跟着雷思磊的《自己动手写cpu》实现一个支持基本的mips指令的cpu。我一开始把书上写的都实现了一遍,之后再看着官方要求的指令把不相关的删掉了,实际上可以只实现需要的部分。

具体针对比赛所需,我阅读了龙芯官方发的前几届参赛选手的经验指南,但很多写得很长,讲了很多专业术语,最开始看的时候晕头转向的。后来还是先根据官方的技术指南,先明确需求,需要实现什么,再针对性得根据这些看还需要实现什么,在哪些部分可以提高性能。

系统总体结构

微系统由cpu核心,SRAM控制器,UART控制器三大部分组成,如下图所示。SRAM内存作为存储元件,存储指令和数据,并通过SRAM控制器的接口与cpu核心交换数据。UART串口作为异步通信接口,是CPU与电脑进行通信的控制器/桥梁,cpu核心通过内置的UART控制器实现异步通信。

cpu总体架构

cpu核心采用顺序单发射五级流水线,各流水线模块关系如下图所示。五个模块分为取指、译码、运算、访存、回写。其中取指和访存阶段都由可能访问SRAM存储器。另设控制模块,在发生数据冲突时,使流水线停顿,避免结果异常。

cpu核心架构

技术栈

顺序单发射五级流水cpu

流水线分为取指、解码、运算、访存、回写五个阶段。

  • 取指:缓存当前指令地址,并从指令存储器中取回指令。
  • 解码:分段将指令切分、解码,提取操作数、立即数、操作码、寄存器编号等。获取寄存器的值。
  • 运算:执行各种算术运算,并根据实际执行的运算类型选择结果。
  • 访存:访问RAM,读写数据。串口的读写等效于特殊地址的内存读写。
  • 回写:将指令执行的最终结果写回寄存器堆中对应的寄存器中。

同时,由于乘法运算布线较长,造成频率提升的瓶颈,而涉及乘法运算的指令均不涉及访存。于是,将乘法运算单独提取出来成为一个模块,与运算模块+访存模块并行。

uart串口通信

通用异步收发器 UART(Universal Asynchronous Receiver/Transmitter),是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位地传输,在UART通讯协议中信号线上的状态位高电平代表’1’,低电平代表’0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低了成本,但传送速度较慢。

其中,串口传输的波特率可根据CPU核心的频率做相应的调整。数据流由10个数据位组成:1位起始位,8位有效数据位,1位停止位。

发送和接受模块的设计参考此教程

sram存储

采用官方提供的FPGA开发板上的SRAM存储器作为存储,指令和数据分开存储,均采用单周期访问。除了访存/取指部分同时访问指令存储器之外,其他情况均不会因访存而产生停顿。

虽然SRAM官方指南指定的访存所需的最大时间为12ns,即每个访存阶段(时长为一个CPU周期)的时长至少为12ns,这意味着在理论上,这种设计对应的CPU的最大主频可达83.3MHz。但在实际尝试中,由于FPGA开发板布局布线等因素,CPU的主频在60+时已经会产生访存乱码的现象。因此我设计的CPU的主频最高仅达63.34MHz,同校的不少个人赛的同学,在这个限制下,频率也只有60+MHz。

值得一提的是,在优化阶段我曾尝试多周期访存+cache,但仔细分析后发现,这种配置下如果要达到和单周期五级流水相似的性能,需要至少110+M的频率,且多周期访存产生的停顿意味着需要改变延迟槽判断的方式等等一系列细节逻辑的修改,80+M时就会因数据前递的较长连线而产生关键路径。最后权衡系统性能,系统复杂度(稳定度),以及时间分配(练习汇编算法),还是采用了单周期访存、无cache的访存方法。

基于华莱士树的乘法器。

本CPU采用华莱士树实现两周期乘法器,大大减少了乘法模块的资源消耗,并减少了因dsp乘法连线过长导致的关键路径。华莱士树的简单思想为:将乘法转化为许多个加数求和,每3个加数分为一组,压缩至2个加数,循环往复。

在这里插入图片描述

根据上图。乘法可转化为乘数的每一位与被乘数相乘,末端添0,相加。此时加法项的个数与乘数的位数相等。华莱士树将每三个分为一组,相加,保存和&进位(两个加数,对应图中每个CSA向下延申的两条线)。再把得到的结果作为新的加数,循环往复执行加法操作,得到最终结果(第6层)。

参赛作品亮点

采用wallace tree实现两周期乘法器,大大减少了乘法模块的资源消耗,并减少了因dsp乘法连线过长导致的关键路径。

单周期访问sram,在频率较低时极大得减少了因访存而导致的流水线停顿,大大提高了系统的ipc。

系统运行流畅,停顿概率很低,仅在乘法后RAW-1,访存取指同时访问imem两种情况下才会停顿。

参赛最终结果

比赛要求任务全部完成,实现了MIPS C3指令集总共39条指令,支持uart串口通信,sram访存。

性能测试结果为:

  • STREAM:用时0.099s
  • MATRIX:用时0.141s
  • CRYPTONIGHT:用时0.364s

总计0.604s。

决赛时在规定时间内完成了二分查找的汇编算法,并在自己设计的cpu上跑通。

备赛经验及建议

**备赛前期:**阅读《计算机组成与设计》,《计算机体系结构:量化研究方法》两本经典书籍学习所需的基本原理。阅读《自己动手写cpu》,并上手写代码,实现一个基本版的cpu。

**备赛冲刺阶段:**可以在初赛前一个半月左右着手开始优化系统,不建议把战线拉太长,不然中间阶段不知道做什么/迷失方向没人讨论的时候会很痛苦。优化前先仔细调研优化方法,及其在比赛任务上的优化效率。可以参考GitHub上之前参赛选手开源出的作品代码作为参考。不用各种优化方法兼顾,重点攻克对于评分任务提升较大,稳定性较高的方案。

**备赛后期:**初赛结束后还有两周左右的时间到决赛,不建议再修改cpu设计,因为时间很匆忙,不一定赶得出来一个稳定版,而且决赛任务不仅仅看重cpu性能。建议放松一两天后着力准备决赛的编程任务。决赛编程任务属于中等难度的算法题,但需要用汇编实现。参考准备路线:跟着LeetCode 101 这本算法书练习经典算法。 到c++容器那章前基本就够了,练习的编程语言任意,顺手就好,用高级语言就行,方便在leetcode上在线评测。之后可以再看看University of Alberta 的CMPUT229这门课的MIPS汇编教程 , 掌握高级语言流程结构和汇编语言转换的基本方法,用MIPS汇编实现几个经典的算法,如快排,二分等等,并在Mars和自己的cpu上依次验证。

**决赛技巧:**个人赛决赛仍然采用线上测评平台,由于比赛时间有限,同时在线人数较多,决赛时线上编译速度很慢,工程文件改动后重新编译至少需要20-30min,运行测试也需要排队5min左右。但仅仅修改汇编代码只会重新编译汇编代码,工程文件不再重新编译,只需1分钟左右就可在gitlab上编译完成,。因此强烈建议在决赛时不要修改内核,节省时间。同时,可以在决赛前在多个git分支上准备好多个不同频率的工程版本(比如60M稳定版用于测试汇编代码正确性,频率再高的版本用来降低时间刷分),汇编程序写好后可以分别写到这些分支上,就可以在短时间内得到多个在线编译通过的不同频率的提交文件,能够高效刷分测试。(我决赛时只准备了稳定版本的,后面时间比较紧张就没有再提高频率,有点遗憾。)

最后,十分感谢老师们给我们提供的良好的交流机会,督促我们不断优化性能,为我们提供了优越的备赛交流环境。也非常感谢一同参加比赛的各位大佬十分耐心回答我的问题以及在交流碰撞出的新思路!

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值