欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: ARM GCC浮點(diǎn)相關(guān)總結(jié) [打印本頁]

作者: 51hei小林    時(shí)間: 2016-9-25 10:51
標(biāo)題: ARM GCC浮點(diǎn)相關(guān)總結(jié)
1、名字解釋:

ABI,application binary interface (ABI),應(yīng)用程序二進(jìn)制接口。

2、編譯版本問題:
  GCC 4.0 為分界線
  4.0版本以下,由于采用OABI接口,其對(duì)浮點(diǎn)的支持不太好
  4.0版本以上,采用了新的EABI接口,其對(duì)軟浮點(diǎn)和硬浮點(diǎn)的支持都比較好。

考慮在4.0版本以下時(shí),其支持的ARM內(nèi)核大多數(shù)沒有硬浮點(diǎn),所以可以分析資料比較少,
現(xiàn)在重點(diǎn)關(guān)注4.0版本以上。以下所述都是針對(duì)4.0版本以上的。


3、編譯器相關(guān)的參數(shù):
  -mfloat-abi=soft    使用這個(gè)參數(shù)時(shí),其將調(diào)用軟浮點(diǎn)庫(softfloat lib)來支持對(duì)浮點(diǎn)的運(yùn)算,GCC編譯器已經(jīng)有這個(gè)庫了,一般在libgcc里面。這時(shí)根本不會(huì)使用任何浮點(diǎn)指令,而是采用常用的指令來模擬浮點(diǎn)運(yùn)算。 但使用的ARM芯片不支持硬浮點(diǎn)時(shí),可以考慮使用這個(gè)參數(shù)。在使用這個(gè)參數(shù)時(shí),連接時(shí)一般會(huì)出現(xiàn)下面的提示:
   undefined reference to `__aeabi_fdiv'
  或者類似的提示,主要因?yàn)橐话闱闆r下連接器沒有去主動(dòng)尋找軟浮點(diǎn)庫,這時(shí)使用將libgcc庫加入即可。

  -mfloat-abi=softfp
  -mfloat-abi=hard
  這兩個(gè)參數(shù)都用來產(chǎn)生硬浮點(diǎn)指令,至于產(chǎn)生哪里類型的硬浮點(diǎn)指令,需要由-mfpu=xxx參數(shù)來指令。這兩個(gè)參數(shù)不同的地方是:
         -mfloat-abi=softfp生成的代碼采用兼容軟浮點(diǎn)調(diào)用接口(即使用-mfloat-abi=soft時(shí)的調(diào)用接口),這樣帶來的好處是:兼 容性和靈活性。庫可以采用-mfloat-abi=soft編譯,而關(guān)鍵的應(yīng)用程序可以采用-mfloat-abi=softfp來編譯。特別是在庫由第 三方發(fā)布的情況下。
         -mfloat-abi=hard生成的代碼采用硬浮點(diǎn)(FPU)調(diào)用接口。這樣要求所有庫和應(yīng)用程序必須采用這同一個(gè)參數(shù)來編譯,否則連接時(shí)會(huì)出現(xiàn)接口不兼容錯(cuò)誤。
  
  
  -mfpu=vfp
  -mfpu=fpa
  ...
  前面已經(jīng)講述了,-mfpu參數(shù)就是用來指定要產(chǎn)生哪種硬浮點(diǎn)指令。常見的有vfp,fpa等。


4、編譯器使用時(shí)要注意的地方:
  a.確認(rèn)編譯器默認(rèn)是使用哪種參數(shù)來處理浮點(diǎn)操作的。寫一個(gè)簡單的浮點(diǎn)數(shù)程序:
  #include <stdio.h>
int main(void)
{
    double d1 = 10.3;
    double d2 = 2.0;
   
    double dret = d1/d2;
    dret++;
   
    printf("result :%f",dret);
   
    return 0;
}
     
然后使用
      arm-linux-gcc -c main.c -o main.o
    再使用
      arm-linux-objdump -d main.o
     然后觀察產(chǎn)生的指令,從而確定默認(rèn)使用的是軟浮點(diǎn)還是硬浮點(diǎn)。(確認(rèn)的過程,看個(gè)人。晃一眼,里面如果有不熟悉指令,那可能就是硬浮點(diǎn)指令了)

  b.確認(rèn)編譯器所帶的庫使用哪種參數(shù)來編譯的。
  c.確認(rèn)所使用的芯片是否支持硬浮點(diǎn),如果支持,是哪種類型的浮點(diǎn)指令。如果1,2與使用的芯片相沖突,這時(shí)就要考慮另尋編譯器了。

這三點(diǎn)確認(rèn)以后,我們?cè)趯懽约旱膽?yīng)用程序時(shí),就會(huì)知道該怎樣使用這些參數(shù)了。


5、Linux相關(guān)問題:

這里涉及兩個(gè)問題:

問題1:使用的ARM芯片不支持硬浮點(diǎn)
   在配置ARM Linux內(nèi)核時(shí),應(yīng)該都會(huì)看到這樣的配置:
    menu "Floating point emulation"
    comment "At least one emulation must be selected"
    config FPE_NWFPE
        ...
這個(gè)是用來配置在內(nèi)核里面模擬浮點(diǎn)處理器。

這個(gè)配置有什么作用呢?估計(jì)很少有人能夠知道。其實(shí)它是這樣的:
當(dāng)使用的ARM芯片不支持硬浮點(diǎn),而又采用了-mfpu=fpa -mfloat-abi=softfp/hard來編譯應(yīng)用程序。現(xiàn)在應(yīng)該知道,采用這樣的參數(shù)是要參數(shù)fpa硬浮點(diǎn)指令。但是使用的ARM芯片不支持硬 浮點(diǎn),這時(shí)這個(gè)配置就其作用了。因?yàn)槭褂昧薴pa硬浮點(diǎn)指令,但使用的ARM芯片不支持硬浮點(diǎn),這樣當(dāng)程序運(yùn)行到fpa硬浮點(diǎn)指令,會(huì)出現(xiàn)指令異常,便會(huì) 陷入到內(nèi)核里,這時(shí)這個(gè)模擬浮點(diǎn)處理器就來模擬這些浮點(diǎn)指令。現(xiàn)在應(yīng)該清楚了,其作用了吧。但是現(xiàn)在有了更好的辦法,前面已經(jīng)講過了,采用 -mfloat-abi=soft參數(shù)來編譯應(yīng)用程序,這樣效率會(huì)快得多。想想從用戶態(tài)切換到內(nèi)核態(tài),以及由此產(chǎn)生的cache和TLB表的損失。所以可 以考慮將這個(gè)配置拋棄了。


問題2:使用的ARM芯片支持硬浮點(diǎn)

一般ARM芯片支持硬浮點(diǎn),都是采用協(xié)處理器方式的。與ARM內(nèi)核本身一樣,協(xié)處理器也有自己的寄存器。這樣當(dāng)多個(gè)進(jìn)程同時(shí)涉及浮點(diǎn)運(yùn)算時(shí),會(huì)怎樣?所以Linux內(nèi)核為了支持硬浮點(diǎn),也要做一些工作的。
內(nèi)核配置:
   config VFP
    bool "VFP-format floating point maths"
    depends on CPU_V6 || CPU_ARM926T || CPU_V7 || CPU_FEROCEON

如果使用的ARM芯片支持硬浮點(diǎn),同時(shí)在應(yīng)用程序里面使用了硬浮點(diǎn),那么內(nèi)核可能需要做一些工作。。上面這個(gè)配置是針對(duì)vfp硬浮點(diǎn)處理器的;如果是其他 硬浮點(diǎn)處理,需要參考相關(guān)的資料,來確認(rèn)要做哪些功能。如果可以確保所有時(shí)候,可以確保只有一個(gè)進(jìn)程使用硬浮點(diǎn)處理器,那可以不需要考慮對(duì)硬浮點(diǎn)相關(guān)寄存 器的保存和切換,問題是可以確認(rèn)嗎?


對(duì)于浮點(diǎn)運(yùn)算,針對(duì)ARM芯片應(yīng)該盡量避免。如果無法避免,那就需要綜合考慮到底使用哪種方式?如何去操作?性能如何?都需要考慮,去實(shí)驗(yàn)測(cè)試是最好的。







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1