Frage

Wenn Anwendungen CUDA schreiben, können Sie entweder Arbeit auf Treiberebene oder auf der Laufzeitebene wie auf diesem Bild dargestellt (Die Bibliotheken sind CUFFT und CUBLAS für fortgeschrittene Mathematik):


(Quelle:

War es hilfreich?

Lösung

Die CUDA-Laufzeit ermöglicht es, Ihre CUDA Kerne in ausführbaren Dateien zu kompilieren und zu verknüpfen. Das bedeutet, dass Sie nicht Cubin Dateien mit Ihrer Anwendung verteilen müssen, oder sich mit ihnen über den Treiber-API geladen werden. Wie Sie bemerkt haben, ist es in der Regel einfacher zu bedienen.

Im Gegensatz dazu ist das Treiber-API schwieriger zu programmieren, aber vorausgesetzt, mehr Kontrolle darüber, wie CUDA verwendet wird. Der Programmierer hat direkt mit der Initialisierung, Laden von Modulen zu beschäftigen, usw.

Offenbar detailliertere Geräteinformationen können als über die Laufzeit-API durch den Treiber-API abgefragt werden. Zum Beispiel kann der freie Speicherplatz auf der Vorrichtung nur durch den Treiber-API abgefragt werden.

Aus dem CUDA-Programmierhandbuch:

  

Es besteht aus zwei APIs:

     
      
  • Ein Low-Level-API des CUDA-Treiber-API,
  • genannt   
  • Ein höherer Level-API namens CUDA Runtime-API, die auf der Oberseite implementiert   der CUDA-Treiber-API.
  •   
     

Diese APIs gegenseitig aus: Eine Anwendung entweder ein verwenden sollte oder die   andere.

     

Die CUDA Runtime erleichtert Gerätecode-Management durch die Bereitstellung implizite   Initialisierung, Kontextmanagement und Modulverwaltung. Der C-Host-Code   erzeugt durch NVCC auf der CUDA Laufzeit basiert (siehe Abschnitt 4.2.5), so   Anwendungen, die auf diesen Code verknüpfen müssen die CUDA Runtime API verwenden.

     

Im Gegensatz dazu der CUDA-Treiber-API mehr Code erfordert, ist schwieriger zu programmieren und   debug, bietet aber eine bessere Maß an Kontrolle und ist sprachunabhängig, da sie nur   befasst sich mit Cubin Objekten (siehe Abschnitt 4.2.5). Insbesondere ist es schwieriger,   konfigurieren und starten Kernel die CUDA-Treiber-API verwenden, da die Ausführung   Konfiguration und Kernel-Parameter müssen mit expliziten Funktionsaufrufe angegeben werden   anstelle der Ausführungskonfigurationssyntax in Abschnitt 4.2.3 beschrieben. Auch Vorrichtung   Emulation funktioniert nicht mit dem CUDA-Treiber-API (Abschnitt 4.5.2.9 sehen).

Es gibt keinen spürbaren Unterschied in der Leistung zwischen der API. Wie Sie Ihre Kernel verwenden, um Speicher und wie sie auf der GPU gelegt (in Kett- und Blöcke) eine viel stärkere Wirkung haben.

Andere Tipps

Ich habe, dass die Kontrolle über CUDA Kontext in Multi-Threaded-Anwendungen für die Bereitstellung von Bibliotheken, von dem Treiber-API zur Verfügung gestellt war kritisch. Die meisten meiner Kunden wollen GPU-Beschleunigung in bestehende Anwendungen zu integrieren, und in diesen Tagen, fast alle Anwendungen sind multi-threaded. Da ich nicht, dass all GPU-Code garantieren könnte, würde initialisiert werden, durchgeführt und aus dem gleichen Thread ausgeplant, hatte ich die Treiber-API zu verwenden.

Meine erste Versuche mit verschiedenen Umgehungen in dem Runtime-API alle zum Scheitern geführt, manchmal auf spektakuläre Weise. - Ich fand ich immer wieder konnte, sofort eine Maschine neu starten, indem Sie einfach den falschen Satz von CUDA Anrufen von verschiedenen Threads durchführen

Da wir alles über den Treiber-API migriert, alle waren gut.

J

ein paar wichtige Dinge zu beachten:

zunächst die Unterschiede zwischen den APIs nur auf den Host-Seite Code anzuwenden. Die Kerne sind genau die gleichen. die Komplexität des Fahrers api ziemlich trivial auf der Host-Seite ist, sind die grundlegenden Unterschiede:

in Treiber api haben Sie Zugriff auf Funktionen, die nicht in der Laufzeit api wie Kontexten ist.

der Emulator funktioniert nur mit Code für die Laufzeit api geschrieben.

ach ja, und zur Zeit cudpp, die eine sehr handliche Bibliothek funktioniert nur mit der Laufzeit api.

Es gibt einige echte Probleme mit dem Argument Ausrichtung und der Treiber-API. Schauen Sie sich die CUDA 2.2 Beta (oder höher) Dokumentation für weitere Informationen.

scroll top