ARMCortexgcc參數(shù)_第1頁(yè)
ARMCortexgcc參數(shù)_第2頁(yè)
ARMCortexgcc參數(shù)_第3頁(yè)
ARMCortexgcc參數(shù)_第4頁(yè)
ARMCortexgcc參數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ARMCortexgcc參數(shù)面向ARM處理器的GNU編譯器集合(GCC)命令行選項(xiàng)最初是在多年前設(shè)計(jì)的,當(dāng)時(shí)可用處理器和變體產(chǎn)品的列表與現(xiàn)今相比要短很多。隨著ARM架構(gòu)的演進(jìn),從GCC中獲取最佳代碼所需的選項(xiàng)也已改變,但已做了各種嘗試以確?,F(xiàn)有選項(xiàng)集不會(huì)改變其本意。設(shè)計(jì)編譯器意味著最有效使用ARMCortexTM-A處理器所需的選項(xiàng)目前相當(dāng)復(fù)雜。本博文包含GCC命令行選項(xiàng)的三個(gè)方面:CPU、浮點(diǎn)和SIMD(單指令多數(shù)據(jù))加速。就我的CPU而言應(yīng)當(dāng)使用哪些選項(xiàng)?首先,讓我們了解下用于告知編譯器您正在使用的CPU的主要選項(xiàng);稍后,我們將討論一些在特殊情況下可使用的更高級(jí)選項(xiàng)。每當(dāng)您編譯文件時(shí),編譯

2、器都需要知道您試圖用于運(yùn)行目標(biāo)代碼的CPU的類(lèi)型。實(shí)現(xiàn)這一目的的首選為-mcpu=<cpu-name>選項(xiàng)。正如您預(yù)想的那樣,cpu-name已替換為您擁有的CPU類(lèi)型的具體名稱(chēng),但使用小寫(xiě)。例如,對(duì)于Cortex-A9而言,選項(xiàng)為-mcpu=cortex-a9。GCC目前支持Cortex-A15(包括其本身在內(nèi))之前的所有Cortex-A處理器;即:Cortex-A5-mcpu=cortex-a5Cortex-A7-mcpu=cortex-a7Cortex-A8-mcpu=cortex-a8Cortex-A9-mcpu=cortex-a9Cortex-A15-mc

3、pu=cortex-a15如果您的GCC版本不識(shí)別上述任一處理器,則可能是其版本過(guò)低,您應(yīng)當(dāng)考慮進(jìn)行升級(jí)。如果您不指定要使用的CPU,GCC將使用內(nèi)置的默認(rèn)值-該默認(rèn)值根據(jù)編譯器最初的構(gòu)建方式而變化,并且可能意味著已生成代碼在您所擁有的CPU上的執(zhí)行速度將非常緩慢(或根本無(wú)法執(zhí)行)添加浮點(diǎn)和SIMD目前,市面上的所有ARMCortex-A處理器均配備浮點(diǎn)運(yùn)算單元,大多數(shù)還擁有可實(shí)施ARM高級(jí)SIMD處理器擴(kuò)展的SIMD單元(通常稱(chēng)為NEONTM)。但是,可用的精確指令集取決于擁有的處理器,而且GCC需要單獨(dú)的選項(xiàng)來(lái)進(jìn)行控制;它不會(huì)嘗試通過(guò)-mcpu選項(xiàng)進(jìn)行處理。浮點(diǎn)和SIMD指令的選擇由-mc

4、pu選項(xiàng)控制,下表列出了各種CPU的建議選擇項(xiàng):VFPv3和VFPv4實(shí)施最初通過(guò)32個(gè)雙精度寄存器開(kāi)始,但是在沒(méi)有NEON時(shí),則可以任選前16個(gè)寄存器;這由選項(xiàng)名的d16部分所控制的。該名稱(chēng)的fp16部分指定是否存在半精度(16位)浮點(diǎn)負(fù)載、存儲(chǔ)和轉(zhuǎn)換指令;這是對(duì)VFPv3的擴(kuò)展,但適用于所有VFPv4實(shí)施。出于歷史原因,GCC只在被明確告知可以安全使用浮點(diǎn)和NEON指令時(shí)才會(huì)使用這些指令。在此進(jìn)行控制的選項(xiàng)有些令人混淆,選項(xiàng)的一部分也可更改編譯器所遵守的ABI。-mfloat-abi選項(xiàng)有三種可能的選項(xiàng):-mfloat-abi=soft-忽略所有FPU和NEON指令,僅使用核心寄存器集并利

5、用庫(kù)調(diào)用模擬所有浮點(diǎn)運(yùn)算。-mfloat-abi=softfp-使用與-float-abi=soft相同的調(diào)用規(guī)則,但會(huì)在適用情況下使用浮點(diǎn)和NEON指令。此選項(xiàng)為二進(jìn)制,與-mfloat-abi=soft兼容,并且可以用于提高必須遵循軟浮點(diǎn)環(huán)境的代碼的性能,但需要是已知相關(guān)硬件指令也可用的環(huán)境。-mfloat-abi=hard-在適用情況下使用浮點(diǎn)和NEON指令,并且還更改ABI調(diào)用規(guī)則以便生成更高效的函數(shù)調(diào)用;現(xiàn)在可以在擴(kuò)展寄存器中的函數(shù)之間傳遞浮點(diǎn)和矢量類(lèi)型,不僅節(jié)約大量復(fù)制操作,而且也意味著需要在堆棧上傳遞參數(shù)的調(diào)用變少。應(yīng)當(dāng)使用上述哪個(gè)選項(xiàng)在很大程度上取決于您的目標(biāo)系統(tǒng),也可能默認(rèn)選

