歡迎您光臨本站 註冊首頁

Linux系統中使用GCC CPU參數優化代碼編譯

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

  使用特定的GCC參數可以使編譯出的程序執行效率有較大提升。具體如下:

  1、優化原理:

  在編譯程序時,藉助參數傳遞的方法,使用與系統CPU相匹配的gcc參數,編譯出的程序就是為系統CPU而進行特定優化過的,因而執行速度和效率都會是最好。

  2、注意事項

  (1) 經過大量測試發現,在RedHat, CentOS系統中通常只能通過參數傳遞的方法進行編譯優化,當然,如果願意並且能夠修改程序的MakeFile也可以達到這一效果,只不過比較複雜,工作量較大。其他在網上廣為流傳的方法(例如:直接通過.bashrc, /etc/profile聲明參數系統變數、寫入/etc/make.conf等)經過測試均沒有效果。

  (2) 對於Gentoo Linux或FreeBSD可以通過修改/etc/make.conf添加參數的方法來實現,而不必使用參數傳遞法。

  3、優化步驟:

  (1)確定系統CPU類型:

  # cat /proc/cpuinfo | grep "model name"

  執行後會看到系統中CPU的具體型號,記下CPU型號。

  (2)使用參數傳遞方法進行編譯:(以Pentium4 CPU為例)

  此處以編譯Apache為例說明如何使用參數傳遞:

  # tar xzvf httpd-2.0.55.tar.gz

  # cd httpd-2.0.55

  CHOST="i686-pc-linux-gnu" \

  CFLAGS="-O3 \

  -msse2 \

  -mmmx \

  -mfpmath=sse \

  -mcpu=pentium4 \

  -march=pentium4 \

  -pipe \

  -fomit-frame-pointer" \

  CXXFLAGS="-O3 \

  -msse2 \

  -mmmx \

  -mfpmath=sse \

  -funroll-loops \

  -mcpu=pentium4 \

  -march=pentium4 \

  -pipe \

  -fomit-frame-pointer" \

  ./configure ……

  # make

  # make install

  這樣就通過函數傳遞方法實現了編譯優化。下面對其中的一些參數進行具體說明:

  -O3:相對於-O、-O1、-O2,-O3開啟了所有GCC支持的優化特性;

  -msse2:開啟CPU所支持的sse2指令集;

  -mmmx:參考-msse2

  -mfpmath=sse:為指定指令集生成浮點運算特性(優化浮點運算功能);

  -mcpu:指定CPU型號;

  -march:指定CPU型號,基本同-mcpu,GCC根據-march設定的CPU型號決定在生成代碼時可以使用哪些種類的指令。(注意!-march參數在某些CPU型號中不可用!)

  -pipe:使用管道(pipe)方法替代臨時文件方法在編譯的不同階段之間進行通訊。

  附:常見CPU優化參數

  386:

  CHOST="i386-pc-linux-gnu"

  CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"

  486:

  CHOST="i486-pc-linux-gnu"

  CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"

  Pentium (Intel):

  CHOST="i586-pc-linux-gnu"

  CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"

  Pentium MMX (Intel):

  CHOST="i586-pc-linux-gnu"

  CFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"

  Pentium PRO (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"

  Pentium II (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

  Celeron (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

  Pentium III (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

  Celeron2 (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

  Celeron (Willamette-Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

  Pentium 4 (Intel):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

  K6 (AMD):

  CHOST="i586-pc-linux-gnu"

  CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"

  K6-2 (AMD):

  CHOST="i586-pc-linux-gnu"

  CFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"

  K6-3 (AMD):

  CHOST="i586-pc-linux-gnu"

  CFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"

  Athlon (AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"

  Athlon-tbird, aka K7 (AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"

  Athlon-tbird XP (AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

  Athlon 4(AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"

  Athlon XP (AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

  Athlon MP (AMD):

  CHOST="i686-pc-linux-gnu"

  CFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"

  603 (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  603e (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  604 (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  604e (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  750 aka as G3 (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer -fsigned-char"

  7400, aka G4 (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"

  CXXFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"

  7450, aka G4 second generation (PowerPC):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"

  CXXFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer -fsigned-char -maltivec"

  PowerPC (If you don't know which one):

  CHOST="powerpc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

  Sparc:

  CHOST="sparc-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

  Sparc 64:

  CHOST="sparc64-unknown-linux-gnu"

  CFLAGS="-O3 -pipe -fomit-frame-pointer"

  CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

(責任編輯:A6)



[火星人 ] Linux系統中使用GCC CPU參數優化代碼編譯已經有1304次圍觀

http://coctec.com/docs/linux/show-post-70166.html