2017-05-13 8 views
0

Ich konfrontiert eine Situation, die ich einige Tabellen in einer Quelldatei (zum Beispiel fill.cu) gefüllt werden müssen und dann in verschiedenen Kernel in verschiedenen Quelldateien verwendet werden.cuda globale Zeigerzuweisung in verschiedenen Quelldatei

Ich habe versucht, einen Zeiger __device__ float *myTable; als ‚extern‘ in fill.h Header-Datei deklarieren und fügte hinzu, dass diese Zeiger in fill.cu others.cpp und definieren und zuordnen und es dort füllen.
Auf diese Weise bekam ich Linker-Fehler, der angibt, dass myTable bereits in fill.cpp definiert wurde.

Nach vielen erfolglosen versuchen, habe ich beschlossen, alle Kernel, die diese Tabelle in der gleichen Quelldatei benötigen, so funktioniert alles gut, bis ich eine cudaMalloc in Hauptfunktion hinzugefügt, bevor meine Tabelle in fill.cpp zuweisen.
Auf diese Weise bemerkte ich, dass Tabelle Werte und Daten in Main zugeordnet sind überlappt und mit Cuda Debugging-Tools von MS Visual Studio 2015, fand ich, dass 2 zugeordnete Zeiger sind gleich !!!

Bitte beachten Sie, wie Sie einen globalen Zeiger in Cuda ohne Konflikt deklarieren können.

Antwort

0

Das traditionelle CUDA-Verknüpfungsmodell erfordert, dass alle Gerätesymbole, Texturen, Funktionen usw. im Rahmen der gleichen Übersetzungseinheit definiert und verwendet werden. Es scheint, dass Ihre Codestruktur diese Anforderung verletzt.

Sie haben zwei Möglichkeiten:

  1. auf die gleiche Code-Struktur weiter, aber Wrapper-Funktionen bereitzustellen, die Ihr Haupt aufrufe können Operationen auf statisch deklarierten Gerätevariablen durchzuführen, anstatt direkt Gerät Symbole mit dem CUDA-API manipulieren aus anderem Code.
  2. Verwenden Sie separate compilation. Hier definieren Sie das Gerätesymbol, auf das Sie zugreifen wollen, in genau einer Datei und deklarieren Sie das gleiche Symbol wie extern überall dort, wo Sie dieses Symbol verwenden müssen. Sie müssen explizit mehrere nvcc-Optionen verwenden, um Ihren Gerätecode zu kompilieren und eine separate Gerätecode-Verknüpfungsstufe zu verwenden.

Beide Ansätze sind gut dokumentiert.

+0

danke für Ihre Antwort. Ich habe nicht verstanden, was Sie mit "statisch deklarierten Gerätevariablen" meinen? Ich benutze genau Methode 1, aber nachdem ich die Wrapper-Funktion von main aufgerufen habe, scheint es denselben Speicher zu haben, der anderen 'cudaMalloc'-Sounds zur Verfügung gestellt wurde, als ob der vorherige frei ist! aber ich habe überhaupt kein 'cudaFree' benutzt !! – AliT

+0

@AliT: Ich kann dir nicht sagen, was in Code passieren könnte oder nicht, den ich nicht sehen kann. Wenn Sie glauben, dass es sich um eine korrekte Implementierung handelt und es nicht funktioniert, dann machen Sie ein [MCVE] und stellen Sie eine neue Frage. So wie es ist, enthält die Antwort, die ich gepostet habe, so viele Details, wie ich liefern kann. – talonmies

Verwandte Themen