2023年全国大学生计算机系统能力大赛
编译系统设计赛技术方案
详情访问大赛技术平台:
https://compiler.educg.net
一、评价方式的基本说明 第1条 大赛要求各参赛队综合运用各种知识(包括但不局限于编译技术、操作系统、计算机体系结构等),构思并实现一个综合性的编译系统,以展示面向特定目标平台的编译器构造与编译优化的能力。
第2条 大赛鼓励各参赛队充分了解目标语言及目标硬件平台(CPU指令集、 Cache、各类并行加速能力等)特点,使编译出的目标码能够尽可能利用目标硬件平台能力以提高目标码的运行效率。
第3条 为展示参赛队的设计水平,增加竞赛的对抗性,进入决赛的参赛队还需针对目标语言或目标平台的变化,现场调整编译系统。
第4条 除本技术方案特别要求、规定和禁止事项外,各参赛队可自行决定编译器体系结构、前端与后端设计、代码优化等细节。
二、初赛评分标准 第5条 比赛内容。开发支持特定语言、面向ARM硬件平台或RISC-V硬件平台的综合性编译系统。
1. 基于C、C++、Java或Rust语言开发,能够在Ubuntu18.04(64位)操作系统的x86 评测服务器上编译。
2. ARM硬件平台:能够将符合自定义程序设计语言SysY2022的测试程序编译为 ARM 汇编语言程序(32位,ARMv7),并通过汇编链接后在Raspberry Pi OS(Raspbian GNU/Linux 10)操作系统的树莓派(Raspberry 4B)设备上运行。
3. RISC-V硬件平台:能够将符合自定义程序设计语言SysY2022的测试程序编译为 RISC-V汇编语言程序(64位,RISC-V),并通过汇编链接后在64位Debian64 GNU/Linux bookworm/sid操作系统的昉·星光2(VisionFive 2)设备上运行。
第6条 功能测试。参赛队所开发的编译器应能够编译大赛提供的 SysY2022语言编写的基准测试程序。
1. 具有词法分析、语法分析、语义分析、目标代码生成与优化等能力, 并支持编译错误的准确识别、定位与错误处理功能。
2. 对于正确编译通过的 SysY2022 基准测试程序,应生成符合要求的 汇编文件。
功能测试要求基于大赛给出的汇编器、链接器等工具,用自行研制的编译器为每个基准测试程序生成对应的二进制可执行文件,并在安装有Linux操作系统的指定硬件平台上加载并运行;根据给定的输入数据,比对输出结果,计算得分。若未能将每个基准测试程序正确编译出可执行二进制文件,或所有测试点都未通过计0分;所有测试点都通过计100分;部分测试点通过的,按所通过测试点的比例计算功能测试得分。参赛队的最终功能测试成绩为每个基准测试程序功能测试成绩的平均值。
第7条 性能测试。在通过功能测试的前提下,记录每个基准测试在目标硬件平台上的执行时间作为评价依据。每个基准测试程序按照执行时间最小者的性能测试分值被定义为 100 分,其余各参赛队依据在该基准测试程序上的运行时间与最小运行时间的比值除 100 计算参赛队在该基准测试程序上的性能得分(性能得分=100 /(运行时间/最短运行时间))。性能测试分值越大越好。参赛队的最终性能测试成绩为每个基准测试程序的性能成绩的平均值。
第8条 初赛总成绩100分,各分项成绩权重如下:
1. 编译器的功能测试成绩:50%
2. 基准测试程序的性能测试成绩:50%
三、决赛评分标准 第9条 决赛阶段的任务在初赛提交的最终版本编译系统上完成。
第10条 比赛内容。大赛组委会公布新的基准测试程序。参赛队根据变化,在限定时间内自行修改编译系统源代码,提交给竞赛系统。生成的编译系统需要以新给出的基准测试程序集作为输入,编译输出对应的汇编程序,并在指定的目标硬件平台上完成性能评测。
第11条 功能测试与性能测试方法与初赛一致。参赛队团队协作及现场答辩的评 分标准在决赛阶段另行公布。
第12条 决赛总成绩 100 分,各分项成绩权重如下:
1. 编译器的功能测试成绩:20%
2. 基准测试程序的性能测试成绩:70%
3. 参赛队团队协作及现场答辩:10%
四、参赛作品提交 第13条 各参赛选手初赛阶段需要在大赛的竞赛平台提交完整的设计内容。
1. 综合编译系统设计的完整工程文件(必须包含全部C/C++源代码、Java 源代码或Rust源代码),并在竞赛平台中至少有一次完整通过性能测试的记录和有效成绩。
2. 编译系统设计的分析设计文档。
第14条 如果需要使用第三方IP或者借鉴他人的部分源码,必须在设计文档和源 代码的头部予以明确说明。
第15条 参赛队需从头构造编译系统,允许基于 Lex、YACC、Bison、JavaCC、 JavaCUP、ANTLR等通用词法、语法解析器生成工具帮助生成部分代码, 但不得直接使用GCC、LLVM等现有、开源编译器与框架的源代码及裁剪。
第16条 参赛队必须严守学术诚信。一经发现代码抄袭或技术抄袭等学术不端行 为,代码重复率在 50%以上,取消参赛队的参赛资格。
五、等级认定标准 第17条 编译系统设计赛根据参赛队在初赛和决赛阶段最后提交的有效作品进行等级评定,并发放编译系统设计能力等级证书。等级认定共分为一级、二级、三级、入门级等共四级,对应的评定标准如下:
1. 一级:熟悉编译器结构和构建过程,熟练掌握绝大部分基本优化技巧,在给定测例上优化能力达到或超过与GCC编译器的“O2”优化相当的水平。
标准:必过功能用例全部通过,且性能分 ≥ 90分。
2. 二级:能够完成编译器设计及实现,功能正确,熟悉编译器结构和构建过程,具有一定的编译优化能力。
标准:必过功能用例全部通过,且90 > 性能分 ≥ 40分。
3. 三级:熟悉编译器结构和构建过程,能够开发实现功能基本正确的编译器。
标准:未达到二级标准,但是功能分≥60分。
4. 入门级:基本熟悉编译器结构和构建过程,能够开发实现具有一定功能的编译器。
标准:未达到三级标准,编译通过,能通过不少于5个功能用例。
第18条 功能得分。满分100分,按初赛阶段给出的功能测试用例计算,每通过1%个功能测试用例,得1 分。
第19条 性能得分。满分100分,基于决赛阶段给出的性能测试用例计算,以GCC 7.5.0版本的O2优化运行时间为基准。参赛队在单个性能用例的得分为:100 * (GCC编译用例运行时间/ 参赛队用例运行时间)。性能总分为所用性能用例得分的几何平均值。
第20条 等级认定中各个等级划分的功能与性能分数线标准,待当年决赛结束后公布,并制作发放等级认定证书。
六、竞赛平台与测试程序 第21条 大赛提供的竞赛平台和测试程序包括:
1. 代码托管平台,支持各参赛队的群体协作与版本控制。
2. 竞赛评测系统,根据参赛队的申请从代码托管平台获取指定版本, 生成编译系统,并加载基准测试程序,自动进行功能及性能测试。
3. 基于 SysY2022 语言的基准测试程序(包括 SysY2022 源码及评测点 数据),用于在ARM、RISC-V等目标硬件平台上对参赛队编译器生成的可执行文件进行性能评测。
七、软硬件系统规范 第22条 SysY2022 语言是用于本次竞赛的高级程序设计语言,是 C 语言基本语 法的子集,支持全局变量声明、自定义函数、int类型和元素为int类型的多维数组类型、float类型和元素为float类型的多维数组类型,支持赋值、表达式、语句块、常见控制流结构,表达式支持基本算术运算、关系运算和逻辑运算,优先级与结合性和C语言规范保持一致。
第23条 决赛阶段的语言语法、目标硬件平台特性、基准测试集调整,由大赛组 委会在决赛阶段发布。
第24条 大赛指定的编译环境用于编译参赛队提交的编译系统源码,参数如下:
1.CPU:Intel x86,24 物理核心、开启超线程。
2.内存:128GB LPDDR4-3200 SDRAM。
3.Docker 容器操作系统:Ubuntu 18.04。
4.C/C++编译器:LLVM/Clang-10.0.0,编译选项:
C 语言:clang --std=c11 -O2 -lm
C++语言:clang++ --s td=c+ + 17 -02 -lm
5.Java 平台与编译器:Oracle Java SE 17,主类名与编译选项:
主类名:Compiler.java (主类不带包名)
编译选项:javac -encoding utf-8
6.Rust平台与编译器:rustc 1.65.0
编译选项:rustc -O2
第25条 大赛指定的ARM架构目标程序性能基准测试实验设备为Raspberry Pi 4 Model B Rev 1.1,主要参数如下:
1.CPU:Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64 位 SoC,主频 1.5GHz。
2.内存:2GB LPDDR4-3200 SDRAM。
3.GPU:500Mhz VideoCore VI。
4.操作系统:32 位,Raspbian GNU/Linux 10 (buster),基于 Debian。
5.汇编和链接器:gcc version 7.5.0 (Ubuntu/Linaro 7.5.03ubuntu1〜18.04),编译与链接命令:gcc -march=armv7 (用于汇编和链接参赛队编译系统输出的汇编代码)
6. 编译生成的学生编译器统一命名为compiler,参数如下:
功能测试:compiler testcase.sysy -S -o testcase.s
性能测试:compiler testcase.sysy -S -o testcase.s -O1
第26条 大赛指定的RISC-V架构目标程序性能基准测试实验设备为昉·星光2(VisionFive 2),主要参数如下:
1.CPU:RV64 U74,4核心,2M L2cache,1.5GHZ@28nm。
2.内存:2GB LPDDR4。
3.加速计算:IMG 3D GPU(支持OpenCL、OpenGL、Vulkan等)、编解码器(H264/265 Codec、Gstreamer、ffmpeg、OpenMAX、V4L2、ALS等软件)。
4.操作系统:64位Debian GNU/Linux bookworm/sid。
5.汇编和链接器:gcc version 12.2.0 (Debian 12.2.0-14), 编译与链接命令:gcc -march=rv64gc(用于汇编和链接参赛队编译系统输出的汇编代码)
6.编译生成的学生编译器统一命名为compiler,参数如下,参数如下:
功能测试:compiler testcase.sysy -S -o testcase.s
性能测试:compiler testcase.sysy -S -o testcase.s -O1
八、大赛网站 第27条 编译系统设计赛技术平台网址:https://compiler.educg.net
第28条 大赛网站提供多种软件开发工具及设计资料,包括但不限于下列内容:
1.SysY2022程序设计语言规范、文法及说明。
2.Raspberry 4B硬件技术规范。
3.VisionFive 2硬件技术规范。
4.竞赛平台(代码托管平台、竞赛测试系统)使用文档。
5.性能基准测试程序及其文档。
6.参赛队远程调试及本地调试指南。
2023年全国大学生计算机系统能力大赛
编译系统设计赛技术方案
详情访问大赛技术平台:
https://compiler.educg.net
一、评价方式的基本说明第1条 大赛要求各参赛队综合运用各种知识(包括但不局限于编译技术、操作系统、计算机体系结构等),构思并实现一个综合性的编译系统,以展示面向特定目标平台的编译器构造与编译优化的能力。
第2条 大赛鼓励各参赛队充分了解目标语言及目标硬件平台(CPU指令集、 Cache、各类并行加速能力等)特点,使编译出的目标码能够尽可能利用目标硬件平台能力以提高目标码的运行效率。
第3条 为展示参赛队的设计水平,增加竞赛的对抗性,进入决赛的参赛队还需针对目标语言或目标平台的变化,现场调整编译系统。
第4条 除本技术方案特别要求、规定和禁止事项外,各参赛队可自行决定编译器体系结构、前端与后端设计、代码优化等细节。
二、初赛评分标准第5条 比赛内容。开发支持特定语言、面向ARM硬件平台或RISC-V硬件平台的综合性编译系统。
1. 基于C、C++、Java或Rust语言开发,能够在Ubuntu18.04(64位)操作系统的x86 评测服务器上编译。
2. ARM硬件平台:能够将符合自定义程序设计语言SysY2022的测试程序编译为 ARM 汇编语言程序(32位,ARMv7),并通过汇编链接后在Raspberry Pi OS(Raspbian GNU/Linux 10)操作系统的树莓派(Raspberry 4B)设备上运行。
3. RISC-V硬件平台:能够将符合自定义程序设计语言SysY2022的测试程序编译为 RISC-V汇编语言程序(64位,RISC-V),并通过汇编链接后在64位Debian64 GNU/Linux bookworm/sid操作系统的昉·星光2(VisionFive 2)设备上运行。
第6条 功能测试。参赛队所开发的编译器应能够编译大赛提供的 SysY2022语言编写的基准测试程序。
1. 具有词法分析、语法分析、语义分析、目标代码生成与优化等能力, 并支持编译错误的准确识别、定位与错误处理功能。
2. 对于正确编译通过的 SysY2022 基准测试程序,应生成符合要求的 汇编文件。
功能测试要求基于大赛给出的汇编器、链接器等工具,用自行研制的编译器为每个基准测试程序生成对应的二进制可执行文件,并在安装有Linux操作系统的指定硬件平台上加载并运行;根据给定的输入数据,比对输出结果,计算得分。若未能将每个基准测试程序正确编译出可执行二进制文件,或所有测试点都未通过计0分;所有测试点都通过计100分;部分测试点通过的,按所通过测试点的比例计算功能测试得分。参赛队的最终功能测试成绩为每个基准测试程序功能测试成绩的平均值。
第7条 性能测试。在通过功能测试的前提下,记录每个基准测试在目标硬件平台上的执行时间作为评价依据。每个基准测试程序按照执行时间最小者的性能测试分值被定义为 100 分,其余各参赛队依据在该基准测试程序上的运行时间与最小运行时间的比值除 100 计算参赛队在该基准测试程序上的性能得分(性能得分=100 /(运行时间/最短运行时间))。性能测试分值越大越好。参赛队的最终性能测试成绩为每个基准测试程序的性能成绩的平均值。
第8条 初赛总成绩100分,各分项成绩权重如下:
1. 编译器的功能测试成绩:50%
2. 基准测试程序的性能测试成绩:50%
三、决赛评分标准第9条 决赛阶段的任务在初赛提交的最终版本编译系统上完成。
第10条 比赛内容。大赛组委会公布新的基准测试程序。参赛队根据变化,在限定时间内自行修改编译系统源代码,提交给竞赛系统。生成的编译系统需要以新给出的基准测试程序集作为输入,编译输出对应的汇编程序,并在指定的目标硬件平台上完成性能评测。第11条 功能测试与性能测试方法与初赛一致。参赛队团队协作及现场答辩的评 分标准在决赛阶段另行公布。
第12条 决赛总成绩 100 分,各分项成绩权重如下:
1. 编译器的功能测试成绩:20%
2. 基准测试程序的性能测试成绩:70%
3. 参赛队团队协作及现场答辩:10%
四、参赛作品提交第13条 各参赛选手初赛阶段需要在大赛的竞赛平台提交完整的设计内容。
1. 综合编译系统设计的完整工程文件(必须包含全部C/C++源代码、Java 源代码或Rust源代码),并在竞赛平台中至少有一次完整通过性能测试的记录和有效成绩。
2. 编译系统设计的分析设计文档。
第14条 如果需要使用第三方IP或者借鉴他人的部分源码,必须在设计文档和源 代码的头部予以明确说明。
第15条 参赛队需从头构造编译系统,允许基于 Lex、YACC、Bison、JavaCC、 JavaCUP、ANTLR等通用词法、语法解析器生成工具帮助生成部分代码, 但不得直接使用GCC、LLVM等现有、开源编译器与框架的源代码及裁剪。
第16条 参赛队必须严守学术诚信。一经发现代码抄袭或技术抄袭等学术不端行 为,代码重复率在 50%以上,取消参赛队的参赛资格。
五、等级认定标准第17条 编译系统设计赛根据参赛队在初赛和决赛阶段最后提交的有效作品进行等级评定,并发放编译系统设计能力等级证书。等级认定共分为一级、二级、三级、入门级等共四级,对应的评定标准如下:
1. 一级:熟悉编译器结构和构建过程,熟练掌握绝大部分基本优化技巧,在给定测例上优化能力达到或超过与GCC编译器的“O2”优化相当的水平。
标准:必过功能用例全部通过,且性能分 ≥ 90分。
2. 二级:能够完成编译器设计及实现,功能正确,熟悉编译器结构和构建过程,具有一定的编译优化能力。
标准:必过功能用例全部通过,且90 > 性能分 ≥ 40分。
3. 三级:熟悉编译器结构和构建过程,能够开发实现功能基本正确的编译器。
标准:未达到二级标准,但是功能分≥60分。
4. 入门级:基本熟悉编译器结构和构建过程,能够开发实现具有一定功能的编译器。
标准:未达到三级标准,编译通过,能通过不少于5个功能用例。
第18条 功能得分。满分100分,按初赛阶段给出的功能测试用例计算,每通过1%个功能测试用例,得1 分。
第19条 性能得分。满分100分,基于决赛阶段给出的性能测试用例计算,以GCC 7.5.0版本的O2优化运行时间为基准。参赛队在单个性能用例的得分为:100 * (GCC编译用例运行时间/ 参赛队用例运行时间)。性能总分为所用性能用例得分的几何平均值。
第20条 等级认定中各个等级划分的功能与性能分数线标准,待当年决赛结束后公布,并制作发放等级认定证书。
六、竞赛平台与测试程序第21条 大赛提供的竞赛平台和测试程序包括:
1. 代码托管平台,支持各参赛队的群体协作与版本控制。
2. 竞赛评测系统,根据参赛队的申请从代码托管平台获取指定版本, 生成编译系统,并加载基准测试程序,自动进行功能及性能测试。
3. 基于 SysY2022 语言的基准测试程序(包括 SysY2022 源码及评测点 数据),用于在ARM、RISC-V等目标硬件平台上对参赛队编译器生成的可执行文件进行性能评测。
七、软硬件系统规范第22条 SysY2022 语言是用于本次竞赛的高级程序设计语言,是 C 语言基本语 法的子集,支持全局变量声明、自定义函数、int类型和元素为int类型的多维数组类型、float类型和元素为float类型的多维数组类型,支持赋值、表达式、语句块、常见控制流结构,表达式支持基本算术运算、关系运算和逻辑运算,优先级与结合性和C语言规范保持一致。
第23条 决赛阶段的语言语法、目标硬件平台特性、基准测试集调整,由大赛组 委会在决赛阶段发布。
第24条 大赛指定的编译环境用于编译参赛队提交的编译系统源码,参数如下:
1.CPU:Intel x86,24 物理核心、开启超线程。
2.内存:128GB LPDDR4-3200 SDRAM。
3.Docker 容器操作系统:Ubuntu 18.04。
4.C/C++编译器:LLVM/Clang-10.0.0,编译选项:
C 语言:clang --std=c11 -O2 -lm
C++语言:clang++ --s td=c+ + 17 -02 -lm
5.Java 平台与编译器:Oracle Java SE 17,主类名与编译选项:
主类名:Compiler.java (主类不带包名)
编译选项:javac -encoding utf-8
6.Rust平台与编译器:rustc 1.65.0
编译选项:rustc -O2
第25条 大赛指定的ARM架构目标程序性能基准测试实验设备为Raspberry Pi 4 Model B Rev 1.1,主要参数如下:
1.CPU:Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64 位 SoC,主频 1.5GHz。
2.内存:2GB LPDDR4-3200 SDRAM。
3.GPU:500Mhz VideoCore VI。
4.操作系统:32 位,Raspbian GNU/Linux 10 (buster),基于 Debian。
5.汇编和链接器:gcc version 7.5.0 (Ubuntu/Linaro 7.5.03ubuntu1〜18.04),编译与链接命令:gcc -march=armv7 (用于汇编和链接参赛队编译系统输出的汇编代码)
6. 编译生成的学生编译器统一命名为compiler,参数如下:
功能测试:compiler testcase.sysy -S -o testcase.s
性能测试:compiler testcase.sysy -S -o testcase.s -O1
第26条 大赛指定的RISC-V架构目标程序性能基准测试实验设备为昉·星光2(VisionFive 2),主要参数如下:
1.CPU:RV64 U74,4核心,2M L2cache,1.5GHZ@28nm。
2.内存:2GB LPDDR4。
3.加速计算:IMG 3D GPU(支持OpenCL、OpenGL、Vulkan等)、编解码器(H264/265 Codec、Gstreamer、ffmpeg、OpenMAX、V4L2、ALS等软件)。
4.操作系统:64位Debian GNU/Linux bookworm/sid。
5.汇编和链接器:gcc version 12.2.0 (Debian 12.2.0-14), 编译与链接命令:gcc -march=rv64gc(用于汇编和链接参赛队编译系统输出的汇编代码)
6.编译生成的学生编译器统一命名为compiler,参数如下,参数如下:
功能测试:compiler testcase.sysy -S -o testcase.s
性能测试:compiler testcase.sysy -S -o testcase.s -O1
八、大赛网站第27条 编译系统设计赛技术平台网址:https://compiler.educg.net
第28条 大赛网站提供多种软件开发工具及设计资料,包括但不限于下列内容:
1.SysY2022程序设计语言规范、文法及说明。
2.Raspberry 4B硬件技术规范。
3.VisionFive 2硬件技术规范。
4.竞赛平台(代码托管平台、竞赛测试系统)使用文档。
5.性能基准测试程序及其文档。
6.参赛队远程调试及本地调试指南。