本文作者:IBM中国编译器团队罗雄虎
感谢并欢迎投稿????
9月12号到15号,一年一度的GNU开发者大会在加拿大蒙特利尔的魁北克国家图书馆隆重举行。做为一个才参与GCC开发很短时间的新人,就可以得到这个好机会,既能与我司内部在GCC上耕耘几十年了的资深工程师们进行面对面的交流,也能认识很多来自Red Hat, SUSE等社区里的maintainer/reviewer,所以在出发前两个月,我就一直在准备这三天的行程了,特别期待在各类讲座及分享会中可以深入了解GCC的发展现状,并且听听大佬们对未来的规划。
GCC是名副其实的一个宝刀未老的项目,比同样著名的Linux Kernel诞生还早。这次会议的组织者是EfficiOS和Embecosm这两家公司,赞助商则有AdaCore, Mentor, IBM, ARM, Intel, Red Hat, Facebook等等。
大会接受四种形式的投稿,45分钟的presentation, BoFs和开发者指南, 或10分钟的lightning talk。如果想要去GCC展示一下自己的话,投稿到组委会邮箱即可,感觉上审查比较简单,基本上符合上述四种形式中的一种,内容相关即可。这次会议我司有十几个人参加,Red Hat有三十来个人,众所周知,IBM最近收购了Red Hat,因此一共五十几个人算是很庞大的规模了。SUSE有十几个人从德国或者捷克来,也看到了来自ARM,Mentor(Code Sourcery),MicroChip等公司的面孔,其中MicroChip过来的三位据说都是从我司多伦多编译实验室出去的老熟人,由此感受到编译器圈子真的不大????,此外,微软也派了四五个人过来,不过他们很低调,发言不多。尽管近年来LLVM异军突起,但是GCC的性能优势相对还是很明显,看上去不少公司的编译器还是会base在GCC上面进行开发。然而GCC代码相对年代久,难度高,一些现代化的工具也还没有被GNU社区采用,年轻的工程师还是比较少,这些老问题大佬们在相关的议题讨论中都提到了并声称会着力解决,引发了热烈的欢呼,这也让我倍受鼓舞,相信不久的将来采纳了新工具的GCC必将焕发新貌。
遵循GCC自由的作风,12号晚上是一场简单且休闲的注册见面会,让新老朋友之间互相认识及寒暄一下,地址在图书馆隔壁的一个餐厅的天台,主办方提供了啤酒和点心。由于经验不足以及未能仔细阅读会议的wiki,没有提前发邮件到官方邮箱去注册,导致门口名单上找不到名字差点不能进去,但跟工作人员简单解释了一下和补登记之后就让我们入场了。在天台上见到了不少同事,以及Honza这位LTO/PGO的大佬,他年纪轻轻就已经是查理大学的副教授,同时在SUSE工作,给GCC贡献了非常多的LTO相关代码,令人钦佩,遗憾的是SUSE的Richard Biener由于家庭原因临时不能过来。百来号的人群里中国人不多,远远的看到了Intel美国过来的某位大佬,老板也碰到了多年前的一位老同事,我从他们的交(BA)谈(GUA)中感受到了二十年来上海编译器圈子的沧桑变迁,哈哈。话说蒙特利尔是个法语区,地图都是法语导航有点不便,温度也比上海低不少,这次会议正好是中秋佳节,虽然未能与家人一起,但能与这么多大佬在异国他乡共同度过也是种难忘的体验了。
Day1(13号):
为期三天的GNU大杂烩开始了。作为一年一度的大会居然没有通常意义上的开场,果然很自由很务实:-)。早上9点到10点是签到和早餐时间,前一天晚上未能注册的依然可以在此时注册,领到自己的名字牌。
上午的两场我听了Project Ranger和elfutils debug info server。Project Ranger (https://gcc.gnu.org/wiki/AndrewMacLeod/Ranger)是一个变量范围分析的模块,用来替代内置的EVRP,给SSA_NAMES提供更准确的范围值。这个talk是Red Hat的Andrew Macleod在讲,原型已经完成并且在社区Review了,从数据来看,性能还不错。主要围绕在Project Ranger实现的细节以及未来的计划在讨论。另外一场debug info server也是Red hat的一个项目,项目的idea是用一个client-server的结构,把debug info放在server上,client这边的gdb从server去拉取文件进行调试。这个talk有意思的是现场用一个docker的demo展示了client跟server的整个运行过程。
下午的第一场我听了Peter的寄存器分配。他的topic分享了很多寄存器分配的痛点,比如寄存器的copy, constraints, reg class的选择和cost等。Peter是寄存器分配的大牛,并且很友善,中午吃饭的时候顺便跟他讨论了最近遇到的一个寄存器在函数调用结束后没有正常恢复的问题。第二场听了同事Bill/Michael的TOC & relative pc联合演讲,这主要是POWER target相关的,主要解决了TOC和relative pc在不同的库场景下共存使用的问题。第三场GCC编译的并行化,是圣保罗大学一个学生参加的google summer of code (https://gcc.gnu.org/wiki/ParallelGcc)项目,用多线程和数据拷贝来处理Gimple和RTL的结构体,加上mutex去解决遇到的race condition,从而提高性能(make -j对多个文件并行编译,这种并行化是文件内多个函数并行编译),Honza等人都提出不少问题和指导建议,期待LTO也能用上这个来提高编译速度。
Day 2(14号):
第二天上午的两场Steering Committee 和Advocacy都是IBM的Distinguish Engineer, David Edelsohn主持的,David是GCC组委会的重要成员,他对HelloGCC这个平台以及GCC在中国的推广非常非常非常的关心????。第一场邀请了八位嘉宾(Jeff Law, Joseph Myers, Carlos等)一字坐开论道,都是各个模块重量级的maintainer,他们激烈的进行了GCC,glibc等的未来发展计划以及如何去改进GCC的开发模式,吸引新生力量,吸收新的组委会成员等高屋建瓴的讨论。第二场本来是专注于如何更好的推广GCC,包括website,社交平台,documentation的改进等等,当然大佬们和观众互动频繁,讨论着讨论着就又发散开来,提到了如何让GCC提供新的语言支持(例如Swift),用LTO来编译Linux Kernel,以及linker和loader的性能,还提到了GCC对GPU的支持等等。
下午的第一场是来自SUSE的Martin Jabor的IPA-SRA,总的来说就是把结构体的访问优化成非结构体的访问,去掉多余的函数的返回值或参数。Martin是辩论出身,因此发音非常标准,用词易懂,而且逻辑很流畅,把自己最近研究的IPA-SRA方面的改进工作娓娓道来,效果极佳。第二场听了Jeff Law关于改进GNU流程的具体措施,涉及svn到git,ChangeLog,代码的review模式,CI测试等众多当前GNU开发者的日常痛点,探讨解决Developer/Reviewer/Maintainer都会遇到的各个问题,引起了强烈反响。
今天的议题还包括很多平台的专场,比如Power, IBM Z, ARM等的BoFs,介绍过去一年在各个target上的开发特性以及未来的计划。也有一些议题跟gdb, glibc相关,由于时间有限,且不是我的工作重点,因此未能参加,有点遗憾。晚上主办方搞了一场非常热闹的social酒会,地点在蒙特利尔考古博物馆,大家还兴致勃勃观看了蒙特利尔的历史短片。总得来说,这次的主办方组织的很成功。
Day 3(15号):
最后一天上午有我期待已久的Honza的LTO/IPA的讲座,Honza总结了过去一年LTO在性能方面的提升,以及针对Firefox的特别调优(link time, code size, LTO, LTO + PGO),还分享了GCC10的LTO计划,干货满满,顺便也认识了SUSE的Martin Liska,对我最近的patch表示了肯定,回去抓紧时间要提交新的版本:)。下午的第一场是SPEC2017在ARM上的优化,演讲的Kyrylo Tkachov快速的介绍了几个他们在SPEC2017的调优,然后就转到自由讨论,期望建立一个面向SPEC优化的沟通渠道,用来分享经验和各司的计划,避免重复工作和弯路。
大会最后一个收尾的讨论议题是GCC/LLVM的合作,GCC的开发者中有一小半同时也在LLVM社区工作,所以他们更能看到彼此的问题,一个小时的时间里围绕语言标准,ABI兼容性,lld等展开热烈讨论。一般来说,conference的最后一天的最后一个议题,通常人都会走的差不多了,但是这种情况在这里并没有发生,由此可见Cauldron真的是开发者聚集的大会,平时散落在世界各地的社区开发者们都非常珍惜这一年一次的面对面交流的机会。
长长的流水账就此记完,怀着满满的收获回去继续倒时差,每天不到5个小时的睡眠靠酒和咖啡续命,早中晚面包都是深刻的记忆。最后一天的上午我们在大会议室还拍了大合照(截至目前还未收到????),认识了这么多牛人之后,mail list上的一个个邮箱账号感觉变得亲切。GNU社区能人众多,很多以一顶十,如前所说,整个大会上中国面孔还是非常少,希望国内能有更多的有志之士加入GCC的开发,大家沉淀下来,共同提高,为社区做贡献的同时也能一起展现我们中国编译器工程师的风采!