2016-07-07 17 views
0

首先,對於可能誤導性的標題感到抱歉,但我想不出更好的簡短描述。無法讓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。我不明白爲什麼我的鏈接過程沒有失敗,但它是什麼。

從我的角度來看,我現在有幾個選擇:

  1. 編譯用於armeabi-V7A整個項目。我相信這將是最好的解決方案,但要求NVCC提供匹配的代碼。似乎有可能將-mfloat-abi=hard -switch傳遞給g ++,但是我找不到任何有關它的作用和原因的文檔,以及它是否可行。

  2. 在上面提到的StackOverflow-文章中,他們提到了「改造」了tango_client_api.h。我發現了兩個提示:12, 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來實現。

  3. 重新編譯libtango_client_api.so。雖然我在Google網站上找不到任何源代碼。

  4. 不使用TangoService_getPoseAtTime功能。這不是一個大問題,但我擔心我可能會發現更多的功能失效或者出現奇怪的行爲,因爲它顯然只是意外地工作。

  5. 使用Java Wrapper for CUDA。無法想象這是一個好主意,但...

任何幫助非常感謝!

回答

3

你爲什麼認爲nvcc只生成armeabi-v7a-hard代碼?您可以將CUDA代碼編譯爲常規armeabi-v7a二進制文件。

據我所知,nvcc依賴於你編譯代碼的工具鏈(使用-ccbin參數),armeabi-v7a支持標記-march=armv7-a -mfloat-abi=softfp

+0

好的非常感謝。我的印象是,因爲在整個谷歌的任何時候,我都沒有發現任何暗示這是一個好主意的東西。也許我只是愚蠢的。 此外,但顯然這是我的一個誤解,我認爲libcucart_static.a永遠不能連接到硬和軟兩種ABI。如果nvidia將它們的Andoid部分從手冊中的一行半擴展到一個簡短的教程,那將會很不錯...無論如何,再次感謝你,你救了我很多痛苦,應該早點提出要求;) –