|
目前大多數(shù)主流CPU都支持浮點(diǎn)運(yùn)算單元,或者具備浮點(diǎn)運(yùn)算功能的輔助運(yùn)算單元,比如PowerPC e500的SPE APU。在這樣的機(jī)器上,浮點(diǎn)操作一般被編譯成硬浮點(diǎn)指令,但是有的時(shí)候?yàn)榱苏{(diào)試方便,或者由于fpu工作不正常而需要關(guān)閉硬浮點(diǎn),就需要使用軟浮點(diǎn)指令來模擬浮點(diǎn)操作。
在Linux下,一般有兩種軟浮點(diǎn)方式:
1。由kernel來模擬軟浮點(diǎn),應(yīng)用程序仍然使用硬浮點(diǎn)來編譯。在運(yùn)行的時(shí)候,碰到浮點(diǎn)指令或者使用了浮點(diǎn)運(yùn)算單元的CPU,硬件會(huì)產(chǎn)生相應(yīng)的中斷異常,kernel處理這個(gè)中斷異常,然后根據(jù)指令內(nèi)容進(jìn)行軟浮點(diǎn)操作,將結(jié)果保存好之后再恢復(fù)原來的執(zhí)行。
這樣的方式好處在于應(yīng)用程序不需要重新編譯,只需要在kernel中把浮點(diǎn)模擬的開關(guān)打開即可,所以使用起來非常方便。但是缺點(diǎn)也很明顯,每次浮點(diǎn)操作都要觸發(fā)中斷異常,執(zhí)行過程就要慢很多。另外在有些CPU上,并非所有的浮點(diǎn)指令都會(huì)觸發(fā)中斷異常,那么這些指令就沒辦法用這種方式進(jìn)行模擬。
2。另一種方式是使用軟浮點(diǎn)重新編譯所有應(yīng)用程序,這樣可以避免上述問題,而且使用gcc的浮點(diǎn)模擬性能上也會(huì)好一些。但缺點(diǎn)是因?yàn)槭褂昧瞬煌木幾g選項(xiàng),使用的ABI可能就發(fā)生了變化,如果某個(gè)庫(kù)或者應(yīng)用沒有使用同樣的編譯選項(xiàng)(ABI不同),系統(tǒng)運(yùn)行時(shí)會(huì)出現(xiàn)意想不到的情況,甚至造成崩潰。
|
|