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
(odernvlink
) zu verknüpfen, nichtg++
.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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine Verknüpfung mit nvcc, es ist eine implizite device-link-zusammen mit dem host-link. Wenn Sie die host-compiler zu verknüpfen (z.B. g++), dann müssen Sie einen expliziten Schritt zu tun, ein device-link-mit –dlink-option, z.B.
Es ist ein Beispiel genau in der Mit Separaten Kompilierung Kapitel des nvcc doc.
Derzeit haben wir nur statische Bibliotheken für die verschiebbaren Geräte-code. Wir wären daran interessiert zu lernen, wie Sie möchten, um die Verwendung solcher code in einer dynamischen Bibliothek. Bitte fühlen Sie sich frei, um die Antwort in die Kommentare.
Edit:
Antwort auf die Frage in dem Kommentar unten " gibt es eine Möglichkeit zu nutzen nvcc zu drehen mylib.ein in etwas, das gesetzt werden kann, die in g++?"
Nur die Bibliothek verwenden, wie ein Objekt, wie diesem:
Können Sie Bibliotheken überall Sie Objekte verwenden. So einfach tun
nvcc –arch=sm_35 –dlink mylib.a –o dlink.o
g++ mylib.ein dlink.o x.cpp –lcudart