2016-07-07 22 views
0

Zuerst, tut mir leid für den wahrscheinlich irreführenden Titel, aber ich kann mir keine bessere kurze Beschreibung vorstellen.Kann CUDA nicht am Tango arbeiten, oder: wie mache ich Code für einen anderen ARM EABI fehlerhaft?

Für meine Bachelorarbeit schreibe ich eine Tango-App, die aus Leistungsgründen CUDA erfordert. Leider bin ich kein erfahrener Android-Entwickler, daher sind 90% aller Tutorials und Anleitungen zu CUDA, JNI oder Tango nicht ganz einfach genug.

Aus was ich erhalte, NVCC generiert immer Code für die armeabi-v7a-hard ABI. Aus diesem Grund muss mein "normaler" C++ - Code auch für diesen ABI kompiliert werden. Obwohl ich dann meinen C++ Code nicht debuggen kann, kann ich damit leben und habe auch nach vielen Stunden Lesen und Versuch und Irrtum funktioniert.

Heute jedoch stieß ich auf dieses Problem: https://stackoverflow.com/questions/35399927/how-can-i-use-armeabi-v7a-hard-in-my-tango-jni-app. libtango_client_api.so wurde nicht für armeabi-v7a-hard kompiliert. Ich verstehe nicht, warum mein Verknüpfungsprozess nicht scheitert, aber es ist, was es ist.

Aus meiner Sicht habe ich nun mehrere Möglichkeiten:

  1. das gesamte Projekt für armeabi-V7A Kompilieren. Ich glaube, dies wäre die beste Lösung, erfordert aber, dass NVCC passenden Code zur Verfügung stellt. Es scheint die Möglichkeit zu bestehen, einen -mfloat-abi=hard -switch an g ++ zu übergeben, aber ich kann keine Dokumentation darüber finden, was das bewirkt und verursacht und ob es funktionieren würde.

  2. In dem erwähnten StackOverflow-Artikel erwähnten sie das "Mangling" des tango_client_api.h. Ich fand zwei Hinweise: 1 und 2, section 3.10, p. 12, so habe ich versucht, jede Funktionsdeklaration im Header Wechsel von (zB)

    void TangoConfig_free(TangoConfig config) 
    

    zu

    void TangoConfig_free(TangoConfig config) __attribute__((pcs("aapcs-vpf"))) ; 
    

    und

    __hardfp void TangoConfig_free(TangoConfig config); 
    

    Die früheren Abstürzen mit Error:error: 'pcs' attribute ignored [-Werror=attributes], letzteres kompiliert überhaupt nicht (Error:error: '__hardfp' does not name a type). Entweder mache ich etwas falsch oder das ist ein Attribut, das von g ++ ignoriert wird und nur von armcc geehrt wird.

  3. Libtango_client_api.so erneut kompilieren. Ich kann jedoch keinen Quellcode auf der Google-Website finden.

  4. Verwenden Sie nicht die TangoService_getPoseAtTime-Funktion. Das wäre kein großes Problem, aber ich befürchte, dass ich weitere kaputte Funktionen finden oder merkwürdiges Verhalten bekommen könnte, weil es anscheinend nur zufällig funktioniert.

  5. Verwenden Sie einen Java-Wrapper für CUDA. Kann mir nicht vorstellen, dass das eine gute Idee ist, aber ...

Jede Hilfe wird sehr geschätzt!

Antwort

3

Warum erfassen Sie, dass nvcc nur armea-v7a-hard-Code generiert? Sie können CUDA-Code in regulären armeabi-v7a-Binärdateien kompilieren.

Soweit ich weiß, hängt nvcc von der Toolchain ab, mit der Sie den Code kompilieren (mit dem Parameter -ccbin), und armeabi-v7a wird mit den Flags -march=armv7-a -mfloat-abi=softfp unterstützt.

+0

Ok vielen Dank. Ich war unter dem Eindruck, weil zu keinem Zeitpunkt in der Gesamtheit von Google ich irgendetwas gefunden habe, das vorschlägt, dass das eine gute Idee war. vielleicht bin ich nur dumm. Zusätzlich, aber anscheinend ist das ein Missverständnis meinerseits, ich dachte, dass die libcucart_static.a niemals sowohl mit Hard-und Softfloat ABIs verknüpft werden könnte. Wäre nett wenn nvidia ihre Andoid-Sektion in ihrem Handbuch von etwa anderthalb Zeilen auf ein kurzes Tutorial erweitert .... Wie auch immer, danke nochmal, du hast mir eine Menge Schmerzen erspart, hättest früher fragen sollen;) –