首先,對於可能誤導性的標題感到抱歉,但我想不出更好的簡短描述。無法讓CUDA在Tango上工作,或者:我如何爲另一個ARM EABI修改代碼?
對於我的學士論文,我編寫了一個Tango應用程序,出於性能原因需要CUDA。不幸的是,我不是一個有經驗的Android開發人員,所以90%的關於CUDA,JNI或Tango的教程和指南都不夠基本。
從我收集的內容來看,NVCC總是爲armeabi-v7a-hard ABI生成代碼。因此,根據我的理解,我的「正常」C++代碼也必須爲此ABI編譯。雖然我無法調試我的C++代碼,但我可以忍受這一點,並且在閱讀和反覆試驗了好幾個小時之後也可以繼續工作。
但是,今天我遇到了這個問題:https://stackoverflow.com/questions/35399927/how-can-i-use-armeabi-v7a-hard-in-my-tango-jni-app。沒有爲armeabi-v7a-hard編譯libtango_client_api.so。我不明白爲什麼我的鏈接過程沒有失敗,但它是什麼。
從我的角度來看,我現在有幾個選擇:
編譯用於armeabi-V7A整個項目。我相信這將是最好的解決方案,但要求NVCC提供匹配的代碼。似乎有可能將
-mfloat-abi=hard
-switch傳遞給g ++,但是我找不到任何有關它的作用和原因的文檔,以及它是否可行。在上面提到的StackOverflow-文章中,他們提到了「改造」了tango_client_api.h。我發現了兩個提示:1和2, section 3.10, p. 12,所以我想從(例如)改變每個函數的聲明在頭
void TangoConfig_free(TangoConfig config)
到
void TangoConfig_free(TangoConfig config) __attribute__((pcs("aapcs-vpf"))) ;
和
__hardfp void TangoConfig_free(TangoConfig config);
前者崩潰,
Error:error: 'pcs' attribute ignored [-Werror=attributes]
,後者根本不編譯(Error:error: '__hardfp' does not name a type
)。所以,無論我做錯了什麼,或者這是一個被g ++忽略的屬性,並且只能通過armcc來實現。重新編譯libtango_client_api.so。雖然我在Google網站上找不到任何源代碼。
不使用
TangoService_getPoseAtTime
功能。這不是一個大問題,但我擔心我可能會發現更多的功能失效或者出現奇怪的行爲,因爲它顯然只是意外地工作。使用Java Wrapper for CUDA。無法想象這是一個好主意,但...
任何幫助非常感謝!
好的非常感謝。我的印象是,因爲在整個谷歌的任何時候,我都沒有發現任何暗示這是一個好主意的東西。也許我只是愚蠢的。 此外,但顯然這是我的一個誤解,我認爲libcucart_static.a永遠不能連接到硬和軟兩種ABI。如果nvidia將它們的Andoid部分從手冊中的一行半擴展到一個簡短的教程,那將會很不錯...無論如何,再次感謝你,你救了我很多痛苦,應該早點提出要求;) –