Ist es möglich, (C ++) Code für die GPU mit nvcc in ein gemeinsames Objekt (.so Datei) zu kompilieren und dynamisch von einem C ++ Programm zu laden (in diesem Fall Cern's ROOT , was im Wesentlichen ein C ++ - Interpreter ist (" CINT ")).
Ein einfaches Beispiel, das ich ausführen möchte, ist:
%Vor% Dieser Code wurde mit nvcc --compiler-options '-fPIC' -o TestCompiled_C.so --shared TestCompiled.cu
kompiliert. Laden des freigegebenen Objekts in ROOT mit:
lädt die Bibliothek, OK, findet aber nicht TestCompiled()
:
Dasselbe zu tun, indem das erste Testskript mit ROOT kompiliert wird (ohne die extern
-Zeile, kompilieren mit root TestCompiled.C++
) ... Was kann ich versuchen, damit das C ++ Programm die Testfunktion findet, wenn nvcc die Kompilierung durchführt? ?
Ich kopiere als Referenz die wichtigsten Punkte der Antwort von das RootTalk-Forum , das das Problem gelöst hat:
Ein wichtiger Punkt ist, dass der C-Interpreter von ROOT (CINT) ein "CINT-Dictionary" für die extern kompilierte Funktion benötigt. (Es gibt kein Problem beim Kompilieren über ROOT, da ACLiC dieses Wörterbuch erstellt, wenn es das Makro [ root TestCompiled.C++
] vorkompiliert.)
Also muss eine Schnittstelle TestCompiled.h++
erstellt werden:
Die Schnittstelle muss dann zusammen mit dem gemeinsamen Objekt in ROOT geladen werden:
%Vor% ROOT kann jetzt das extern kompilierte Programm verwenden: root -b -l -n -q Test.C
funktioniert.
Dies kann beispielsweise mit g ++ in der folgenden TestCompiled.C
:
kompiliert mit
%Vor% Ich gehe davon aus, dass die ausgegebene gemeinsame Objektdatei wie jede andere gemeinsam genutzte Bibliothek ist, wie etwa eine, die mit GCC unter Verwendung der gemeinsamen Option erstellt wurde. Um in diesem Fall das Objekt dynamisch zu laden, müssen Sie die Funktion dlopen
verwenden, um eine Kennung für das gemeinsame Objekt zu erhalten. Dann können Sie die Funktion dlsym
verwenden, um nach einem Symbol in der Datei zu suchen.
Sie müssen dlfcn.h
einfügen und bei der Kompilierung mit -ldl
verknüpfen.
Der Unterschied zwischen diesem und dem, was Sie gerade tun, ist, dass Sie die Bibliothek statisch laden, anstatt dynamisch . Obwohl freigegebene Objekte "dynamisch verknüpfte Bibliotheken" sind, wie sie in der Windows-Welt genannt werden, werden beim Laden des Programms alle Symbole im Objekt geladen. Um bestimmte Symbole zur Laufzeit dynamisch zu laden, müssen Sie dies auf diese Weise tun.
Tags und Links c++ dynamic-linking nvcc