2017-08-27 3 views
0

Ich versuche, mein C++ nur Projekt in Cuda-Code zu konvertieren, um auf GPU zu laufen.cuda - Wie kompiliert nvcc __host__ code?

Ich bin neu in CUDA-Programmierung und ich weiß nicht, was mit diesem Umstand zu tun:

Wenn ich eine sehr komplizierte Klassendefinition und jetzt will ich eine Klasseninstanz an das Gerät übergeben und ausführen Einige seiner Member-Funktionen auf dem Gerät, sollte ich dann meine ganze Datei umschreiben. Muss ich nur die Funktionen, die auf dem Gerät laufen, auf __host__ __device__ umstellen oder sollte ich alle Funktionen neu schreiben?

Ich denke, nvcc behandeln Funktionen ohne Funktionstyp Qualifier wie __host__. Wie kompiliert es Host-Code? Kompiliert es sie genau, wie g++ tut?

Antwort

1

Wenn ich eine sehr komplizierte Klassendefinition haben und jetzt will ich eine Klasseninstanz an das Gerät übergeben und einige seiner Mitgliedsfunktionen auf dem Gerät auszuführen, ich sollte meine ganze CPP-Datei neu zu schreiben. Muss ich nur müssen diese Funktionen am Gerät auf __host__ __device__ oder drehen, sollte ich alle Funktionen neu schreiben?

Das hängt ganz von Ihrem Code ab. CUDA unterstützt eine begrenzte Anzahl von C++ - Sprachfunktionen (vollständig dokumentiert here), und fast keine C++ - Standardbibliothek wird unterstützt. Daher gibt es keine allgemeine Antwort, aber es ist wahrscheinlich, dass Sie zumindest einen Teil Ihres Klassenmitgliedsfunktionscodes neu schreiben müssen, wenn Sie sie auf der GPU aufrufen möchten.

Ich denke, nvcc behandeln Funktionen mit keinen Funktionstyp Qualifier als __host__. Wie kompiliert es Host-Code? Kompiliert es sie genau wie g ++?

Das erste, was zu verstehen ist, dass nvcc kein Compiler ist, es ist ein Compiler-Treiber. Einfacher C++ - Code in einer Datei ohne .cu-Dateierweiterung wird standardmäßig ohne Änderungen direkt an den Host-Compiler mit einer Reihe vordefinierter Compileroptionen übergeben.

Host-Code in einer .cu-Erweiterungsdatei wird vom CUDA C++ - Frontend analysiert, um nach der CUDA-Syntax zu suchen, und dann an den Host-Compiler übergeben. Dieser Prozess kann bei extrem komplexen Vorlagendefinitionen und modernsten Sprachfunktionen fehlschlagen. nvcc enthält auch automatisch CUDA-Header, und diese Header können möglicherweise Konflikte mit dem Inhalt Ihres eigenen Codes verursachen. Aber schließlich erreicht Ihr Host-Code den Host-C++ - Compiler, wenn auch auf einem anderen Weg.

Verwandte Themen