NDK編程的一個坑—Arm平臺下的類型轉換

最近在作DNN定點化相關的工做,DNN定點化就是把float表示的模型壓縮成char表示,雖然會損失精度,可是因爲DNN訓練的模型值比較接近且範圍較小,實際上帶來的性能損失很是小。DNN定點化的好處是能夠以4倍的效率壓縮模型,這個在移動端會具備比較大的優點。
作完定點化以後,在x86服務器上驗證沒有問題,可是利用NDK移植到arm移動端卻一直得不到正確結果,真是一時頭大。經過仔細調試,最終發現問題所在—全部值爲負的float值定點化成char以後都變爲0!在網上搜了好久終於知道這個竟然是arm平臺自己的問題。Arm平臺下,char默認實際上是unsigned char,正是因爲char是無符號的,致使一個不在範圍內的數被強轉時會產生未定義的行爲,在Stack Overflow上有一個很好的解釋。
找到問題所在,解決方法就很是簡單,強制讓arm平臺下的char是有符號的,具體就是在編譯的時候加-fsigned-char選項。服務器

相關文章
相關標籤/搜索