輕鬆優化編譯器 (Compiler)

英文原文:Compiler Optimization Made Easy

2023年3月7日於《Semiconductor Engineering》刊登

在先前的部落格文章中我們曾探討過使用自動化方式提高系統效能的好處。在該文章中提到的一項應用實例是編譯器標誌探勘 (compiler flag mining)─其實際效能成果大幅優於多數編譯器的標準優化程度。要達到這種未曾開發的效能是一項難題,但幸運的是現在有一種簡單的解決方法。

可供探索的選項

編譯器是一種程式,可以將人類所描述處理的高階語言指令集,轉譯成機器可讀取的指令。編譯器的輸出結果是可以交由機器執行的二進制文件。在大多數情況下,都會希望其生成的可執行文件能盡快運行,這也是人們投入大量精力改良編譯器的原因。在高效能運算(HPC)領域尤是如此,因為編譯器對程式效能的影響有時會比處理器架構的影響更大。因此,編譯器在進行編譯時會提供大量可調用選項,讓工程師得以根據應用程式類型、運行硬體的平台以及目標工作負載來調整編譯器的功能。

然而,編譯器提供的選項通常高達數百種。在如此海量的選項中,要找出正確的編譯器標誌組合以生成最佳效能二進制文件,是一項艱鉅的任務。試想一下:僅是使用100 個參數(其中許多參數取值範圍非常大),可能的編譯器標誌排列組合就會超過10157個。相較之下,已知的宇宙中原子數量大約也「只有」1082 個, 看來大海撈針還容易得多!

確定正確的編譯器標誌組合,以生成效能最佳的二進制文件,幾乎是一項不可能的任務。筆者之所以會說「幾乎」,是因為實際上確實有一種利用自動化和人工智慧(AI)有效進行分析的方法。

本文將說明使用Synopsys SLM Optimizer Studio軟體進行的編譯器標誌探勘實驗,並展示使用自動化AI工具為工作負載找出最佳編譯器配置的方法。

實驗概述

針對此一挑戰,我們決定優化廣泛採用的LLVM編譯器配置。我們的目標是找出編譯器標誌的正確組合,將二進制文件執行時間降到最低。這代表著我們需要準備一個目標應用程式進行編譯,以及工作負載作為運行測試。為此我們選擇了業界認可的XSbench基準。XSbench的優勢在於每一個週期只需數分鐘的運行時間,能幫助我們快速收集測試樣本。此外,運行之間的平均偏差相當低(平均 0.3%),意味著在實驗中收集的結果具代表性並可有效重現。XSbench基準提供可在測試期間執行一系列查詢功能的應用程式,因此其效能是以每秒平均查詢次數來衡量。這也是我們透過優化 LLVM 編譯器設置進行改良的指標。

在運行Optimizer Studio前,我們需要將LLVM編繹器與基準測試連結。幸運的是,這項工作非常簡單,只需確定三個項目:允許該工具於整個實驗過程中修改編譯器標誌列表、調用基準測試的命令行(command line)以及基準測試運行的每秒查詢次數指標的獲取方式。完成第一步後,接著我們就可以執行 Optimizer Studio,輕鬆享用一杯咖啡,並觀看圖像使用者介面(GUI)所顯示的即時資料。

結果

由於我們選用每次運行僅需數分鐘的基準測試,因此能夠在短短數個小時內看到顯著的結果和效能改善。然而,因應而生的點狀圖所顯示的不僅僅是效能提升而已(如圖 1所示)。

圖 1:Optimizer Studio互動式使用者界面

該圖中的每一個點都代表優化器測試的配置(換句話說,也就是LLVM編譯器標誌的特定組合)。縱軸顯示每秒的查詢次數,也是我們的目標指標,而橫軸則代表時間戳記,使我們能夠隨著實驗進度觀察效能是否隨時間提升。我們的起點以綠色標記─這是我們的基準配置。在本範例中,我們選擇基線配置為編譯器調用(compiler call)且並未定義任何標誌,然而,我們也可以採用任何配置作為起點。此外,該工具還以紅色顯示最佳配置及柏拉圖前緣(Pareto Frontier),使我們能夠快速識別最好的配置。讓我們一起看看更詳細的結果。

我們留意到的第一件事是在運行數十種配置後,就看到效能的大幅躍升,而在測試另外10種配置後,效能又再一次遽增。使用Optimizer Studio進行實驗時,這種快速收斂的改善相當典型。這是由於所使用的底層演算法性質(源自基因進化演算法(genetic evolutionary algorithms))特別適合在大型的解決方案空間內解決此類優化問題。事實上,在此實驗中,我們同時操作390個LLVM編譯器標誌─這是不可能透過手動方式達成的優化任務!

我們也發現圖中幾個「步驟」。對於每項配置,我們皆能訪問已設置的標誌列表,經進一步檢查後,我們發現將編譯器的內置優化標誌(“O”)從-Og轉換到-Ofast可以顯著提升效能(如圖2所示) 。

圖2:首次效能躍升圖

Optimizer Studio很快就能明白這一情況並專注於使用-Ofast標誌來優化配置。 請記住,我們不只能利用標誌O來執行優化,因為每種配置都有一百種以上的標誌可供選擇!

如果以手動方式執行這項工作,人們很可能會以為在效能大獲提升之後就足夠了,進一步的優化工作都是徒勞。但其實並非如此,因為Optimizer在執行自動分析時能夠產生第二次效能大躍升(如圖3所示)。

圖3:第二次效能躍升

結語

最終,Optimizer Studio確定181個個別標誌設置為特定值的特定配置可提供最佳性能。即使對編譯器專家來說,在合理的時間範圍內以手動方式找出最佳配置也根本不可能。這個實驗說明人工智慧導向的智慧型自動化功能,可用來解決含有大量變數、極度複雜的解決方案空間問題。

在實驗的後續,我們十分好奇是否有辦法能夠設置更少標誌,並達成類似效能水平?Optimizer Studio的自動化功能可否幫助人們讓優化工作更臻完善?又或者,能否協助我們更加理解特定標誌對效能的影響?答案是肯定的,我們將在往後的文章中進一步探討。

歡迎至Synopsys SLR Optimizer Studio瞭解更多資訊。