导语
本文整理自北京航空航天大学胡春明教授在2023全国大学生计算机系统能力大赛颁奖典礼上对编译系统设计赛(华为毕昇杯)的总结报告。报告对2023年编译系统设计赛的指导思想、赛程安排、报名、初赛、决赛的情况进行了梳理,并对今年竞赛的变化和亮点做了分析。
各位领导、老师、同学,大家好!非常高兴代表编译系统设计赛技术委员会向各位汇报今年编译赛道的情况。
今天参加颁奖典礼很感慨。一个感慨是看到同学们走上领奖台,这是你们的高光时刻,是对大家勤奋努力参与竞赛的回报,希望这样的经历能让你们更加坚定地在系统软件、系统能力的方向上继续努力;另一个感慨是参赛的同学中还是男同学居多,希望未来能有更多的女同学也能够加入进来,关注大赛、参与大赛。
一、2023年比赛的指导思想
从高校开课的角度,相比于操作系统和数据库课程,编译课程的开课高校数量明显少些,教学要求也参差不齐,一些头部高校在开设编译课时限于课时,多把重心放在编译的前端,也就是语言的翻译上。但目前从行业的发展情况看,前端的词法分析和语法分析自动化已经做得比较好了,反而编译的中后端更值得关注。例如中端的体系结构无关优化,以及后端结合体系结构的特点的优化,这些优化对于提升程序在指定后端平台的运行效率非常重要。所以,我们4年前在启动编译设计赛的时候,一个重要的初衷就是希望通过比赛,让更多老师和同学关注整个编译系统的设计,从只关注前端转变到前后端并重。基于这个理念,我们设计的比赛任务是要求参赛队针对一个目标语言和给定的后端硬件去做完整的编译器设计。前几年都是基于ARM架构的树莓派作为后端指定硬件,今年的比赛新增了RISC-V后端,同学们可从ARM和RISC-V两个后端进行选择,完成比赛。这是今年编译竞赛的一个新变化。
为了吸引更多的队伍参赛,我们在赛制上也做了一些设计调整。例如,大家熟悉的外卡参赛机制,即来自同一学校的参赛队中,只能有2支成绩最好的队伍进入决赛,这确保决赛参赛高校的多样性;与此同时,我们对于这个学校排名第3名及以后得其他成绩优秀的参赛队伍,在学生自愿的前提下,允许通过外卡方式继续参加比赛,不占用正赛决赛的获奖名额,这也兼顾了学生的参赛意愿和积极性。
在今年的比赛中,我们希望通过赛题命题方向的调整来引导同学们关注产业发展中的实际问题,特别是性能优化问题。今年,我们在设计赛基础上增加了挑战赛道,就是要解决代码规模(code size)的优化问题。通常我们在教学中强调性能优化多一些,代码规模的优化是很多老师和同学不太关注的,但这一优化在嵌入式等场景下有重要的产业价值和现实意义,所以,我们希望通过赛题的调整来引导大家关注这个实际的问题。
在大赛的同时,我们还建立了编译系统设计能力的等级认定机制。我们希望通过这个比赛,给出一把客观的尺子,帮助衡量每个参加比赛的同学在编译系统设计上的能力定位。这个工作是从去年开始的,并且已经对前几届所有参赛同学都做了能力认定。同学们参加比赛,经过功能正确性、与GCC指定版本的性能成绩比较以及正式答辩和专家质询后,都会拿到一张能力等级证书。这个证书体现了参赛同学在整个比赛过程中反映出的编译系统设计能力的定位。
二、报名情况
对比去年,今年编译系统设计赛的报名数量略有增长。但相比操作系统设计和数据库管理系统设计赛道,编译系统设计赛的参赛队总数略少,这也反映了目前高校中编译课程开设的情况。
2023年共有160支队伍报名参加编译系统设计赛,其中有69支队伍取得有效成绩,最终进入决赛的有54支队伍(涉及23所高校),外加12支外卡参赛队伍。编译竞赛举办四年来,累计有478支队伍报名参加比赛。与往年相比,今年取得有效成绩队伍的比例略有提升。希望未来有更大比例的参赛队伍能够完成比赛,做出功能可用的编译器。
今年外卡参赛的队伍是在线上完成整个决赛阶段的参赛和答辩,他们没能来到决赛现场,但工作也做得非常好。
特别的,今年新增的代码规模优化的挑战赛道共有16支队伍报名参赛。因为是第一年设置,大家对代码规模优化还存在理解和认识上的门槛,所以最后只有4支队完成初赛任务进入了决赛。这4支队伍在答辩过程中也充分与评审专家进行了交流,接受了专家对作品的询问,顺利完成了答辩。
三、评测过程
编译系统设计赛的评测主要是通过线上的评测系统来完成,将客观记录的编译器功能和性能表现作为评分的主要依据。几年来,我们一直在不断完善功能和性能测试用例。目前,比赛的目标语言SysY2022在语法能力上已经拓展到了支持整型、浮点型及多维数组,在性能测试方面,每一年都会准备8-10组新的性能测试用例用于竞赛的评测。不断更新测例,主要是希望引导同学们理解编译系统“正确第一,性能第二”的价值观,特别是避免针对个别测例的过度优化。我们希望通过不断补充和完善新的隐藏测例,来引导大家按照编译的价值观来设计编译器。
今年在决赛阶段共20组测例中我们替换了12组测例,这20组测例中有15组是整型、5组是浮点型。其中8组是新开发的性能测例。
从2020年到现在,比赛(包括决赛)中的一些测例是保持不变的,对于其中一些测例,最优秀的队伍做到了数万倍、数十万倍的速度优化;针对同一个测例,不同年度的参赛队对它的优化效果不断提升。从这些测例性能数据的对比中,我们可以看到每一年参赛队整体实力、优化能力在持续提升。
四、今年比赛的一些变化
今年是首次线下比赛和答辩,在决赛过程中充分展示出了各个参赛队对编译技术的理解、实现的编译器架构和优化技巧。
从赛题上,code size优化第一次亮相,有4支队伍较好地完成了任务。这是一个好的尝试,起到了引导教学的目的。因为已经有同学开始关注code size优化的具体情况,这个内容是以往的本科教学里不太涉及的。
综合四年的比赛情况来看,赛队能力的提升是很明显的。从答辩情况来看,绝大多数参赛队都已经采用了前中后三端的结构,并且已经将SSA、类LLVM的IR作为中间表达引入了编译器的设计。因为今年的赛题有两个后端,部分参赛队在编译器架构上已经考虑了多后端的设计。绝大多数赛队的作品也覆盖了丰富的中间代码和体系结构的优化。优化的水平稳中有升也实现了举办这个比赛的初衷,实现了引导教学从偏重前端向前后端并重转变。
在今年的参赛队里,相当多的参赛队是由没学过编译技术课程的低年级本科生组成的(有很多二年级本科生参赛)。还有一些同学所在的学校没有开设编译课程,出于个人兴趣自学了编译相关的知识并参加比赛。虽然有些队伍的成绩不够理想,但是同学们能够坚持完赛,并在比赛过程中自学编译的知识,本身就是很大的成功。通过竞赛边学边练,不仅可以为将来再次参赛奠定基础,也可以为进一步在编译领域进行深入研究、开展其他相关工作奠定基础。
当然,今年的比赛仍有一些不足。
第一,技术方案趋于保守和程序化,这导致参赛队不太敢或者不太愿意做高风险的优化,更愿意参考前几届选手的经验,把精力放在确信能够拿分的测例上。这就造成潜在的天花板效应,头部赛队能用的招数在减少,后面的赛队又很容易利用之前赛队的经验,最终所有参赛队的差别不断缩小。
第二,无论是ARM和赛道还是RISC-V赛道,参赛队对目标平台特点的挖掘和探索明显少于往届。比如,今年探索多线程、向量化、过程间优化的队伍数量上明显偏少。
第三,从今年的竞赛来看,同学们在做一些技术决策的时候,分析、判断的工作不够充分,决策的依据主要是看到别人都这么做。在这方面,还有很多工作要做,包括测例的牵引、命题的角度等等。
五、结语
编译设计赛走过了四年,一直努力地引导这种从前端到前后端并重的转变。很多参赛队在优化水平上,超过GCC “-O2”水平,甚至接近O3。这是非常令人欣喜的成绩!
通过code size赛题的牵引让同学们关注实际问题的解决,逐步提升编译优化水平,从结果看,这个目的基本也达到了。
编译设计赛今年实现了线下办赛。线下活动的体验更特别,同学们之间、老师和同学之间的沟通也更加全面、更加充分。
最后,再次祝贺获奖参赛队和指导教师!感谢全体参与赛事的同学和指导教师对大赛的支持!感谢大赛技术委员会全体成员的辛苦工作!感谢华为公司、机械工业出版社、中山大学、希冀平台的全程协助!感谢教育部编译原理课程虚拟教研室对竞赛的指导!
引导、提升、突破是编译大赛一直追求的目标,未来我们将沿着这个目标持续前进!