6、項(xiàng)就是正確的選項(xiàng)。以Ubuntu12.04(Precise)為例,其目前在默認(rèn)情況下使用的是-mfloat-abi=hard。矢量化浮點(diǎn)運(yùn)算NEON架構(gòu)包含同時(shí)對(duì)整數(shù)和浮點(diǎn)數(shù)據(jù)類(lèi)型進(jìn)行運(yùn)算的指令,并且GCC目前擁有功能強(qiáng)大的自動(dòng)矢量化優(yōu)化,可發(fā)現(xiàn)何時(shí)適合使用可改善性能的矢量引擎。不過(guò),讓許多用戶(hù)驚訝的是,即使他們可能期望這么做,編譯器也無(wú)法將其代碼矢量化。首先要記住的是,自動(dòng)矢量化程序只有在-O3時(shí)才默認(rèn)啟用。存在可以在其他時(shí)候?qū)⑺蜷_(kāi)的選項(xiàng);您可以在GCC手冊(cè)中找到相關(guān)內(nèi)容。然而,即使啟用了矢量化程序,浮點(diǎn)代碼經(jīng)常也無(wú)法實(shí)現(xiàn)矢量化。原因在于,盡管NEON中的浮點(diǎn)運(yùn)算使用IEEE單精度格式來(lái)容

7、納值,但為了最大限度降低NEON單元中所需的功率并且最大限度提高吞吐量,只有在輸入和結(jié)果在正常運(yùn)算范圍內(nèi)(即值不是非正常值或NaN)時(shí),矢量引擎才會(huì)完全按照標(biāo)準(zhǔn)進(jìn)行編譯。GCC默認(rèn)配置為生成嚴(yán)格遵守IEEE浮點(diǎn)算法規(guī)范的代碼,前文所述的限制意味著默認(rèn)使用SIMD指令是不適當(dāng)?shù)?。幸運(yùn)的是,GCC確實(shí)提供了多個(gè)命令行選項(xiàng),可用于準(zhǔn)確控制需要的IEEE標(biāo)準(zhǔn)遵守級(jí)別。盡管具體細(xì)節(jié)不在此討論,但在大多數(shù)情形中,使用-ffast-math選項(xiàng)來(lái)放寬規(guī)則并啟用矢量化是絕對(duì)安全的。您也可以在GCC4.6或更高版本中使用-Ofast選項(xiàng)來(lái)實(shí)現(xiàn)基本相同的效果。它會(huì)打開(kāi)-O3以及多種其他優(yōu)化,通常可以安全地用于從您

8、的代碼中獲得最佳的性能。要記住的另一點(diǎn)是,NEON僅支持單精度數(shù)據(jù)的矢量運(yùn)算。除非寫(xiě)入的代碼用于處理這一格式,否則可能會(huì)發(fā)現(xiàn)矢量化并不可行。您也應(yīng)當(dāng)了解,浮點(diǎn)常量(字面值)最終會(huì)強(qiáng)制編譯器以雙精度執(zhí)行計(jì)算。在C和C+環(huán)境下,編寫(xiě)'1.0F'而非'1.0'以確保編譯器知道您的意思。最后,如果對(duì)于找出矢量化程序?yàn)楹尾话茨A(yù)期運(yùn)作的原因依然存有疑問(wèn),而且您也準(zhǔn)備好親自動(dòng)手探究,GCC對(duì)于其所作的行為提供了非常豐富的信息。-fdump-tree-vect和-ftree-vectorizer-verbose=<level>選項(xiàng)控制所生成的信息量

9、,級(jí)別是1到9范圍內(nèi)的數(shù)字。盡管生成的大多數(shù)信息只有編譯器開(kāi)發(fā)人員才會(huì)感興趣,但您不時(shí)也會(huì)在輸出結(jié)果中找到提示,了解您的代碼不能按預(yù)期矢量化的原因??偠灾热粨碛写罅窟x項(xiàng),那我在日常運(yùn)算中應(yīng)使用哪些選項(xiàng)呢?幸運(yùn)的是,目標(biāo)環(huán)境一旦確定后,大多數(shù)選項(xiàng)就不會(huì)定期發(fā)生變化了。以下是一些示例:含NEON的Cortex-A15處理器,以及操作使用“浮點(diǎn)”數(shù)據(jù)類(lèi)型的數(shù)據(jù)陣列的一些浮點(diǎn)代碼。該運(yùn)算環(huán)境可以支持在浮點(diǎn)寄存器中傳遞參數(shù):arm-gcc-O3-mcpu=cortex-a15-mfpu=neon-vfpv4-ffast-math-omyprog.exemyprog.c不含NEON的Cortex-A7處理器,處理浮點(diǎn)代碼。該運(yùn)算環(huán)境僅支持在整數(shù)寄存器中傳遞參數(shù),但可以使用浮點(diǎn)硬件arm-gcc-O3-mcpu=cortex-a7-mfpu=vfpv4-d16-mfloat-abi=softfp-omyprog2.exem

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論