今天的会议日程比昨天轻松。五个报告。
- 台湾资讯研究院的游本中老师,未来编译研究的潜在领域展望。
- 江南所,关于精细编译调优的
- 计算所,关于并行的
- 上交 关于llvm的
- 武大 关于MCU编译器开发的
其中,游老师的演讲最为重量级,也对我们这些晚生最有指导意义。大牛就是大牛,在美国混了这么久,现在又是台湾某个研究所的所长,编译领域的了解可谓渊博,虽然还谦虚的说自己的讲义只是匆匆的准备,但是演讲的过程却功底颇厚。
游老师从编译历史开始讲起。70年代,并行编译器研究比较流行,向量化,对称多处理器的并行化,访存优化等。过去的向量化主要是Cray超级计算机的编程模型,现在则是GPU编程利用;对称多处理器的并行化则是以MPI和OpenMP的诞生最著名,方寸优化方面,对空间和时间局部性的开发、预取、循环块(loop blocking)方面的研究都已经成为当今编译器很重要的组成部分。
80年代研究集中在超编量和VLIW(Very Long Instruction Word超长指令字?)基础上的指令级并行(ILP)研究,这一阶段产生了基于Profiling的优化、过程间分析和优化(包括compiler time、link time、runtime的过程间分析)、软流水(在嵌入式领域很有用)
进入90年代,产生了很多基于已有成熟语言的并行扩展,但是都因为很难做到向后兼容,很难用在已有的程序中,用户群也很小而没有广泛应用,MIP和OpenMP的成功主要来自科学计算。
回头看这三十年,除非有很大的效率提升或者维护成本的降低,否则用户不会去重写自己的代码。
现在,我们需要的是混合的体系结构,CPU控制能力很强,但相比于GPU结构过于复杂,计算能力太弱。而GPU则结构过于简单,控制能力有限,操作系统无法在GPU上运行。混合的机构就需新的编程模型、编译器支持和性能调优的工具。
面向应用的计算需求也在增强,云计算对虚拟化的需求,嵌入式对低功耗的需求,
游老师给出了一个软件/硬件协议栈,从上而下依次是programming,application,compiler,architecture,VLSI, 并指出这五层都需要编译器的协助。
- 编程层:编程模型,编程语言的扩展,程序员和编译器的交互,测试,调试工具等,CUDA编程,OpenCL,MapReduce等等新的编程模型需要库支持,新的编译优化,测试调试工具,另外还需要协助程序员的检测工具
- 应用层:特定领域编程的支持,软件模板,监控和性能调优。特定领域的编程支持–DSP,FFT,等,软件模板技术方便软件的快速移植,软件运行的检测,运行时的profiling。
- 编译层:新的静态动态编译技术,持续编译,安全/稳定的编译
- 体系结构层:传输层(?)、虚拟化,DIFT(Dynamic information flow tracking)、混合多核结构.具体的有以下几个方面:数据/指令预取和DMA、动态电压/频率调节、转移预测、虚拟化的支持、硬件的性能/执行检测系统、多线程同步(SMT).动态信息流跟踪、混杂结构的多核和众核、GPGPU等等
- VLSI/电路层:系统仿真、测试等
江南所介绍了以下他们刚刚起步的程序精细调优系统的架构,可能会集中在循环展开的调优上,我也做过一点自动调优,窃以为这方面没前途。优化的方面太多,而衡量调优的结果只能靠一遍一遍的跑程序。不过如果只是集中在循环这种热点上的调优,可能会稍微快一点把。
上交的llvm方面的工作,是为llvm增加了一个link阶段,具体没听懂。计算所的并行方面的讲座也没怎么听懂
最后是武大的老师介绍某MCU芯片上编译器的开发,因为是MCU芯片采用的是哈佛结构(ROM和RAM分开,即程序代码和数据分开),苛刻的8位寻址,很小的ROM。听起来还是很有意思的。这种芯片要完全用另外一种思维来设计编译器了,几乎所有的性能优化都不能用,主要关注的是代码大小的优化。呵呵,不过如果没有了性能优化,又因为目标代码是交叉编译的,那等于说前端可以拿别人的,后端又没有多少性能优化。估计只要做些关于code size的优化就够了:) 一家之言。
几点收获:
- 用户在考虑是否使用新技术的时候,只关心成本。新的事物若想被人接受,就须要为人带来好处。降低代码维护成本,减少调试工作量,或者提高效率
- ipa很好很强大!
- 更朴实的并行技术研究目前只能从用户角度入手,用户对自己的应用如何并行了如指掌。只是他们可能写不出完备的并行算法。所以只要对用户的并行编程能力做做训练,用户就能很好的将自己的应用并行化,然后牛逼的程序员将其实现就ok了。看来算法导论第三版很值得一看!
- 这是一个前所未有的编译器研究的好时代!
- 工业控制的东西,讲究的最重要的是可靠性和成本。
- 编程语言和编程模型有很大的区别,一如面向对象和面向程序结构

”ipa很好很强大!“
何解?
ipa比较激进,目前open64所做的,就我目前翻译ppt了解的,基本都在全局符号表的分析,常数传播还有函数传参,函数调用的处理。这些都是简单的静态分析,spec测试例子,open64加与不加IPA性能差别还是挺大的,我现在没有具体的数据。
所以如果能再分析出link阶段,甚至runtime阶段实时的分析再加常数传播,就更可观了。
呵呵 所以很好很强大:)
胡扯了一通。期待你的观点