您的位置:首頁>數碼>正文

聊一聊編譯器那些事兒

CPU這東西,大家除了關注工藝、主頻、核心數量等規格資訊之外,更在意的應該就是性能表現了。反應CPU性能的測試可謂是相當多樣,但要說起最權威的,那就不得不提SPEC CPU測試了。

SPEC的全稱是Standard Performance Evaluation Corporation,翻譯過來是標準性能評估組織,它是一個全球性的協力廠商非營利性組織,由電腦廠商、系統集成商、大學、研究機構、諮詢等多家公司組成,目標是建立、維護一套用於評估電腦系統的標準。

在CPU性能測試上,SPEC CPU 2006是SPEC組織推出的最新版的軟體(上一個版本SPEC CPU 2000已經基本沒有人用了),同時也是最受行業認可的測試軟體。SPEC CPU 2006包括了CINT2006和CFP2006兩個子項目,前者用於測量和對比整數性能,而後者則用於測量和對比浮點性能。在各種處理器的SPEC CPU 2006測試結果上,我們往往會看到ICC或是GCC的字樣,那麼ICC和GCC又分別代表什麼呢?

什麼是ICC/GCC?

ICC:全稱Intel C++ Compiler,是Intel開發的C/C++/Fortran編譯器套裝,適用於Linux、Microsoft和Mac OS X作業系統,沒有非IA指令集版本(就是說僅供x86架構CPU使用)。ICC廣泛應用於高性能計算、分散式運算等商業計算領域,其向量化和並行化性能是業界的標杆,能夠充分發揮現代處理器的特性。

▲ICC編譯器套裝提供兩個版本,針對高性能電腦測試採用前者,而後者面向嵌入式及移動設備。

GCC:全稱GNU Compiler Collection,GNU編譯器套裝,是廣泛應用的Linux系統的預設編譯器(特別是用於編譯Linux內核)。GCC能夠支援多種架構的處理器,跨平臺特性相對出色。不過,GNU組織要求全部的代碼由自己完成(防止版權問題),所以GCC雖然有廣泛的硬體支援,但是在各硬體平臺上卻並不是性能最優的編譯器。

▲GCC官方LOGO

到底啥是編譯器?

所謂編譯器,就是將“一種語言(通常為高階語言)”翻譯為“另一種語言(通常為低階語言→組合語言)”的程式。它的主要工作流程:

高階語言原始程式碼→前置處理器→編譯器→組合語言,組合語言再經過彙編器→目的檔案→連結器生成可執行程式。

在這個流程中,高階語言指的就是原始程式碼,如Pascal、C、C++、fortran、Java等,而目的檔案指的是包含CPU可以執行的二進位指令的集合。也就是說,編譯器起到的作用就是將程式原始程式碼“翻譯”成組合語言,既然是“翻譯”工作,往往就有Good和Better的區別,而從上面的介紹我們能夠看出,不同的作業系統,能夠使用的編譯器是不同的,那這個編譯效率自然也就存在差異。

同時,CPU也是區分不同架構的,比如x86、MIPS、ARM、Power等等,不同架構的CPU往往運行不同的作業系統,如x86架構CPU可以運行Windows、Linux(Android)和Mac OS X,而MIPS等其他架構CPU往往只能運行基於Linux開發的作業系統。

所以,不同架構的CPU,根據適合的作業系統,在SPEC CPU測試過程中編譯器的選擇上是不一定是唯一的,而選擇哪一種編譯器,站在CPU研發者的角度上,無疑會選擇能讓CPU性能發揮到最大的編譯器。

通過前面對ICC和GCC的解讀,不難看出兩者的區別。ICC和GCC都可以運行在Windows和Linux下,Intel是x86架構CPU的老大,配合x86架構CPU開發了ICC,能夠最大程度的發揮出x86架構CPU的真實性能。GCC能夠配合更多種類架構的CPU加以使用,適用平臺更廣,但從CPU性能發揮的角度上看,大而廣很難和專而精比拼。

