【开源之夏专访】在项目中实践理论——陈国凯

时间:2022-12-20 10:16:47

夏天渐行渐远,秋天匆匆晃过,开源之夏2022在洁白如新的冬天如期收获了350 位同学的结项成果,这些同学也在开源软件社区留下了自己的足迹,感谢各位同学的支持。今年我们依旧按照最佳质量奖、突出贡献奖、最快进步奖、最具潜力奖四个角度评选出了具有代表性的20位优秀学生。

本次采访,我们邀请了最具潜力奖获奖者陈国凯,分享他的经验。

 

【开源之夏专访】在项目中实践理论——陈国凯

姓名:陈国凯

性别:男

年龄:23

学校:中国科学院大学/中科院计算所

兴趣爱好:探索并参与开源项目,红警2

 

--自我介绍--

1、首先请简单介绍一下自己。

我是陈国凯,本科毕业于中国科学院大学,毕业后留在本校于中科院计算所继续读研,研究方向是计算机体系结构。我目前的主要研究内容是超标量乱序处理器前端(取指与分支预测)设计和自定义指令集扩展。这方面的知识积累也有效帮助我实现了本年度的开源之夏项目。

2、最开始是在哪里了解开源的,是什么让你决定参与开源?

如果说接触是指使用开源软件,我在初中时尝试在自己的电脑上安装 Linux 操作系统,以体验不同于 Windows 的另一种生态,是对开源的第一次尝试。在本科期间,我参与了学校的开源社团,也随之阅读了开源领域的一些经典文献,对开源有了更深刻的理解。在学习生活中,我使用了LaTeX、GCC、Clang等大量开源软件,伴随着学习的深入,我逐渐有能力读懂开源项目并解决一些项目的小问题,随着解决问题的逐步增加,我也自然融入到了开源活动中。

3、我们了解到,目前你在担任国科大开源协会(OpenCAS)副会长,可以介绍一下这个组织吗?

国科大开源协会是一个开源领域的社团,主要为国科大的同学们提供一个开源相关话题的讨论平台,考虑到国科大各位同学广泛的地理分布与当前形势,目前主要在线上活动。

4、你的研究和参加的活动很多和RISC-V有关,还参加过UCB的访学,是哪些原因让你对RISC-V“情有独钟”,给大家安利一下吧。

RISC-V是一个开源精简指令集架构,它吸取了以往各RISC架构设计的经验教训,在标准指令集中去除了诸如分支延迟槽、条件执行等不利于现代处理器设计的特性;引入了模块化设计,在最小仅几十条指令的基础指令集外提供了丰富的标准指令集扩展来满足各领域的特定需要,还为非标准的自定义指令集预留了编码空间;其宽松的指令集授权降低了科研及产业应用的门槛,也催生出了一系列开源的硬件实现。此外,RISC-V架构的软件适配是难得的实践新架构新算法的试验田。

 

--关于开源之夏2022--

5、请简单介绍一下你在开源之夏2022中的项目。

本次我参与的项目是为 RISC-V 架构优化 Kprobe。Kprobe 是 Linux 内核提供的一种插桩机制,允许使用者在内核代码内注册断点处理函数,当内核自身执行到对应位置,相关处理函数就会得到通知以统计信息或做出修改。Kprobe 的优化则是采用分支(跳转)指令替代断点指令来实现执行到断点位置的执行流劫持。我对该机制在RISC-V架构上可能的各种实现方案进行了较为详尽评估并从中选择了分析指令流寻找隐藏空闲寄存器的方法实现优化。截至目前,这一优化目标已经达成,在带有相关机制的 RISC-V 版 Linux 内核上可以使用优化的 Kprobe 加速执行。

6、之前有参加过开源之夏系列活动吗,每次参加的感受和收获有什么不同?

第一次参与开源之夏的主要感受是成功挑战了自己的预期,完成了一件之前没有很大把握做成的任务。第二次作为 Mentor 参与开源活动,让我认识了更多开源社区的小伙伴,也极大程度提升了开源项目的完成度。而今年再次以学生申请者身份参加,选择了一个相对第一次参与难度更大的项目,让我的知识储备得到了进一步丰富,也从不同于平时硬件开发的角度实践了学习过的学科理论。

7、在项目中遇到最印象深刻的问题是什么?如何解决的?有什么收获吗?

在最初的实现中,我并未充分考虑到多处理器场景下的缓存一致性问题,误认为某个替换函数能够保证多核场景下的缓存一致性,实际在替换内核代码仅清空了当前正在执行的处理器核心的指令缓存。这导致这一实现仅能在单核场景下可靠工作而在多核场景下时常出错并导致内核崩溃。为解决这一问题,我分析了可能出现的并发场景并深入阅读代码替换所用的函数细节实现,发现其并未处理多核场景。最终,我参考已有的仅支持替换4字节的多核替换代码实现了支持更大范围数据替换的多核替换代码。这一探索过程让我对多处理器缓存同步机制有了更加深入的认识。

 

--关于开源和学习--

8、目前有加入到开源社区吗,你认为一个合格的开源社区需要有哪些特征?

目前我主要活跃在香山开源社区,当然除此之外我也会因遇到的各项问题或个人兴趣而参与其他开源社区的活动。我认为一个合格的开源社区需要有活跃并得到一定程度关注的开源项目,需要有开放的讨论与反馈平台,社区外开发者应当能够相对简单地融入项目开发,最好能有一份完善的文档供使用及开发入门。

9、看到你在高中就深度学习了编程,参加过NOIP并获得一等奖,可以分享你的学习技巧吗?

学习是自己的事。编程/算法/开源类的知识,通常需要自己主动查找学习资料并寻找实践场景。而至少在初学阶段,遇到的大部分问题都会是前人经历并解决过的,要善于利用搜索引擎查找前人的探索记录。如果这一特定领域有经典的教科书,也可以从教科书出发学习以避免点歪技能树,但要切记实践是检验学习效果的金标准,学习的知识最终要落实到实践。

10、关于编程语言,你目前了解哪些,如果给同学们推荐的话,你有什么建议吗?

目前我主要使用的编程语言是Chisel(Scala)和C,前者主要应用于香山处理器的硬件开发,后者主要用于各种基础软件(bootloader、内核等)开发。此外,由于平时科研需要,我还会接触一些DSL,比如Gem 5模拟器使用的译码语言、Makefile等。在各种开源项目开发过程中有很大概率接触到各种语言,其中很可能出现之前未接触到的语言。我的观点是学习编程的重点在于学习背后的编程思想与设计范式,在用一门编程语言完成入门后,学习其他语言是一个非常自然的过程。

11、RISC-V是否是你未来计划深耕的领域,你对RISC-V之后的发展有哪些期待?

是,不管是香山开源处理器还是本次开源之夏参与的Kprobe优化项目,我比较深入参与的各项目都是围绕RISC-V开源指令集的。得益于RISC-V的开源可扩展特性,我期待RISC-V在从嵌入式到桌面再到高性能计算的各领域中通过各种灵活的指令集组合解决领域特定问题,得到广泛应用。