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.
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. –
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. –
Alles klar, tolle Antworten. Vielen Dank für Ihre Zeit! –