<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 業(yè)界動(dòng)態(tài) > ICC GCC傻傻分不清?聊一聊編譯器那些事兒

          ICC GCC傻傻分不清?聊一聊編譯器那些事兒

          作者: 時(shí)間:2017-05-17 來(lái)源:電子產(chǎn)品世界 收藏

            這東西,大家除了關(guān)注工藝、主頻、核心數(shù)量等規(guī)格信息之外,更在意的應(yīng)該就是性能表現(xiàn)了。反應(yīng)性能的測(cè)試可謂是相當(dāng)多樣,但要說(shuō)起最權(quán)威的,那就不得不提SPEC 測(cè)試了。

          本文引用地址:http://www.ex-cimer.com/article/201705/359312.htm

            SPEC的全稱是Standard Performance Evaluation Corporation,翻譯過(guò)來(lái)是標(biāo)準(zhǔn)性能評(píng)估組織,它是一個(gè)全球性的第三方非營(yíng)利性組織,由計(jì)算機(jī)廠商、系統(tǒng)集成商、大學(xué)、研究機(jī)構(gòu)、咨詢等多家公司組成,目標(biāo)是建立、維護(hù)一套用于評(píng)估計(jì)算機(jī)系統(tǒng)的標(biāo)準(zhǔn)。

            在CPU性能測(cè)試上,SPEC CPU 2006是SPEC組織推出的最新版的軟件(上一個(gè)版本SPEC CPU 2000已經(jīng)基本沒(méi)有人用了),同時(shí)也是最受行業(yè)認(rèn)可的測(cè)試軟件。SPEC CPU 2006包括了CINT2006和CFP2006兩個(gè)子項(xiàng)目,前者用于測(cè)量和對(duì)比整數(shù)性能,而后者則用于測(cè)量和對(duì)比浮點(diǎn)性能。在各種處理器的SPEC CPU 2006測(cè)試結(jié)果上,我們往往會(huì)看到或是的字樣,那么又分別代表什么呢?

          什么是/?

            ICC:全稱Intel C++ Compiler,是Intel開(kāi)發(fā)的C/C++/Fortran編譯器套裝,適用于Linux、Microsoft和Mac OS X操作系統(tǒng),沒(méi)有非IA指令集版本(就是說(shuō)僅供x86架構(gòu)CPU使用)。ICC廣泛應(yīng)用于高性能計(jì)算、分布式計(jì)算等商業(yè)計(jì)算領(lǐng)域,其向量化和并行化性能是業(yè)界的標(biāo)桿,能夠充分發(fā)揮現(xiàn)代處理器的特性。

            ICC編譯器套裝提供兩個(gè)版本,針對(duì)高性能計(jì)算機(jī)測(cè)試采用前者,而后者面向嵌入式及移動(dòng)設(shè)備

            GCC:全稱GNU Compiler Collection,GNU編譯器套裝,是廣泛應(yīng)用的Linux系統(tǒng)的默認(rèn)編譯器(特別是用于編譯Linux內(nèi)核)。GCC能夠支持多種架構(gòu)的處理器,跨平臺(tái)特性相對(duì)出色。不過(guò),GNU組織要求全部的代碼由自己完成(防止版權(quán)問(wèn)題),所以GCC雖然有廣泛的硬件支持,但是在各硬件平臺(tái)上卻并不是性能最優(yōu)的編譯器。

          GCC官方LOGO

          到底啥是編譯器?

            所謂編譯器,就是將“一種語(yǔ)言(通常為高級(jí)語(yǔ)言)”翻譯為“另一種語(yǔ)言(通常為低級(jí)語(yǔ)言→匯編語(yǔ)言)”的程序。它的主要工作流程:

            高級(jí)語(yǔ)言源代碼→預(yù)處理器→編譯器→匯編語(yǔ)言,匯編語(yǔ)言再經(jīng)過(guò)匯編器→目標(biāo)文件→鏈接器生成可執(zhí)行程序。

            在這個(gè)流程中,高級(jí)語(yǔ)言指的就是源代碼,如Pascal、C、C++、fortran、Java等,而目標(biāo)文件指的是包含CPU可以執(zhí)行的二進(jìn)制指令的集合。也就是說(shuō),編譯器起到的作用就是將程序源代碼“翻譯”成匯編語(yǔ)言,既然是“翻譯”工作,往往就有Good和Better的區(qū)別,而從上面的介紹我們能夠看出,不同的操作系統(tǒng),能夠使用的編譯器是不同的,那這個(gè)編譯效率自然也就存在差異。

            同時(shí),CPU也是區(qū)分不同架構(gòu)的,比如x86、MIPS、ARM、Power等等,不同架構(gòu)的CPU往往運(yùn)行不同的操作系統(tǒng),如x86架構(gòu)CPU可以運(yùn)行Windows、Linux(Android)和Mac OS X,而MIPS等其他架構(gòu)CPU往往只能運(yùn)行基于Linux開(kāi)發(fā)的操作系統(tǒng)。

            所以,不同架構(gòu)的CPU,根據(jù)適合的操作系統(tǒng),在SPEC CPU測(cè)試過(guò)程中編譯器的選擇上是不一定是唯一的,而選擇哪一種編譯器,站在CPU研發(fā)者的角度上,無(wú)疑會(huì)選擇能讓CPU性能發(fā)揮到最大的編譯器。

          ICC

          GCC

          x86+Windows

          x86+Linux

          PPC/MIPS+Windows

          不存在

          不存在

          PPC/MIPS+Linux

          ×

            通過(guò)前面對(duì)ICC和GCC的解讀,不難看出兩者的區(qū)別。ICC和GCC都可以運(yùn)行在Windows和Linux下,Intel是x86架構(gòu)CPU的老大,配合x(chóng)86架構(gòu)CPU開(kāi)發(fā)了ICC,能夠最大程度的發(fā)揮出x86架構(gòu)CPU的真實(shí)性能。GCC能夠配合更多種類架構(gòu)的CPU加以使用,適用平臺(tái)更廣,但從CPU性能發(fā)揮的角度上看,大而廣很難和專而精比拼。

            但是,綜合x(chóng)86 CPU和Windows系統(tǒng)的市場(chǎng)占有率這兩個(gè)因素來(lái)看,在CPU測(cè)試過(guò)程中,ICC和GCC的采用率又是怎樣呢?

          第三方商業(yè)機(jī)構(gòu)更多采用ICC,GCC寥寥無(wú)幾

            SPEC官網(wǎng)上公布著大量的專業(yè)機(jī)構(gòu)測(cè)試結(jié)果供大家研究分析,筆者選定了全部的整數(shù)單任務(wù)測(cè)試結(jié)果進(jìn)行分析,通過(guò)爬蟲(chóng)抓取了約8600個(gè)測(cè)試結(jié)果,并對(duì)測(cè)試中使用的編譯器進(jìn)行了數(shù)據(jù)統(tǒng)計(jì):

            結(jié)果是使用ICC編譯器的測(cè)試結(jié)果高達(dá)95%,而GCC不足0.1%。這些測(cè)試結(jié)果基本都是獨(dú)立的第三方商業(yè)機(jī)構(gòu)的測(cè)試結(jié)果,具有很高的參考價(jià)值。數(shù)據(jù)顯示,ICC編譯器的使用在SPEC CPU 2006測(cè)試中具有壓倒性的優(yōu)勢(shì),而GCC則幾乎沒(méi)有商業(yè)機(jī)構(gòu)使用。

            上述統(tǒng)計(jì)還反映了一個(gè)事實(shí),就是Intel和AMD的x86架構(gòu)處理器在桌面及服務(wù)器領(lǐng)域的壟斷性優(yōu)勢(shì)。而從其中非x86架構(gòu)CPU的測(cè)試結(jié)果來(lái)看,僅剩的數(shù)個(gè)測(cè)試成績(jī),Power、Sparc全部使用的是針對(duì)自家指令集優(yōu)化過(guò)的編譯器,而非GCC,這也側(cè)面反映了GCC“大而廣”的一些問(wèn)題。

            產(chǎn)生這個(gè)現(xiàn)象的原因要從SPEC CPU測(cè)試成績(jī)產(chǎn)生方法來(lái)說(shuō)起:SPEC組織使用一臺(tái)1997年的Ultra Enterprise 2主機(jī)(處理器為296MHz UltraSPARC II Processor)作為參考對(duì)象,在其上運(yùn)行了全部的SPEC CPU 2006子測(cè)試,并把每一項(xiàng)的測(cè)試結(jié)果的用時(shí)(中間數(shù))定位系數(shù)1。

            實(shí)際測(cè)試中,假定被測(cè)試的CPU運(yùn)行某項(xiàng)子測(cè)試的用時(shí)為A,而Ultra Enterprise 2主機(jī)同一項(xiàng)子測(cè)試用時(shí)為B,則用B/A,即可得到被測(cè)試CPU該項(xiàng)子測(cè)試的成績(jī),而各子測(cè)試成績(jī)的幾何平均值記為總成績(jī)。

            即SPEC各子項(xiàng)成績(jī)是相對(duì)于Ultra Enterprise 2計(jì)算出來(lái)的(Ultra Enterprise 2各項(xiàng)成績(jī)計(jì)為1,總分也是1)。

            從中可以看出的是,作為參考成績(jī)的測(cè)試結(jié)果也并沒(méi)有使用GCC,而是Sparc自家的編譯器。

          ICC GCC哪個(gè)更好?

            實(shí)際上,SPEC CPU測(cè)試的是應(yīng)用程序的運(yùn)行時(shí)間,這個(gè)是被測(cè)機(jī)器處理器、緩存、內(nèi)存、編譯器、操作系統(tǒng)等等部分性能的綜合體現(xiàn),并不是某個(gè)編譯器或者某個(gè)CPU的單獨(dú)測(cè)試結(jié)果,而且軟硬件平臺(tái)綜合體現(xiàn)的結(jié)果,即按照官方規(guī)則正確跑出來(lái)的分都是可比的。SPEC CPU測(cè)試結(jié)果追求的是程序運(yùn)行用時(shí)越短越好,測(cè)試成績(jī)的優(yōu)劣固然重要,但是編譯器的真正的用途是“翻譯語(yǔ)言”,在同樣的硬件平臺(tái)(CPU)下,“翻譯”的越快就可以理解為應(yīng)用啟動(dòng)或進(jìn)行某種運(yùn)算的用時(shí)更少,這就是選擇編譯器的重要性,也是現(xiàn)代應(yīng)用優(yōu)化的方向。

            拿ICC和GCC相比,ICC是針對(duì)x86架構(gòu)CPU使用的編譯器,ICC在現(xiàn)代高性能計(jì)算領(lǐng)域廣泛使用的向量化、并行化能力較強(qiáng),而GCC作為跨平臺(tái)性的編譯器,在這方面性能較差,但是針對(duì)某些偏門的CPU指令集而言,GCC是唯一的選擇。

            ICC、GCC兩者廣泛應(yīng)用于商業(yè)環(huán)境中、都會(huì)被應(yīng)用于處理器、OS及編譯器開(kāi)發(fā)、測(cè)試之中。有些愛(ài)好者擔(dān)心ICC過(guò)度優(yōu)化,結(jié)果不準(zhǔn)確,其實(shí)這大可不必。SPEC CPU是有嚴(yán)格的測(cè)試標(biāo)準(zhǔn)的,每一項(xiàng)測(cè)試都要求嚴(yán)格和參考結(jié)果一致,任何過(guò)度優(yōu)化導(dǎo)致的程序計(jì)算錯(cuò)誤都不會(huì)被計(jì)算在結(jié)果之中。實(shí)際上,ICC在多年的高性能計(jì)算領(lǐng)域已經(jīng)證明了自己的可靠性,而GCC在過(guò)往版本中,也會(huì)有編譯出錯(cuò)、計(jì)算結(jié)果不正確等現(xiàn)象。

          ICC GCC區(qū)別好比如此 懂得人自然懂

            最后筆者想要強(qiáng)調(diào)的是,硬件平臺(tái)性能發(fā)揮需要合適的編譯器來(lái)加以配合,合適的才是最好的,如果編譯器不能合理使用,那又有何意義呢?



          關(guān)鍵詞: CPU ICC GCC

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();