Kompilieren eines Teils eines C ++ - Programms für GPU

8

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:

%Vor%

lädt die Bibliothek, OK, findet aber nicht TestCompiled() :

%Vor%

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? ?

    
EOL 22.05.2014, 13:14
quelle

2 Antworten

0

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:

%Vor%

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 :

getestet werden %Vor%

kompiliert mit

%Vor%     
EOL 09.06.2014, 08:28
quelle
1

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.

%Vor%

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.

    
ImOnALampshade 02.06.2014 03:03
quelle

Tags und Links