Wie Sie host-link-code mit einem statischen CUDA-Bibliothek nach trennbaren Zusammenstellung?

Okay, ich habe ein wirklich beunruhigend CUDA 5.0 Frage zu, wie link die Dinge richtig. Ich wäre wirklich dankbar für jede Hilfe!

Mit dem trennbaren Zusammenstellung features von CUDA 5.0, generiert ich eine statische Bibliothek (*.a). Diese verbindet sehr schön mit anderen *.cu-Dateien ausgeführt durch nvcc, ich habe das oft getan.

Ich würde jetzt gern ein *.cpp-Datei und verknüpfen Sie Sie gegen den host-code in diese statische Bibliothek, die mit g++ oder was auch immer, aber nicht nvcc. Wenn ich versuche, bekomme ich compiler Fehler wie

undefined reference to __cudaRegisterLinkedBinary

Ich bin mit beiden -lcuda und -lcudart und, meines Wissens nach, haben die Bibliotheken in der richtigen Reihenfolge (also -lmylib -lcuda -lcudart). Ich glaube nicht, dass es ein Problem mit diesem. Vielleicht bin ich falsch, aber ich habe das Gefühl mir fehlt ein Schritt, und ich muss etwas anderes tun, um meine statische Bibliothek (device linking?) bevor ich es mit g++.

Habe ich etwas übersehen was wichtig? Ist das überhaupt möglich?

Bonus-Frage: ich möchte das Ergebnis eine dynamische Bibliothek. Wie kann ich das erreichen?

  • hinzufügen -lcudadevrt
  • Ich habe schon versucht, es hat nicht alles tun. Der eigentliche Befehl, den ich verwende, ist: g++ -pthread -shared-Wl,-O1 -Wl,-Bsymbolic-functions-Wl,-Bsymbolic-functions-Wl,-z,relro mycpplib.o mycudalib.a-L/usr/local/cuda-5.0/lib64 -L/usr/local/cuda-5.0/lib -lmystaticlib -lcuda -lcudart -lcudadevrt -o mylinkedlib.so - ich bin versucht, erstellen Sie ein Python-Modul für meine CUDA-Bibliothek.
  • Die Fehlermeldung über __cudaRegisterLinkedBinary wird nicht definiert tritt auf, wenn ich versuche zu importieren, das Python-Modul. g++ ist eigentlich alles kompilieren, ohne sich zu beschweren.
  • Sie benötigen nvcc (oder nvlink) zu verknüpfen, nicht g++. g++ weiß nicht, wie Sie miteinander zu verknüpfen Gerät Objekte.
  • Gibt es einen Weg, um meine statische Bibliothek als *.ein Datei-und device-link-mit nvcc, dann pass was auch immer der Ausgang ist, dass g++ um eine Verbindung mit dem host-code? Meine cpp-Datei enthält keine CUDA-code -- ist-Gerät verknüpfen, das richtige hier?
  • Schauen Sie mal hier: docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/...
  • Jared behaupten, dass Sie nicht verwenden können, g++ zu verlinken ist nicht wirklich richtig, da es der doc erklärt. Siehe meine Antwort unten.
  • -lcudadevrt ist nur notwendig, wenn Sie mit der CUDA-Dynamische Parallelität.
  • Wenn diese Lösungen nicht funktionieren, habe ich festgestellt, dass Sie CUDA_RESOLVE_DEVICE_SYMBOLS AUF (bei Verwendung von CMake) behebt das Problem.

InformationsquelleAutor user2333829 | 2013-04-29
Schreibe einen Kommentar