再具体化(英语:Rematerialization)是一种编译器优化技术,首先由格里高利·柴廷(Gregory J. Chaitin)等人于1981年提出[1]并且被实现于PI.8编译器中。其通过重新计算某个值而不是从内存中加载该值的手段,来缩短程序运行时间。该技术可见于GCC等现代编译器中[2]

使用

这项技术通常见于寄存器配置领域之中,因为在遇到寄存器不足的场景时,一些变量会被转移至内存,形成溢出变量(spilled variable)。考虑到重新从内存加载某个溢出变量的延迟很长,过多的溢出变量会降低程序性能。

传统的编译器优化技术,比如公共子表达式消除以及循环不变代码外提,往往更加注重减少乃至消除多余的计算。一般而言,这些技术往往能够有效降低运行程序所需的处理器周期,但与此同时却也为程序添加了许多变量以及加长了变量的生命周期。在寄存器配置压力较大的场景下,这些副效果会导致大量溢出变量的产生,进而形成性能开销。编译器此时可以根据成本效益分析,决定是否执行再具体化。若该分析显示再具体化的开销小于加载数值的开销,编译器便会消除掉一些原有的优化,来降低寄存器配置方面的压力。

原理

再具体化的工作原理运用了表达式可达性(expression availability)的概念,会跟踪用于计算每个变量的表达式。倘若用于计算某个值 得表达式 的某个变量在运行过程中被修改,该表达式 则被定义为是不可达的,而该值 也无法被再具体化。此外,还要考虑到被再具体化的表达式的最大复杂性,以避免出现程序重复计算的复杂算法,比加载花费更多时间之类的问题。[3]

参考

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.