CUDA 10 mit neuem asynchronem Task-Graph-Modell veröffentlicht

Die neueste Version von Nvidias Parallelprogrammierungswerkzeug unterstützt die Turing GPUs und bietet Entwicklern verbesserte sowie erneuerte Tools.

 –  0 Kommentare
CUDA 10 unterstützt Nvidias Turing-GPUs

Die Vorstellung neuer Grafikkarten mit GPUs der Turing-Baureihe im Rahmen der Siggraph Mitte August hatte Nvidia auch zum Anlass genommen, die neueste Version seines Parallelprogrammierungswerkzeugs CUDA anzukündigen. CUDA 10 steht Entwicklern ab sofort zur Verfügung, um neue GPU-beschleunigte Anwendungen zu entwerfen, die auch von der Leistungsfähigkeit der Turing-GPUs profitieren können. Neben zahlreichen Verbesserungen, die unter anderen die Performance-Bibliotheken sowie die Interoperabilität mit der Grafik-API betreffen, führt Nvidia mit dem Toolkit außerdem ein neues asynchrones Task-Graph-Programmiermodell ein, das vor allem eine Beschleunigung bei der Verarbeitung sich wiederholender Arbeitsschritte verspricht – beispielsweise bei wissenschaftlichen Simulationen oder dem Training neuronaler Netzwerke.

CUDA 10 gibt Entwicklern verschiedene Möglichkeiten an die Hand, um von dem mit Turing eingeführten Streaming Multiprocessor (SM) zu profitieren, der dank unabhängiger Floating-Point- und Integer-Datenpfade eine gegenüber den Pascal-GPUs deutlich verbesserte Verarbeitungseffizienz bieten soll. Über CUDA Libraries, TensorRT sowie verschiedene Deep-Learning-Frameworks greifen Entwickler direkt auf die in den Turing-GPUs integrierten Tensor Cores zu, um Matrixoperationen mit verschiedenen Genauigkeiten durchführen zu können. Neben den gängigen FP16/FP32-Modi bietet Turing auch INT8 und INT4. CUDA C++ macht Tensor Cores über die Schnittstelle Warp-Level Matrix Operations API (WMMA) verfügbar. Der Namespace nvcuda::wmma enthält alle Funktionen und Datentypen für WMMA.

Von der Warp-Level Matrix Operations API (WMMA) unterstützte Matrizen (m, n, k). (Bild: Nvidia)

Wissenschaftliche Simulationen sowie das Training von Deep Neural Networks laufen in der Regel nach einem iterativen Ansatz ab, bei dem sich gleichartige Arbeitsschritte regelmäßig wiederholen. Bisher mussten CUDA Streams für jeden iterativen Schritt neu angestoßen werden – ein zeitaufwändiger Prozess mit hohem Ressourcenverbrauch. Das neue asynchrone Task-Graph-Programmiermodell in CUDA 10 soll nun die Verarbeitung nach dem Muster define-once-run-repeatedly ermöglichen, um insbesondere den bei GPUs signifikanten Mehraufwand eines wiederholten Kernel Launch zu vermeiden. In dem Graph-Modell repräsentieren CUDA-Operationen (Kernel Launch, Memory Copy, CPU Function Call etc.) die Nodes, Edges entsprechen den Abhängigkeiten zwischen den Operationen. Die Graphen lassen sich entweder mithilfe der in CUDA 10 enthaltenen APIs erstellen oder aus Stream-basierten APIs entnehmen. Nähere Informationen zur Verwendung der Graph-APIs finden sich im CUDA Programming Guide.

CUDA-10-Graphen aus integrierter API (links) und aus Stream-basierter API (rechts). (Bild: Nvidia)

Die gleichzeitige Verwendung von Graphic- und Compute-APIs in einer Anwendung erfordert eine gut abgestimmte Ressourcennutzung, um beispielsweise Konflikte beim Speicherzugriff zu vermeiden. CUDA bot dafür bisher schon Interoperabilität mit OpenGL und DirectX (9, 10, 11). Im neuesten Release kommen nun auch die APIs von Vulkan und DirectX 12 hinzu, die ihrerseits Applikationen eine detaillierte Kontrolle von GPU-Ressourcen und der Ablaufplanung von Verarbeitungsprozessen erlauben. In CUDA 10 stehen Entwicklern neue Datentypen zur Verfügung, um beispielsweise aus Vulkan importierte Semaphoren cudaExternalSemaphore_t oder Memory Allocations cudaExternalMemory_t zu verkapseln.

Einen Überblick aller wichtigen Neuerungen in CUDA 10, unter anderen zu den Leistungsverbesserungen der Performance-Bibliotheken, fasst der Blog-Beitrag von Pramod Ramarao zusammen. Nähere Details zu den verschiedenen Aspekten will Nvidia Schritt für Schritt in weiteren Blog-Meldungen und im Rahmen des Developer Program nachreichen. CUDA 10 steht Entwicklern ab sofort zum Download zur Verfügung, für Linux, macOS und Windows. Darüber hinaus liegen in Nvidias GPU Cloud Registry und auf DockerHub Container mit CUDA 10 bereit. (map)