久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    GCC編譯器優化選項分析及具體優化了什么

     黃南山 2017-06-23

              

          起因:

          目前項目使用nios IDE作為開發平臺,其使用的編譯器為gcc的交叉編譯器。在設定編譯條件時,在debug模式下生成的程序正常,但是在release模式下會出現LCD顯示的開端顯示不全,缺少一個字節或字的狀況。為了了解具體為什么造成該問題,對兩種模式下的配置做了對比,編譯器皆為nios2-elf-gcc交叉編譯器,debug模式編譯器參數為:-DALT_DEBUG -O0 -g –Wallrelease模式編譯器參數為: -DALT_RELEASE -O2 -g –Wall

          兩種模式下的參數簡單說明如下

          -DALT_DEBUG:目前沒有明確資料顯示該項的具體作用,根據命名可認為與調試有關選項。且兩種模式下都有,暫時認為不會造成差異。

          -O0: gcc編譯器默認優化等級。

          -ggdb調試器支持選項用于在編譯時生成相關調試信息。

          -Wall:打開所有編譯器告警選項,即編譯器最嚴格告警模式。

          -O2gcc編譯高于O0低于O3的編譯優化選項。

    通過對比可以發現兩種模式主要的不同在于編譯器優化程度不同,那么編譯器在兩種優化下究竟做了什么優化那?是否由這些問題造成的顯示丟失問題那??現在我們來看看gcc編譯器的優化參數到底做了什么優化。(注:由于關于nios2-elf-gcc的文檔資料十分稀少,不能形成可分析的文檔,所以以通用的gcc作為分析,畢竟同出一源)

          正文:

    1. GCC編譯器優化選項介紹:

      GCC編譯器在目前是不是用最多的編譯器也相去不遠,尤其在嵌入式領域很多編譯器都是基于GCCcross gcc版本。畢竟功能成熟而且有開放的源代碼。

      這里只介紹優化編譯的參數

      -O用來開啟優化編譯選項。

      -O0:默認模式,不做任何優化。

      -O1:優化。該模式下對于一個大的函數或功能會花費更多的時間和內存。

                  -O1下:編譯會嘗試減少代碼體積和代碼運行時間。但是并不執行會花費大量時間的優化操作。

                  在該模式下將打開一下優化選項:

                    -fdefer-pop

    •  

        -fdelayed-branch

    •  

        -fguess-branch-probability

    •  

        -fcprop-registers

    •  

        -floop-optimize

    •  

        -fif-conversion

    •  

        -fif-conversion2

    •  

        -ftree-ccp

    •  

        -ftree-dce

    •  

        -ftree-dominator-opts

    •  

        -ftree-dse

    •  

        -ftree-ter

    •  

        -ftree-lrs

    •  

        -ftree-sra

    •  

        -ftree-copyrename

    •  

        -ftree-fre

    •  

        -ftree-ch

    •  

        -funit-at-a-time

    •  

        -fmerge-constants

          該模式下在不影響調試的狀況下還會打開‘-fomit-frame-pointer優化項。

          同時該模式不會為Ada編譯器打開-ftree-sra’優化項,如需要則請使用命令參數輸入‘-ftree-sra’進行優化。

    -O2:進一步優化.GCC執行幾乎所有支持的操作但不包括空間和速度之間權衡的優化。-O2優化等級下,并不執行循環展開和函數“內聯”【注1優化操作。與-O1比較該優化-O2將會花費更多的編譯時間當然也會生成性能更好的代碼。-O2除了打開-O1的所有優化參數外還打開以下優化選項。

          -fthread-jumps

      -fcrossjumping

      -foptimize-sibling-calls

      -fcse-follow-jumps -fcse-skip-blocks

      -fgcse -fgcse-lm

      -fexpensive-optimizations

      -fstrength-reduce

      -frerun-cse-after-loop -frerun-loop-o

      -fcaller-saves

      -fpeephole2

      -fschedule-insns -fschedule-insns2

      -fsched-interblock -fsched-spec

      -fregmove

      -fstrict-aliasing

      -fdelete-null-pointer-checks

      -freorder-blocks -freorder-functions

      -falign-functions -falign-jumps

      -falign-loops -falign-labels

      -ftree-vrp

      -ftree-pre

      還要注意-fgcse下關于請求-O2優化等級的用于計算goto的程序。

    -O3:更進一步優化。-O3打開-O2指定的所有優化操作并且打開:

      -finline-functions

      -funswitch-loops

      -fgcse-after-reload

      優化項。

    -Os:針對程序空間大小優化(多用于嵌入式系統)。-Os使能-O2中除去會增加程序空間的所有優化參數。同時-Os還會執行更加優化程序空間的選項。

          -Os會關閉以下優化選項:

          -falign-functions

       -falign-jumps

       -falign-loops

       -falign-labels

       -freorder-blocks

       -freorder-blocks-and-partition

       -fprefetch-loop-arrays

       -ftree-vect-loop-version 

          關于GCC編譯的優化選項一共有-O0(默認),-O1-O2-O3-Os五個參數。各個參數優選內容如上所示。但是各個優化內容到底是指什么那?繼續分析。

          2.優化具體參數含義。(共計49項)

        -fdefer-pop

        推遲推出函數調用的參數,對于那些需要在函數調用后必須取出(pop)函數參數的機器而言,打開該項編譯器將把函數調用的參數壓入棧,等必要時幾個函數調用參數一起取出(pop)。這將節省處理時間。

    -fdelayed-branch

    如果對目標機支持這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令后面的指令空隙.

    -fguess-branch-probability

    使用啟發式算法預測分之指令,增加指令的命中率,提升運行效果。

    -fcprop-registers

    使用寄存器之間copy-propagation傳值;

      因為在函數中把寄存器分配給變量, 所以編譯器執行第二次檢查以便減少 
        調度依賴性(兩個段要求使用相同的寄存器)并且刪除不必要的寄存器復制操作

    -floop-optimize

      通過優化如何生成匯編語言中的循環, 編譯器可以在很大程序上提高應用程序的性能。 通常, 程序由很多大型且復雜的循環構成。 通過刪除在循環內沒有改變值的變量賦值操作, 可以減少循環內執行指令的數量, 在很大程度上提高性能。 此外優化那些確定何時離開循環的條件分支, 以便減少分支的影響。

    -fif-conversion  

    if-then語句應該是應用程序中僅次于循環的最消耗時間的部分。 
        簡單的if-then語句可能在最終的匯編語言代碼中產生眾多的條件分支。 通過減少 
        或者刪除條件分支, 以及使用條件傳送 設置標志和使用運算技巧來替換他們, 編譯 
        器可以減少if-then語句中花費的時間量。

    -fif-conversion2  

    這種技術結合更加高級的數學特性, 減少實現if-then語句所 
        需的條件分支。

    -ftree-ccp

    Perform sparse conditional constant propagation (CCP) on trees. This pass

    only operates on local scalar variables and is enabled by default at ‘-O’  and

    higher.

    -ftree-dce

    編譯器將消除無用的不會被執行的代碼(dead code

    -ftree-dominator-opts

      Perform a variety of simple scalar cleanups (constant/copy propagation, redun-

      dancy elimination, range propagation and expression simpli?cation) based on a

      dominator tree traversal. This also performs jump threading (to reduce jumps

      to jumps). This ?ag is enabled by default at ‘-O’ and higher.

    -ftree-dse 

    -ftree-ter

      Perform temporary expression replacement during the SSA->normal phase. Sin-

      gle use/single def temporaries are replaced at their use location with their de?n-

      ing expression. This results in non-GIMPLE code, but gives the expanders

      much more complex trees to work on resulting in better RTL generation. This

      is enabled by default at ‘-O’ and higher.

    -ftree-lrs

      Perform live range splitting during the SSA->normal phase. Distinct live ranges

      of a variable are split into unique variables, allowing for better optimization

      later. This is enabled by default at ‘-O’ and higher.

    -ftree-sra 

    -ftree-copyrename

    -ftree-fre

    -ftree-ch

    -funit-at-a-time

    -fmerge-constants

          -fthread-jumps

      -fcrossjumping

      -foptimize-sibling-calls

      -fcse-follow-jumps

      -fcse-skip-blocks

      -fgcse -fgcse-lm

      -fexpensive-optimizations

      -fstrength-reduce

      -frerun-cse-after-loop

      -frerun-loop-o

      -fcaller-saves

      -fpeephole2

      -fschedule-insns

      -fschedule-insns2

      -fsched-interblock

      -fsched-spec

      -fregmove

      -fstrict-aliasing

      -fdelete-null-pointer-checks

      -freorder-blocks

      -freorder-functions

      -falign-functions

      -falign-jumps

      -falign-loops

      -falign-labels

      -ftree-vrp

      -ftree-pre

       -finline-functions

      允許編譯器選擇某些簡單的函數在其被調用處展開,比較安全的選項,特別是在CPU二級緩存較大時建議使用。

       -funswitch-loops 

       -fgcse-after-reload 

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 国产乱人伦偷精品视频下| 国产AV福利第一精品| 国产欧美日韩亚洲一区二区三区| 亚洲人成小说网站色在线| 午夜精品一区二区三区免费视频| 肉大捧一进一出免费视频| 国产免费午夜福利757| 亚洲国产精品无码中文LV| 亚洲偷自拍国综合| 亚洲男女一区二区三区| 久久精品娱乐亚洲领先| 蜜桃臀无码AV在线观看| 无码AV岛国片在线播放| 国产欧美在线一区二区三| 欧美国产日韩A在线观看| 2021AV在线无码最新| 成人午夜福利视频| 国产女主播白浆在线看| 欧美丰满熟妇xxxx性| 国产AV无码专区亚洲AV潘金链| 中文字幕无码日韩专区免费| 国产重口老太和小伙| 精品无码人妻一区二区三区| 婷婷六月综合缴情在线| 韩国免费a级毛片久久| 久久毛片少妇高潮| 成人一区二区不卡国产| 亚洲精品无码久久毛片| 麻豆国产传媒精品视频| 亚洲欧美中文字幕5发布| 成人亚欧欧美激情在线观看| 精品国产AV无码一道| 免费大片黄国产在线观看| 一区二区不卡国产精品| 在线亚洲人成电影网站色WWW| 无码成人午夜在线观看| 虎白女粉嫩尤物福利视频| 色噜噜国产精品视频一区二区| 国产精品丝袜亚洲熟女| 日本边添边摸边做边爱喷水| 国产色视频一区二区三区|