再具體化(英語:Rematerialization)是一種編譯器優化技術,首先由格里高利·柴廷(Gregory J. Chaitin)等人於1981年提出[1]並且被實現於PI.8編譯器中。其通過重新計算某個值而不是從內存中加載該值的手段,來縮短程序運行時間。該技術可見於GCC等現代編譯器中[2]

使用

編輯

這項技術通常見於寄存器配置領域之中,因為在遇到寄存器不足的場景時,一些變量會被轉移至內存,形成溢出變量(spilled variable)。考慮到重新從內存加載某個溢出變量的延遲很長,過多的溢出變量會降低程序性能。

傳統的編譯器優化技術,比如公共子表達式消除以及循環不變代碼外提,往往更加注重減少乃至消除多餘的計算。一般而言,這些技術往往能夠有效降低運行程序所需的處理器周期,但與此同時卻也為程序添加了許多變量以及加長了變量的生命周期。在寄存器配置壓力較大的場景下,這些副效果會導致大量溢出變量的產生,進而形成性能開銷。編譯器此時可以根據成本效益分析,決定是否執行再具體化。若該分析顯示再具體化的開銷小於加載數值的開銷,編譯器便會消除掉一些原有的優化,來降低寄存器配置方面的壓力。

原理

編輯

再具體化的工作原理運用了表達式可達性(expression availability)的概念,會跟蹤用於計算每個變量的表達式。倘若用於計算某個值   得表達式   的某個變量在運行過程中被修改,該表達式   則被定義為是不可達的,而該值   也無法被再具體化。此外,還要考慮到被再具體化的表達式的最大複雜性,以避免出現程序重複計算的複雜算法,比加載花費更多時間之類的問題。[3]

參考

編輯
  1. ^ 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. 
  2. ^ Mukta Punjabi. Register Rematerialization in GCC (PDF). [2021-08-07]. 原始內容存檔於2005-04-28. 
  3. ^ 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.