再具体化
再具体化(英语:Rematerialization)是一种编译器优化技术,首先由格里高利·柴廷(Gregory J. Chaitin)等人于1981年提出[1]并且被实现于PI.8编译器中。其通过重新计算某个值而不是从内存中加载该值的手段,来缩短程序运行时间。该技术可见于GCC等现代编译器中[2]。
使用
编辑这项技术通常见于寄存器配置领域之中,因为在遇到寄存器不足的场景时,一些变量会被转移至内存,形成溢出变量(spilled variable)。考虑到重新从内存加载某个溢出变量的延迟很长,过多的溢出变量会降低程序性能。
传统的编译器优化技术,比如公共子表达式消除以及循环不变代码外提,往往更加注重减少乃至消除多余的计算。一般而言,这些技术往往能够有效降低运行程序所需的处理器周期,但与此同时却也为程序添加了许多变量以及加长了变量的生命周期。在寄存器配置压力较大的场景下,这些副效果会导致大量溢出变量的产生,进而形成性能开销。编译器此时可以根据成本效益分析,决定是否执行再具体化。若该分析显示再具体化的开销小于加载数值的开销,编译器便会消除掉一些原有的优化,来降低寄存器配置方面的压力。
原理
编辑再具体化的工作原理运用了表达式可达性(expression availability)的概念,会跟踪用于计算每个变量的表达式。倘若用于计算某个值 得表达式 的某个变量在运行过程中被修改,该表达式 则被定义为是不可达的,而该值 也无法被再具体化。此外,还要考虑到被再具体化的表达式的最大复杂性,以避免出现程序重复计算的复杂算法,比加载花费更多时间之类的问题。[3]
参考
编辑- ^ Gregory J. Chaitin; Marc A. Auslander; Ashok K. Chandra; John Cocke; Martin E. Hopkins; Peter W. Markstein. Register allocation via coloring. Computer Languages. 1981-01, 6 (1): 47–57. doi:10.1016/0096-0551(81)90048-5.
- ^ Mukta Punjabi. Register Rematerialization in GCC (PDF). [2021-08-07]. 原始内容存档于2005-04-28.
- ^ Briggs, Preston; Cooper, Keith D.; Torczon, Linda. Rematerialization. Proceedings of the ACM SIGPLAN 1992 conference on Programming language design and implementation - PLDI '92. 1992: 311–321. doi:10.1145/143095.143143.