但是,綜合x86 CPU和Windows系統的市場佔有率這兩個因素來看,在CPU測試過程中,ICC和GCC的採用率又是怎樣呢?

協力廠商商業機構更多採用ICC,GCC寥寥無幾

SPEC官網(http://spec.org/)上公佈著大量的專業機構測試結果供大家研究分析,筆者選定了全部的整數單筆者選定了全部的整數單任務測試結果進行分析,通過爬蟲抓取了約8600個測試結果,並對測試中使用的編譯器進行了資料統計:

結果是使用ICC編譯器的測試結果高達95%,而GCC不足0.1%。這些測試結果基本都是獨立的協力廠商商業機構的測試結果,具有很高的參考價值。資料顯示,ICC編譯器的使用在SPEC CPU 2006測試中具有壓倒性的優勢,而GCC則幾乎沒有商業機構使用。

上述統計還反映了一個事實,就是Intel和AMD的x86架構處理器在桌面及伺服器領域的壟斷性優勢。而從其中非x86架構CPU的測試結果來看,僅剩的數個測試成績,Power、Sparc全部使用的是針對自家指令集優化過的編譯器,而非GCC,這也側面反映了GCC“大而廣”的一些問題。

產生這個現象的原因要從SPEC CPU測試成績產生方法來說起:SPEC組織使用一台1997年的Ultra Enterprise 2主機(處理器為296MHz UltraSPARC II Processor)作為參考對象,在其上運行了全部的SPEC CPU 2006子測試,並把每一項的測試結果的用時(中間數)定位係數1。

實際測試中,假定被測試的CPU運行某項子測試的用時為A,而Ultra Enterprise 2主機同一項子測試用時為B,則用B/A,即可得到被測試CPU該項子測試的成績,而各子測試成績的幾何平均值記為總成績。

即SPEC各子項成績是相對於Ultra Enterprise 2計算出來的(Ultra Enterprise 2各項成績計為1,總分也是1)。

參考機器(Ultra Enterprise 2主機)的測試結果也公佈在spec.org網站上面:

https://www.spec.org/cpu2006/results/res2006q3/cpu2006-20060513-00001.html

從中可以看出的是,作為參考成績的測試結果也並沒有使用GCC,而是Sparc自家的編譯器。

ICC GCC哪個更好?

實際上,SPEC CPU測試的是應用程式的執行時間,這個是被測機器處理器、緩存、記憶體、編譯器、作業系統等等部分性能的綜合體現,並不是某個編譯器或者某個CPU的單獨測試結果,而且軟硬體平臺綜合體現的結果,即按照官方規則正確跑出來的分都是可比的。SPEC CPU測試結果追求的是程式運行用時越短越好,測試成績的優劣固然重要,但是編譯器的真正的用途是“翻譯語言”,在同樣的硬體平臺(CPU)下,“翻譯”的越快就可以理解為應用啟動或進行某種運算的用時更少,這就是選擇編譯器的重要性,也是現代應用優化的方向。

拿ICC和GCC相比,ICC是針對x86架構CPU使用的編譯器,ICC在現代高性能計算領域廣泛使用的向量化、並行化能力較強,而GCC作為跨平臺性的編譯器,在這方面性能較差,但是針對某些偏門的CPU指令集而言,GCC是唯一的選擇。

ICC、GCC兩者廣泛應用於商業環境中、都會被應用於處理器、OS及編譯器開發、測試之中。有些愛好者擔心ICC過度優化,結果不準確,其實這大可不必。SPEC CPU是有嚴格的測試標準的,每一項測試都要求嚴格和參考結果一致,任何過度優化導致的程式計算錯誤都不會被計算在結果之中。實際上,ICC在多年的高性能計算領域已經證明了自己的可靠性,而GCC在過往版本中,也會有編譯出錯、計算結果不正確等現象。

▲ICC GCC區別好比如此,懂得人自然懂

最後筆者想要強調的是,硬體平臺性能發揮需要合適的編譯器來加以配合,合適的才是最好的,如果編譯器不能合理使用,那又有何意義呢?

喜欢就按个赞吧!!!
点击关闭提示