2013-07-11 7 views
26

Ich habe mich kürzlich gefragt, wie NVCC CUDA-Gerätecode für verschiedene Rechnerarchitekturen kompiliert.Welchen Zweck haben mehrere "arch" -Flags in Nvidias NVCC-Compiler?

Aus meiner Sicht ist "arch" die minimale Compute-Architektur, die für die Anwendung des Programmierers erforderlich ist, und die minimale Compute-Architektur, für die NVCCs JIT-Compiler PTX-Code kompiliert.

Ich verstehe auch, dass der "Code" -Parameter von -gencode ist die Compute-Architektur, die NVCC kompiliert die Anwendung für, so dass keine JIT-Kompilierung notwendig ist.

Nach der Prüfung verschiedener CUDA Projekt Makefiles, ich habe die folgenden Voraussetzungen erfüllt sind regelmäßig bemerkt:

-gencode arch=compute_20,code=sm_20 
-gencode arch=compute_20,code=sm_21 
-gencode arch=compute_21,code=sm_21 

und nach einiger Lektüre fand ich, dass könnte mehrere Gerätearchitekturen für in einer einzigen Binärdatei kompiliert werden - in Dieser Fall sm_20, sm_21.

Meine Fragen sind warum sind so viele Bogen/Code-Paare notwendig? Werden alle Werte von "arch" oben verwendet?

was ist der Unterschied zwischen diesem und sagt:

-arch compute_20 
-code sm_20 
-code sm_21 

ist die früheste virtuelle Architektur in den „Bogen“ Feldern automatisch ausgewählt, oder gibt es ein anderes obskures Verhalten?

Gibt es noch ein anderes Kompilierungs- und Laufzeitverhalten, das ich beachten sollte?

Ich habe das Handbuch gelesen, http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation und ich bin immer noch nicht klar, was passiert bei der Kompilierung oder Laufzeit.

Prost,

James.

Antwort

31

Grob gesagt, geht die Codekompilierung Fluss wie folgt aus:

CUDA C/C++ Gerätecode Quelle -> PTX -> SASS

Die virtuelle Architektur (zB compute_20, was auch immer von -arch compute... angegeben) bestimmt, welche Art von PTX-Code generiert wird. Die zusätzlichen Schalter (z. B. -code sm_21) bestimmen, welcher Typ von SASS-Code erzeugt wird. SASS ist eigentlich ausführbarer Objektcode für eine GPU (Maschinensprache). Eine ausführbare Datei kann mehrere Versionen von SASS und/oder PTX enthalten, und es gibt einen Laufzeit-Lade-Mechanismus, der basierend auf der tatsächlich verwendeten GPU geeignete Versionen auswählt.

Wie Sie bemerken, ist eine der praktischen Funktionen der GPU-Operation JIT-compile. Die JIT-Kompilierung erfolgt durch den GPU-Treiber (das CUDA-Toolkit muss nicht installiert werden), wenn ein geeigneter PTX-Code verfügbar ist, ein geeigneter SASS-Code jedoch nicht. Ein Vorteil der Einbeziehung mehrerer virtueller Architekturen (dh mehrerer Versionen von PTX) besteht dann darin, dass Sie eine ausführbare Kompatibilität mit einer größeren Vielfalt von Ziel-GPU-Geräten haben (obwohl einige Geräte eine JIT-Kompilierung auslösen können, um das erforderliche SASS zu erzeugen)).

Ein Vorteil der Einbeziehung mehrerer "echter GPU-Ziele" (d. H.mehrere SASS-Versionen), können Sie den JIT-Compile-Schritt vermeiden, wenn eines dieser Zielgeräte vorhanden ist.

Wenn Sie einen fehlerhaften Satz von Optionen angeben, ist es möglich, eine ausführbare Datei zu erstellen, die auf einer bestimmten GPU nicht (korrekt) ausgeführt wird.

Ein möglicher Nachteil der Angabe einer Menge dieser Optionen ist Code Größe aufgebläht. Ein weiterer möglicher Nachteil ist die Kompilierzeit, die in der Regel länger ist, wenn Sie weitere Optionen angeben.

Es ist auch möglich, executables zu erstellen, die keine PTX enthalten, was für diejenigen interessant sein könnte, die versuchen, ihre IP zu verdecken.

Das Erstellen von PTX, das für JIT geeignet ist, sollte von specifying a virtual architecture für den code Schalter durchgeführt werden.

+1

Apologies für die späte Antwort, und vielen Dank für Ihre. Ich verstehe den Zweck von PTX zu JIT für viele echte Architekturen zu kompilieren, aber ist es notwendig, alle solche älteren PTX-Architekturen oder nur die Mindestspezifikation PTX? Zum Beispiel, wenn ich wollte, dass der Code auf so viele GPUs wie möglich ausgeführt würde, würde ich sagen, -arch compute_11, 12 13 ... 30, 35, oder einfach -arch compute_11 enthalten? Beste, James. –

+3

Sie könnten nur '-arch compute_11' angeben, und Sie würden cc 1.1 PTX-Code generieren. Alle GPUs sollten jetzt und in der Zukunft in der Lage sein, von dieser PTX-Version zu einem nützlichen Maschinencode zu JIT-compilieren (mit Ausnahme von cc 1.0-Geräten). Wenn Sie jedoch zusätzliche PTX-Versionen angeben, können Sie durch Hinzufügen eines "neueren" PTX eine Möglichkeit bieten, eine neuere Architektur besser zu nutzen. Daher könnte Ihr Code auf einem cc3.0-Gerät schneller ausgeführt werden, wenn Sie dies tun gab auch 'compute_30' an. Es ist ein Kompromiss zwischen Code-Größe/Kompilierzeit und bestem Perf. Ihre Laufleistung kann variieren. –

+0

Alles klar, tolle Antworten. Vielen Dank für Ihre Zeit! –

Verwandte Themen