簡介
隨著綠色需求的日趨迫切,各個領域的專家學者從自身對綠色需求的了解,提出了很多與“綠色”相關的定義,如綠色計算,、綠色網路、綠色存儲、綠色作業系統等。雖然這些定義各不相同,但總的來說主要包括三個基本指標:能耗的節約、資源利用率的提高、環境污染的減少。綠色編譯器也不例外,是指使生成的程式具有較高的資源利用率、較低的能耗和較慢的損耗速度,以提高設備高效使用時間,減少電子垃圾的產生,進而減少對環境的污染,而且能夠為其生成的軟體提供友好的調試和測試信息,以幫助開發者提高開發效率,減少開發過程中高額的資源和能源消耗的編譯器。同時,編譯器是程式語言轉換的工具,也必須保證目標語義同原語義等價。
背景和可能性
在信息化、電子化高速發展,各種攜帶型移動設備如智慧型手機、PAD、平板電腦等被廣泛套用於人們的日常生活和工作中,極大地方便和豐富了人們的物質文化生活。但與此同時,電子產品的快速普及不但消耗了巨大的能源(僅個人計算機消耗的能源就占到全部電力的12%),釋放了大量的溫室氣體,而且廢棄的電子垃圾中含有鉛、鉻、鎘和水銀等有毒物質,其排放將嚴重污染土壤、水等環境資源,給人們的正常生活帶來不可忽視的負面影響。全球技術調查機構高德納(Gartner)對碳排放量的統計結果顯示,IT行業的碳排放比重已經等同於航空業。而且巨大的能源消耗大大增加了 IT 產品本身的成本,2010 年全球 IT 技術的花費已經達到3萬億美元,IT產品同人們的生活更加密切,其對環境的影響將進一步加大。Mc Kinsey報告指出,到2020年,手提電腦、智慧型手機、平板電腦等各種IT設備將成為溫室氣體排放最多的源頭之一)。在電子垃圾方面,聯合國環境規劃署(UNEP)指出,在2010年,美國產生了300萬噸電子垃圾,中國也產生了230萬噸電子垃圾,全球每年將產生4000萬噸電子垃圾。而且據其預測,如果仍不採取相應的保護手段,到2020年,各個國家在各個領域(如舊電腦、電視、手機等)產生的電子垃圾將增加2到18倍不等。
綠色IT 技術已經成為十大IT關鍵技術之首,各個公司、學者為實現綠色 IT 需求進行了不懈努力,為實現綠色需求設計了多種體系結構和
低能耗、低污染材料。然而,大部分電子設備的工作狀態均依賴於其上運行的軟體,軟體的運行方式將直接影響硬體設備各種綠色指標的優劣。因此,除在硬體設備本身的材料上提高綠色程度外,必須對其上運行的軟體進行相應處理,設計適應性的最佳化方法,以充分發揮硬體設備的綠色功效。
電子設備上運行的各種軟體,由於其規模的不斷增長,以及各種硬體體系結構的層出不窮,單獨依靠程式設計師從原始碼級進行綠色最佳化的難度越來越高。而且該方法適應性不強,人們迫切需要更低層次、系統化、自動化的最佳化方法。同時,軟體複雜度的不斷增長極大地提高了軟體測試(通常占整個開發過程的 30%~50%)中資源和能源的消耗,據微軟在新聞發布會上公布的數字顯示,Windows8 在測試期間有超過10億小時的使用和反饋。如果按每台個人計算機功耗為 200 W, Windows8 測試已經消耗了 2 億度電,而且其測試過程仍未停止。因此,如何減少軟體開發過程中資源和能源消耗也是實現綠色IT的重要方面。
早期的軟體由於功能比較單一,邏輯相對簡單,很多熟練的程式設計師能夠憑藉經驗,使用較為低級的彙編語言進行編程,以獲得較高質量的可執行程式。隨著處理器晶片、存儲晶片等關鍵設備製作工藝和性能的飛速發展,計算機系統得到廣泛的普及,其功能越來越全面,運行的應用程式也越來越複雜,開發和調試的難度也將越來越大,傳統的用低級語言進行編程的方式已經很難滿足需求。大部分嵌入式程式均採用高級語言(如 C、Java 等)進行編寫,然後再利用交叉編譯器將該程式轉換為對應平台的可執行目標程式。因此,編譯器作為軟體開發和語言轉換的工具,不但能夠結合具體的嵌入式系統硬體設備信息進行針對性的綠色最佳化,以指導最終的目標程式朝著綠色需求的方向生成,而且能夠利用其在程式轉換中對源程式的分析結果,提高錯誤檢測的速度和定位精度,幫助程式設計師儘早發現和修改程式錯誤,減少軟體開發過程中資源和能源的消耗。要系統化、自動化地對軟體進行最佳化,必然離不開編譯器的支持。
目標
綠色編譯器能夠使得編譯生成的軟體以儘可能低的能耗、高的資源利用率和小的設備損耗正確地運行。由於硬體設備主要以超大規模積體電路為主,其能耗和設備損耗除與本身的材質相關外,與其工作時的溫度也聯繫很大。一般情況下,設備工作時的溫度越高,其能耗和設備損耗也將越大。而部件溫度的提升常常是由於其持續處於激活狀態的結果。因此,如果能夠有效地調整各個部件進入激活狀態的頻度,使各個資源能夠均衡地工作,對降低設備能耗和損耗將有重要作用。同時,在任務負載一定的情況下,均衡的工作方式要求循環使用各種資源,使得所有資源在該設備有效工作時間內均能獲得充分利用,因而也間接提高了資源利用率,使得設備不至於因為某個頻繁使用部件的損壞而導致大量正常可用資源的浪費。
綠色編譯器能夠幫助開發者快速準確地開發出滿足預期功能需求的軟體,以減少開發過程中資源和能源的耗損。這就要求該編譯器能夠快速發現和定位程式中的錯誤,使得軟體開發者能夠根據該提示信息找出其源程式甚至是其設計模型中的錯誤,從而縮短開發周期,節約開發資源。
方法
面向存儲系統的綠色編譯最佳化方法
存儲系統對計算機系統能耗及高效運行有著重要影響,隨著綠色需求的日益顯著,人們從體系結構上對存儲系統特別是片上存儲系統(如暫存器、快取和主存)採取了各種綠色最佳化措施,如快取行移位技術、段交換技術、只寫回修改位技術、數據編碼、耗損平均技術(wear-leveling)等,以降低能耗,提高使用壽命。為適應處理器的速度,減少處理器與存儲器之間的速度差距,存儲系統通常被分為多個層次。而對於外存甚至是主存,由於其離處理器較遠,數據的載入和寫回由專門的硬體電路控制,編譯器難以發揮較大作用,其綠色指標的提升主要基於體系結構的改進。在存儲系統的綠色最佳化中,編譯器主要是針對暫存器、快取、便簽式記憶體(scratchpad memory,SPM)等離處理器較近的存儲層次,根據其存儲材料的讀寫特性進行相關最佳化,其總體最佳化結構主要在暫存器操作以及SPM存儲單元的管理體現上。
面向新型處理器的綠色編譯最佳化方法
處理器擔負著計算機系統中所有的數據處理工作,傳統的處理器為提高處理器精度和可靠性,通常設計了複雜的運算邏輯和可靠性保障策略,使得處理器的能耗通常占據系統總能耗的很大比重。因此,減少處理器能耗對降低系統總能耗具有重要意義。為降低處理器能耗,從純編譯器角度可以通過指令選擇和指令調度,提高低能耗指令和低切換能耗的指令序列的執行頻率。結合硬體則主要通過動態電壓和頻率縮放技術,儘可能降低處理器的電壓和頻率,以獲得能耗的節約。但過度的電壓和頻率的縮放將會影響處理器的正確性,因此傳統的處
理器電壓和頻率縮放總是控制在某個閾值之上,以保證處理器運行的正確性。隨著計算機套用範圍的不斷擴大,計算機的很多套用領域已經不局限於精確的科學計算,某些套用如語音處理、圖像處理、數據挖掘等,並不要求獲得像數值計算一樣非常精確的結果,處理器在處理這些套用時某些非關鍵點的程式錯誤並不會對最終結果產生很大影響。因此,一些研究者針對具體套用的特點,將處理器的研究重點逐漸從傳統精確的處理器轉為非絕對精確的低能耗處理器。這類的低能耗處理器主要有兩種:隨機處理器(stochastic processor,SP)和時序推測處理器(timing speculative processor,TSP)。
隨機處理器主要是針對那些能夠容忍一定錯誤的應用程式而設計的。該類處理器的主要思想是通過對程式正確性約束條件進行適當的放鬆,在保證不超過被執行程式錯誤容忍度的情況下,減少處理器中某些錯誤糾正邏輯,降低系統的能耗。對於隨機處理器,其主要難點是如何將程式轉換為另一個可以接受的低能耗的近似版本。有三種最佳化方案:第一種方法針對圖像處理程式,利用分支合併技術,將某些控制分支的跳轉語句從源程式中移除,使得所有執行緒均執行某條主程式路徑。該方法可以使用硬體實現,也可以在編譯時插入額外的分支合併語句來實現。分支合併技術由於減少了處理器分支預測的開銷,從而能夠有效地減少能耗。第二種方法主要是針對特定的稀疏線性代數問題,利用代數本身的特點將程式轉換為個簡化的近似版本,並只糾正那些嚴重影響程式輸出結果的錯誤,通過計算量的減少達到降低處理器能耗的目的。第三種方法是將任意的程式轉換為一個容錯能力強的數值最佳化問題,以減少隨機處理器出錯時對程式結果的影響,提高隨機處理器的有效性。
利用形式化推理技術說明了如何驗證轉換後程式是可接受的,為程式的近似轉換提供了一定的保障機制。但由於針對隨機處理器的程式轉換複雜度比較高,大部分工作是通過程式設計師進行的。而人工轉換程式適用性比較低,同時受程式設計師本身水平的限制,難以充分發揮隨機處理器的功能。因此,在今後的研究中可以考慮人機互動式程式轉換,以提高程式轉換的效率。
時序推測處理器主要通過對處理器工作電壓和頻率的縮放達到降低功耗的目的。過度的電壓頻率縮放可能會引起時序錯誤,為彌補這些時序錯誤,時序推測處理器在傳統處理器的基礎上增加了額外的錯誤檢測和糾正機制。這些額外的硬體設備雖然需要額外的能耗,但只要縮放的電壓和頻率適中,處理器出現時序錯誤的幾率將很小,因而這些額外的能耗將小於電壓頻率縮放而節約的能耗,進而節約總能耗。
面向高綠色指標軟體開發效率的編譯輔助分析方法
軟體測試和調試是軟體開發的重要環節,也是一項開銷巨大的工作。傳統的人工測試技術不但要耗費大量的人力資源,還需要很長的測試和調試周期,約占整個軟體開發過程的30%~50%,甚至更多,而且測試效率低下,並嚴重依賴於測試人員的個人經驗,即使很簡單的程式也可能由於個體思維習慣導致測試和調試的遺漏。因此,如何利用編譯器提高自動化測試效率,給出足夠準確的調試輔助信息是編譯器研究的另一個不容忽視的方面。
對於自動測試工具,其最主要的工作之一是針對具體的待測程式設計出高效的測試用例。然而對於一般的測試用例,特別是針對白盒測試的用例,只有對源程式進行了全面的分析,才能找到合適的生成方案,生成儘可能少而高效的測試用例。作為程式轉換的編譯器,其在編譯過程中對源程式的語法語義進行了充分的分析,能夠為自動測試工具提供有關被測程式的豐富信息,因此對於提高測試效率,減少測試過程中對人員和資源的消耗具有天然的優勢。
利用編譯提高軟體調試效率方面,研究的重點主要集中於在編譯過程中給出足夠友好的語法錯誤和不安全操作的位置信息,以幫助開發者快速定位和修改軟體中可能存在的錯誤。許多主流編譯器如GCC、Clang等,在錯誤警告信息的友好度和精確度上進行著不斷的改進。其實,測試用例與錯誤警告信息定位具有相輔相成的關係,好的測試用例(即程式輸入)可以幫助編譯器縮小錯誤和警告信息的定位範圍,提高其給出的信息精度;而編譯器發現的程式可能出錯位置,可以通過逆向分析生成對應的測試用例,以提高該測試用例的有效性。文獻
提出了一種編譯指導的支持錯誤跟蹤的測試用例自動生成方法。該方法以編譯器為依託,通過對源程式的語法和語義進行擴展,將測試需求很好地融入到源程式中參與分析,並利用代碼生成器在生成目標代碼的同時,根據相應的分析結果直接生成相應的測試用例。同時,利用編譯器的語義分析,將源程式的行號信息融入到生成的測試用例中,使其能夠在測試用例無法通過時為程式設計師儘快地定位出錯位置,以提高程式開發的進度,從而減少不必要的開發資源的浪費,提高軟體開發過程中的綠色指標。