爲了使用硬件浮點單元,您不需要構建硬浮點模式。只要您爲armeabi-v7a
ABI構建,它將使用硬件浮點單元(VFPv3
)。
爲了說明問題,硬 - 浮點選項(通過將-mhard-float
參數添加到編譯器或構建armeabi-v7a-hard
ABI)僅改變參數傳遞給函數的方式。在內部,Android將所有浮點/雙精度函數參數傳遞到整數寄存器中。這確保了在FPU上的現代設備上運行時,爲armeabi
(ARMv5不保證浮點單元,需要以這種方式傳遞這些參數)構建的代碼仍然可以工作。也就是說,函數將所有浮點參數存入整數寄存器,並將它們移到FPU寄存器,以完成函數內的所有計算。
當使用硬浮選項構建時,這些參數直接在FPU寄存器中傳遞,但是隨着第二個鏈接指出,這要求您調用的所有代碼都使用相同的選項構建,並且JNI函數條目積分需要用JNICALL
正確標記。
所以你從硬鞭毛中獲得的實際好處只不過是你爲每個函數調用保存了一些指令(並且正如第一個鏈接中的答案指出的那樣,這些都相當便宜)。根據圖書館的功能結構,這可能意味着一個完全不重要的變化,或者可能是顯而易見的。不幸的是,我不知道OpenCV內部結構足夠好,可以猜測有多大的潛在加速比率。
所以回顧一下,是的,你是對的,你只是建立你的代碼的硬浮點版本,但將它連接到一個軟浮動ABI版本的OpenCV。爲了使事情順利進行,您還可以在OpenCV的所有函數調用中添加__attribute__((pcs("aapcs")))
標記,但這幾乎可以排除所有潛在的優勢,因爲所有繁重的工作(很可能)都是在庫中完成的,而不是在調用代碼中完成。
所以爲了獲得硬浮動ABI的潛在好處,你需要用-mhard-float
參數重新構建所有的OpenCV(具體怎麼做,儘管我不能幫你)。但只要它的目標是armeabi-v7a
(與參數-march=armv7-a -mfpu=vfpv3
),它應該已經使用硬件FPU,它只是使用向後兼容的ABI。 softfp ABI的開銷比完整softfloat版本的開銷小(不是由-mfpu=vfpv3
構建的)。