CUDA

Aus besserwiki.de
CUDA
Nvidia CUDA Logo.jpg
Entwickler(n) Nvidia
Erste Veröffentlichung 23. Juni 2007; vor 15 Jahren
Stabile Version
11.7.0 / 11. Mai 2022; vor 3 Monaten
Betriebssystem Windows, Linux
Plattform Unterstützte GPUs
Typ GPGPU
Lizenz Proprietär
Website entwickler.nvidia.de/cuda-zone

CUDA (oder Compute Unified Device Architecture) ist eine Plattform für parallele Berechnungen und eine Anwendungsprogrammierschnittstelle (API), die es Software ermöglicht, bestimmte Arten von Grafikverarbeitungseinheiten (GPUs) für die allgemeine Verarbeitung zu nutzen, ein Ansatz, der als General-Purpose Computing on GPUs (GPGPU) bezeichnet wird. CUDA ist eine Softwareschicht, die direkten Zugriff auf den virtuellen Befehlssatz des Grafikprozessors und die parallelen Rechenelemente für die Ausführung von Rechenkernen ermöglicht.

CUDA ist so konzipiert, dass es mit Programmiersprachen wie C, C++ und Fortran funktioniert. Im Gegensatz zu früheren APIs wie Direct3D und OpenGL, die fortgeschrittene Kenntnisse in der Grafikprogrammierung voraussetzten, erleichtert diese Zugänglichkeit die Nutzung von GPU-Ressourcen für Spezialisten der parallelen Programmierung. CUDA-betriebene Grafikprozessoren unterstützen auch Programmier-Frameworks wie OpenMP, OpenACC und OpenCL sowie HIP, indem sie solchen Code in CUDA kompilieren.

CUDA wurde von Nvidia entwickelt. Bei seiner Einführung war der Name ein Akronym für Compute Unified Device Architecture, aber Nvidia hat später auf die Verwendung des Akronyms verzichtet.

CUDA (früher auch Compute Unified Device Architecture genannt) ist eine von Nvidia entwickelte Programmierschnittstelle (API), mit der Programmteile durch den Grafikprozessor (GPU) abgearbeitet werden können. In Form der GPU wird zusätzliche Rechenkapazität bereitgestellt, wobei die GPU im Allgemeinen bei hochgradig parallelisierbaren Programmabläufen (hohe Datenparallelität) signifikant schneller arbeitet als die CPU. CUDA wird vor allem bei wissenschaftlichen und technischen Berechnungen eingesetzt.

Hintergrund

Die Grafikverarbeitungseinheit (GPU) ist ein spezialisierter Computerprozessor, der für rechenintensive Echtzeitaufgaben mit hochauflösender 3D-Grafik eingesetzt wird. Bis 2012 hatten sich die GPUs zu hochparallelen Multicore-Systemen entwickelt, die eine effiziente Bearbeitung großer Datenblöcke ermöglichen. Dieses Design ist für Algorithmen in Situationen, in denen große Datenblöcke parallel verarbeitet werden, effektiver als Allzweck-Zentraleinheiten (CPUs), z. B:

  • kryptografische Hash-Funktionen
  • maschinelles Lernen
  • Molekulardynamik-Simulationen
  • Physik-Engines
  • Sortieralgorithmen

Programmierfähigkeiten

Beispiel eines CUDA-Verarbeitungsablaufs
# Kopieren von Daten aus dem Hauptspeicher in den GPU-Speicher # Die CPU initiiert den GPU-Rechenkern # Die CUDA Kerne der GPU führen den Kernel parallel aus # Kopieren der resultierenden Daten aus dem GPU-Speicher in den Hauptspeicher

Die CUDA Plattform ist für Softwareentwickler über CUDA-beschleunigte Bibliotheken, Compiler-Direktiven wie OpenACC und Erweiterungen für Industriestandard-Programmiersprachen wie C, C++ und Fortran zugänglich. C/C++-Programmierer können "CUDA C/C++" verwenden, das mit nvcc, dem LLVM-basierten C/C++-Compiler von Nvidia, oder mit clang selbst nach PTX kompiliert wird. Fortran-Programmierer können "CUDA Fortran" verwenden, das mit dem PGI CUDA Fortran Compiler von The Portland Group kompiliert wurde.

Zusätzlich zu den Bibliotheken, Compiler-Direktiven, CUDA C/C++ und CUDA Fortran unterstützt die CUDA-Plattform auch andere Berechnungsschnittstellen, darunter OpenCL der Khronos Group, DirectCompute von Microsoft, OpenGL Compute Shader und C++ AMP. Wrapper von Drittanbietern sind auch für Python, Perl, Fortran, Java, Ruby, Lua, Common Lisp, Haskell, R, MATLAB, IDL, Julia und die native Unterstützung in Mathematica verfügbar.

In der Computerspielindustrie werden Grafikprozessoren für das Rendering von Grafiken und für physikalische Berechnungen (physikalische Effekte wie Trümmer, Rauch, Feuer, Flüssigkeiten) verwendet; Beispiele sind PhysX und Bullet. CUDA wurde auch eingesetzt, um nicht-grafische Anwendungen in der Computerbiologie, Kryptografie und anderen Bereichen um eine Größenordnung oder mehr zu beschleunigen.

CUDA bietet sowohl eine API auf niedriger Ebene (CUDA Driver API, nicht quelloffen) als auch eine API auf höherer Ebene (CUDA Runtime API, quelloffen). Das erste CUDA SDK wurde am 15. Februar 2007 für Microsoft Windows und Linux veröffentlicht. Die Unterstützung für Mac OS X wurde später in Version 2.0 hinzugefügt, die die am 14. Februar 2008 veröffentlichte Beta-Version ersetzt. CUDA funktioniert mit allen Nvidia-Grafikprozessoren ab der G8x-Serie, einschließlich GeForce, Quadro und der Tesla-Reihe. CUDA ist mit den meisten Standard-Betriebssystemen kompatibel.

CUDA 8.0 wird mit den folgenden Bibliotheken geliefert (für Kompilierung und Laufzeit, in alphabetischer Reihenfolge):

  • cuBLAS - CUDA Basic Linear Algebra Subroutines Bibliothek
  • CUDART - CUDA Laufzeitbibliothek
  • cuFFT - CUDA-Bibliothek für schnelle Fourier-Transformation
  • cuRAND - CUDA Zufallszahlengenerierungs-Bibliothek
  • cuSOLVER - CUDA-basierte Sammlung von dichten und spärlichen direkten Lösern
  • cuSPARSE - CUDA-Bibliothek für dünnbesetzte Matrizen
  • NPP - NVIDIA Performance Primitives Bibliothek
  • nvGRAPH - NVIDIA Graph-Analyse-Bibliothek
  • NVML - NVIDIA Verwaltungsbibliothek
  • NVRTC - NVIDIA Laufzeitkompilierungsbibliothek für CUDA C++

CUDA 8.0 wird mit diesen anderen Softwarekomponenten geliefert:

  • nView - NVIDIA nView Desktop-Verwaltungssoftware
  • NVWMI - NVIDIA Unternehmensverwaltungs-Toolkit
  • GameWorks PhysX - ist eine plattformübergreifende Spiele-Physik-Engine

CUDA 9.0-9.2 wird mit diesen anderen Komponenten geliefert:

  • CUTLASS 1.0 - benutzerdefinierte lineare Algebra-Algorithmen,
  • NVCUVID - der NVIDIA Video Decoder wurde in CUDA 9.2 veraltet; er ist jetzt im NVIDIA Video Codec SDK verfügbar

CUDA 10 wird mit diesen anderen Komponenten geliefert:

  • nvJPEG - Hybride (CPU und GPU) JPEG-Verarbeitung

CUDA 11.0-11.7 wird mit diesen anderen Komponenten ausgeliefert:

  • CUB ist eine der neuen unterstützten C++ Bibliotheken
  • MIG multi instance GPU Unterstützung
  • nvJPEG2000 - JPEG 2000 Kodierer und Dekodierer

Als CUVID (CUDA Video Decoding API) bezeichnet man eine Programmierschnittstelle für das Decodieren von Videos.

Vorteile

CUDA hat mehrere Vorteile gegenüber der traditionellen Allzweckberechnung auf GPUs (GPGPU) unter Verwendung von Grafik-APIs:

  • Verstreutes Lesen - Code kann von beliebigen Adressen im Speicher lesen.
  • Vereinheitlichter virtueller Speicher (CUDA 4.0 und höher)
  • Vereinheitlichter Speicher (CUDA 6.0 und höher)
  • Gemeinsamer Speicher - CUDA stellt einen schnellen gemeinsamen Speicherbereich zur Verfügung, der von Threads gemeinsam genutzt werden kann. Dieser kann als benutzerverwalteter Cache verwendet werden und ermöglicht eine höhere Bandbreite als bei der Verwendung von Textur-Lookups.
  • Schnellere Downloads und Lesevorgänge von und zur GPU
  • Volle Unterstützung für Integer- und bitweise Operationen, einschließlich Integer-Textur-Lookups
  • Bei Karten der RTX 20- und 30-Serie werden die CUDA Kerne für eine Funktion namens "RTX IO" verwendet, bei der die CUDA Kerne die Ladezeiten von Spielen drastisch verkürzen.

Beschränkungen

  • Unabhängig davon, ob es sich um den Host-Computer oder das GPU-Gerät handelt, wird der gesamte CUDA-Quellcode jetzt gemäß den C++-Syntaxregeln verarbeitet. Dies war nicht immer der Fall. Frühere Versionen von CUDA basierten auf C-Syntaxregeln. Wie im allgemeineren Fall der Kompilierung von C-Code mit einem C++-Compiler ist es daher möglich, dass alter C-Stil-CUDA-Quellcode entweder nicht kompiliert werden kann oder sich nicht wie ursprünglich vorgesehen verhält.
  • Die Interoperabilität mit Rendering-Sprachen wie OpenGL ist einseitig, wobei OpenGL Zugriff auf den registrierten CUDA-Speicher hat, CUDA aber keinen Zugriff auf den OpenGL-Speicher hat.
  • Das Kopieren zwischen Host- und Gerätespeicher kann aufgrund der Bandbreite des Systembusses und der Latenzzeit zu Leistungseinbußen führen (dies kann durch asynchrone Speicherübertragungen, die von der DMA-Engine der GPU abgewickelt werden, teilweise gemildert werden).
  • Für eine optimale Leistung sollten Threads in Gruppen von mindestens 32 Threads ausgeführt werden, wobei die Gesamtzahl der Threads in die Tausende gehen sollte. Verzweigungen im Programmcode wirken sich nicht wesentlich auf die Leistung aus, vorausgesetzt, dass jeder der 32 Threads denselben Ausführungspfad nimmt; das SIMD-Ausführungsmodell wird zu einer erheblichen Einschränkung für jede inhärent divergierende Aufgabe (z. B. Durchlaufen einer Datenstruktur mit Raumaufteilung während des Raytracing).
  • Für moderne Revisionen ist kein Emulator und keine Fallback-Funktionalität verfügbar.
  • Gültiges C++ kann manchmal markiert werden und die Kompilierung verhindern, da der Compiler die Optimierung für die Beschränkungen des Ziel-GPU-Geräts berücksichtigt.
  • C++-Laufzeittypinformationen (RTTI) und C++-ähnliche Ausnahmebehandlung werden nur im Hostcode, nicht aber im Gerätecode unterstützt.
  • In Single-Precision auf CUDA Compute Capability 1.x-Geräten der ersten Generation werden denormale Zahlen nicht unterstützt und stattdessen auf Null gesetzt, und die Genauigkeit der Divisions- und Quadratwurzeloperationen ist etwas geringer als die IEEE 754-konforme Single-Precision-Mathematik. Geräte, die Compute Capability 2.0 und höher unterstützen, unterstützen denormale Zahlen, und die Divisions- und Quadratwurzeloperationen sind standardmäßig IEEE 754-kompatibel. Benutzer können jedoch die zuvor schnellere Gaming-Grade-Mathematik von Compute-Capability-1.x-Geräten erhalten, wenn sie dies wünschen, indem sie Compiler-Flags setzen, um genaue Divisionen und genaue Quadratwurzeln zu deaktivieren, und das Flushing von denormalen Zahlen auf Null aktivieren.
  • Im Gegensatz zu OpenCL sind CUDA-fähige GPUs nur von Nvidia erhältlich. Zu den Versuchen, CUDA auf anderen GPUs zu implementieren, gehören:
    • Projekt Coriander: Konvertiert den CUDA C++11-Quellcode in OpenCL 1.2 C. Eine Abspaltung von CUDA-on-CL, um TensorFlow auszuführen.
    • CU2CL: Konvertiert CUDA 3.2 C++ nach OpenCL C.
    • GPUOpen HIP: Eine dünne Abstraktionsschicht über CUDA und ROCm für AMD und Nvidia GPUs. Verfügt über ein Konvertierungstool für den Import von CUDA C++-Quellen. Unterstützt CUDA 4.0 sowie C++11 und float16.

Unterstützte GPUs

Unterstützte CUDA-Level von GPU und Karte.

  • CUDA SDK 1.0 Unterstützung für Compute Capability 1.0 - 1.1 (Tesla)
  • CUDA SDK 1.1 Unterstützung für Compute Capability 1.0 - 1.1+x (Tesla)
  • CUDA SDK 2.0 Unterstützung für Compute Capability 1.0 - 1.1+x (Tesla)
  • CUDA SDK 2.1 - 2.3.1 Unterstützung für Compute Capability 1.0 - 1.3 (Tesla)
  • CUDA SDK 3.0 - 3.1 Unterstützung für die Rechenleistung 1.0 - 2.0 (Tesla, Fermi)
  • CUDA SDK 3.2 Unterstützung für Rechenleistung 1.0 - 2.1 (Tesla, Fermi)
  • CUDA SDK 4.0 - 4.2 Unterstützung für Compute Capability 1.0 - 2.1+x (Tesla, Fermi, mehr?).
  • CUDA SDK 5.0 - 5.5 Unterstützung für Rechenleistung 1.0 - 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.0 Unterstützung für Rechenleistung 1.0 - 3.5 (Tesla, Fermi, Kepler).
  • CUDA SDK 6.5 Unterstützung für Rechenleistung 1.1 - 5.x (Tesla, Fermi, Kepler, Maxwell). Letzte Version mit Unterstützung für Compute Capability 1.x (Tesla).
  • CUDA SDK 7.0 - 7.5 Unterstützung für Rechenleistung 2.0 - 5.x (Fermi, Kepler, Maxwell).
  • CUDA SDK 8.0 Unterstützung für Compute Capability 2.0 - 6.x (Fermi, Kepler, Maxwell, Pascal). Letzte Version mit Unterstützung für Compute Capability 2.x (Fermi) (Pascal GTX 1070Ti wird nicht unterstützt).
  • CUDA SDK 9.0 - 9.2 Unterstützung für Compute Capability 3.0 - 7.2 (Kepler, Maxwell, Pascal, Volta) (Pascal GTX 1070Ti wird nicht unterstützt. CUDA SDK 9.0 und CUDA SDK 9.2 werden unterstützt).
  • CUDA SDK 10.0 - 10.2 Unterstützung für Compute Capability 3.0 - 7.5 (Kepler, Maxwell, Pascal, Volta, Turing). Letzte Version mit Unterstützung für die Rechenleistung 3.x (Kepler). 10.2 ist die letzte offizielle Version für macOS, da die Unterstützung für macOS in neueren Versionen nicht mehr verfügbar sein wird.
  • CUDA SDK 11.0 Unterstützung für die Rechenleistung 3.5 - 8.0 (Kepler (teilweise), Maxwell, Pascal, Volta, Turing, Ampere (teilweise)).
  • CUDA SDK 11.1 - 11.7 Unterstützung für die Rechenleistung 3.5 - 8.6 (Kepler (teilweise), Maxwell, Pascal, Volta, Turing, Ampere).
Rechnen
Fähigkeit
(Version)
Mikro-
Architektur
GPUs GeForce Quadro, NVS Tesla/Datacenter Tegra,
Jetson,
DRIVE
1.0 Tesla G80 GeForce 8800 Ultra, GeForce 8800 GTX, GeForce 8800 GTS(G80) Quadro FX 5600, Quadro FX 4600, Quadro Plex 2100 S4 Tesla C870, Tesla D870, Tesla S870
1.1 G92, G94, G96, G98, G84, G86 GeForce GTS 250, GeForce 9800 GX2, GeForce 9800 GTX, GeForce 9800 GT, GeForce 8800 GTS(G92), GeForce 8800 GT, GeForce 9600 GT, GeForce 9500 GT, GeForce 9400 GT, GeForce 8600 GTS, GeForce 8600 GT, GeForce 8500 GT,
GeForce G110M, GeForce 9300M GS, GeForce 9200M GS, GeForce 9100M G, GeForce 8400M GT, GeForce G105M
Quadro FX 4700 X2, Quadro FX 3700, Quadro FX 1800, Quadro FX 1700, Quadro FX 580, Quadro FX 570, Quadro FX 470, Quadro FX 380, Quadro FX 370, Quadro FX 370 Low Profile, Quadro NVS 450, Quadro NVS 420, Quadro NVS 290, Quadro NVS 295, Quadro Plex 2100 D4,
Quadro FX 3800M, Quadro FX 3700M, Quadro FX 3600M, Quadro FX 2800M, Quadro FX 2700M, Quadro FX 1700M, Quadro FX 1600M, Quadro FX 770M, Quadro FX 570M, Quadro FX 370M, Quadro FX 360M, Quadro NVS 320M, Quadro NVS 160M, Quadro NVS 150M, Quadro NVS 140M, Quadro NVS 135M, Quadro NVS 130M, Quadro NVS 450, Quadro NVS 420, Quadro NVS 295
1.2 GT218, GT216, GT215 GeForce GT 340*, GeForce GT 330*, GeForce GT 320*, GeForce 315*, GeForce 310*, GeForce GT 240, GeForce GT 220, GeForce 210,
GeForce GTS 360M, GeForce GTS 350M, GeForce GT 335M, GeForce GT 330M, GeForce GT 325M, GeForce GT 240M, GeForce G210M, GeForce 310M, GeForce 305M
Quadro FX 380 Niedrigprofil, Quadro FX 1800M, Quadro FX 880M, Quadro FX 380M,
Nvidia NVS 300, NVS 5100M, NVS 3100M, NVS 2100M, ION
1.3 GT200, GT200b GeForce GTX 295, GTX 285, GTX 280, GeForce GTX 275, GeForce GTX 260 Quadro FX 5800, Quadro FX 4800, Quadro FX 4800 für Mac, Quadro FX 3800, Quadro CX, Quadro Plex 2200 D2 Tesla C1060, Tesla S1070, Tesla M1060
2.0 Fermi GF100, GF110 GeForce GTX 590, GeForce GTX 580, GeForce GTX 570, GeForce GTX 480, GeForce GTX 470, GeForce GTX 465,
GeForce GTX 480M
Quadro 6000, Quadro 5000, Quadro 4000, Quadro 4000 für Mac, Quadro Plex 7000,
Quadro 5010M, Quadro 5000M
Tesla C2075, Tesla C2050/C2070, Tesla M2050/M2070/M2075/M2090
2.1 GF104, GF106 GF108, GF114, GF116, GF117, GF119 GeForce GTX 560 Ti, GeForce GTX 550 Ti, GeForce GTX 460, GeForce GTS 450, GeForce GTS 450*, GeForce GT 640 (GDDR3), GeForce GT 630, GeForce GT 620, GeForce GT 610, GeForce GT 520, GeForce GT 440, GeForce GT 440*, GeForce GT 430, GeForce GT 430*, GeForce GT 420*,
GeForce GTX 675M, GeForce GTX 670M, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 720M, GeForce GT 620M, GeForce 710M, GeForce 610M, GeForce 820M, GeForce GTX 580M, GeForce GTX 570M, GeForce GTX 560M, GeForce GT 555M, GeForce GT 550M, GeForce GT 540M, GeForce GT 525M, GeForce GT 520MX, GeForce GT 520M, GeForce GTX 485M, GeForce GTX 470M, GeForce GTX 460M, GeForce GT 445M, GeForce GT 435M, GeForce GT 420M, GeForce GT 415M, GeForce 710M, GeForce 410M
Quadro 2000, Quadro 2000D, Quadro 600,
Quadro 4000M, Quadro 3000M, Quadro 2000M, Quadro 1000M,
NVS 310, NVS 315, NVS 5400M, NVS 5200M, NVS 4200M
3.0 Kepler GK104, GK106, GK107 GeForce GTX 770, GeForce GTX 760, GeForce GT 740, GeForce GTX 690, GeForce GTX 680, GeForce GTX 670, GeForce GTX 660 Ti, GeForce GTX 660, GeForce GTX 650 Ti BOOST, GeForce GTX 650 Ti, GeForce GTX 650,
GeForce GTX 880M, GeForce GTX 870M, GeForce GTX 780M, GeForce GTX 770M, GeForce GTX 765M, GeForce GTX 760M, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GeForce GTX 660M, GeForce GT 750M, GeForce GT 650M, GeForce GT 745M, GeForce GT 645M, GeForce GT 740M, GeForce GT 730M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 735M, GeForce GT 730M
Quadro K5000, Quadro K4200, Quadro K4000, Quadro K2000, Quadro K2000D, Quadro K600, Quadro K420,
Quadro K500M, Quadro K510M, Quadro K610M, Quadro K1000M, Quadro K2000M, Quadro K1100M, Quadro K2100M, Quadro K3000M, Quadro K3100M, Quadro K4000M, Quadro K5000M, Quadro K4100M, Quadro K5100M,
NVS 510, Quadro 410
Tesla K10, GRID K340, GRID K520, GRID K2
3.2 GK20A Tegra K1,
Jetson TK1
3.5 GK110, GK208 GeForce GTX Titan Z, GeForce GTX Titan Black, GeForce GTX Titan, GeForce GTX 780 Ti, GeForce GTX 780, GeForce GT 640 (GDDR5), GeForce GT 630 v2, GeForce GT 730, GeForce GT 720, GeForce GT 710, GeForce GT 740M (64-bit, DDR3), GeForce GT 920M Quadro K6000, Quadro K5200 Tesla K40, Tesla K20x, Tesla K20
3.7 GK210 Tesla K80
5.0 Maxwell GM107, GM108 GeForce GTX 750 Ti, GeForce GTX 750, GeForce GTX 960M, GeForce GTX 950M, GeForce 940M, GeForce 930M, GeForce GTX 860M, GeForce GTX 850M, GeForce 845M, GeForce 840M, GeForce 830M Quadro K1200, Quadro K2200, Quadro K620, Quadro M2000M, Quadro M1000M, Quadro M600M, Quadro K620M, NVS 810 Tesla M10
5.2 GM200, GM204, GM206 GeForce GTX Titan X, GeForce GTX 980 Ti, GeForce GTX 980, GeForce GTX 970, GeForce GTX 960, GeForce GTX 950, GeForce GTX 750 SE,
GeForce GTX 980M, GeForce GTX 970M, GeForce GTX 965M
Quadro M6000 24GB, Quadro M6000, Quadro M5000, Quadro M4000, Quadro M2000, Quadro M5500,
Quadro M5000M, Quadro M4000M, Quadro M3000M
Tesla M4, Tesla M40, Tesla M6, Tesla M60
5.3 GM20B Tegra X1,
Jetson TX1,
Jetson Nano,
DRIVE CX,
DRIVE PX
6.0 Pascal GP100 Quadro GP100 Tesla P100
6.1 GP102, GP104, GP106, GP107, GP108 Nvidia TITAN Xp, Titan X,
GeForce GTX 1080 Ti, GTX 1080, GTX 1070 Ti, GTX 1070, GTX 1060,
GTX 1050 Ti, GTX 1050, GT 1030, GT 1010,
MX350, MX330, MX250, MX230, MX150, MX130, MX110
Quadro P6000, Quadro P5000, Quadro P4000, Quadro P2200, Quadro P2000, Quadro P1000, Quadro P400, Quadro P500, Quadro P520, Quadro P600,
Quadro P5000(Mobil), Quadro P4000(Mobil), Quadro P3000(Mobil)
Tesla P40, Tesla P6, Tesla P4
6.2 GP10B Tegra X2, Jetson TX2, DRIVE PX 2
7.0 Volta GV100 NVIDIA TITAN V Quadro GV100 Tesla V100, Tesla V100S
7.2 GV10B

GV11B

Tegra Xavier,
Jetson Xavier NX,
Jetson AGX Xavier,
DRIVE AGX Xavier,
DRIVE AGX Pegasus,
Clara AGX
7.5 Turing TU102, TU104, TU106, TU116, TU117 NVIDIA TITAN RTX,
GeForce RTX 2080 Ti, RTX 2080 Super, RTX 2080, RTX 2070 Super, RTX 2070, RTX 2060 Super, RTX 2060 12GB, RTX 2060,
GeForce GTX 1660 Ti, GTX 1660 Super, GTX 1660, GTX 1650 Super, GTX 1650, MX550, MX450
Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Quadro RTX 4000, T1000, T600, T400
T1200(mobil), T600(mobil), T500(mobil), Quadro T2000(mobil), Quadro T1000(mobil)
Tesla T4
8.0 Ampere GA100 A100 80GB, A100 40GB, A30
8.6 GA102, GA103, GA104, GA106, GA107 GeForce RTX 3090 Ti, RTX 3090, RTX 3080 Ti, RTX 3080 12GB, RTX 3080, RTX 3070 Ti, RTX 3070, RTX 3060 Ti, RTX 3060, RTX 3050, RTX 3050 Ti(mobile), RTX 3050(mobile), RTX 2050(mobile), MX570 RTX A6000, RTX A5500, RTX A5000, RTX A4500, RTX A4000, RTX A2000
RTX A5000(mobil), RTX A4000(mobil), RTX A3000(mobil), RTX A2000(mobil)
A40, A16, A10, A2
8.7 GA10B Jetson Orin NX,
Jetson AGX Orin,
DRIVE AGX Orin,
DRIVE AGX Pegasus OA,
Clara Holoscan
9.0 Bunker GH100 H100
9.x Lovelace AD102, AD104, AD106, AD107
9.x AD10B
Rechnen
Fähigkeit
(Version)
Mikro-
Architektur
GPUs GeForce Quadro, NVS Tesla/Datacenter Tegra,
Jetson,
DRIVE

'*' - Nur OEM-Produkte

Versionsmerkmale und Spezifikationen

Funktionsunterstützung (nicht aufgeführte Funktionen werden für alle Rechenkapazitäten unterstützt) Rechenleistung (Version)
1.0 1.1 1.2 1.3 2.x 3.0 3.2 3.5, 3.7, 5.0, 5.2 5.3 6.x 7.x 8.0 8.6 9.0 9.x
Ganzzahlige atomare Funktionen, die auf 32-Bit-Wörtern im globalen Speicher arbeiten Nein Ja
atomicExch(), die auf 32-Bit-Gleitkommawerten im globalen Speicher arbeiten
Ganzzahlige atomare Funktionen, die mit 32-Bit-Wörtern im gemeinsamen Speicher arbeiten Nein Ja
atomicExch() arbeitet mit 32-Bit Fließkommazahlen im gemeinsamen Speicher
Ganzzahlige atomare Funktionen, die mit 64-Bit-Wörtern im globalen Speicher arbeiten
Warp-Vote-Funktionen
Doppelt genaue Gleitkomma-Operationen Nein Ja
Atomare Funktionen, die mit 64-Bit-Ganzzahlwerten im gemeinsamen Speicher arbeiten Nein Ja
Atomare Fließkomma-Additionen, die auf 32-Bit-Worte im globalen und gemeinsamen Speicher wirken
Abstimmung()
Threadfence_system()
_syncthreads_count(), _syncthreads_and(), _syncthreads_or()
Oberflächenfunktionen
3D-Gitter von Thread-Blöcken
Warp-Shuffle-Funktionen, vereinheitlichter Speicher Nein Ja
Trichterverschiebung Nein Ja
Dynamische Parallelität Nein Ja
Halbgenaue Gleitkommaoperationen:
Addition, Subtraktion, Multiplikation, Vergleich, Warp-Shuffle-Funktionen, Konvertierung
Nein Ja
Atomare Addition auf 64-Bit-Gleitkommawerten im globalen Speicher und im gemeinsamen Speicher Nein Ja
Tensor-Kern Nein Ja
Warp-Matrix-Funktionen mit gemischter Genauigkeit Nein Ja
Hardware-beschleunigtes asynchrones Kopieren Nein Ja
Hardware-beschleunigte geteilte Ankunfts-/Warteschranke Nein Ja
Verwaltung der L2-Cache-Residenz Nein Ja
Funktionsunterstützung (nicht aufgeführte Funktionen werden für alle Rechenkapazitäten unterstützt) 1.0 1.1 1.2 1.3 2.x 3.0 3.2 3.5, 3.7, 5.0, 5.2 5.3 6.x 7.x 8.0 8.6 9.0 9.x
Rechenleistung (Version)
Daten Typ Operation Unterstützt seit Unterstützt seit
für globalen Speicher
Unterstützt seit
für gemeinsamen Speicher
16-Bit-Ganzzahl allgemeine Operationen
32-Bit-Ganzzahl atomare Funktionen 1.1 1.2
64-Bit-Ganzzahl atomare Funktionen 1.2 2.0
16-Bit-Gleitkomma Addition, Subtraktion,
Multiplikation, Vergleich,
Warp-Shuffle-Funktionen, Konvertierung
5.3
32-Bit-Gleitkomma atomicExch() 1.1 1.2
32-Bit-Gleitkomma Atomare Addition 2.0 2.0
64-Bit Fließkomma allgemeine Operationen 1.3
64-Bit Fließkomma Atomare Addition 6.0 6.0
Tensorkern 7.0

Hinweis: Fehlende Zeilen oder leere Einträge spiegeln einen Mangel an Informationen über genau diesen Punkt wider.

Daten Typ Unterstützt seit
für dichte Matrizen
Unterstützt seit
für spärliche Matrizen
Volta/Professional Turing
FMA pro Zyklus pro Tensorkern
(8 Tensor-Kerne/SM)
Verbraucher Turing
FMA pro Zyklus pro Tensorkern
(8 Tensor-Kerne/SM)
Profi-Ampere/Orin
FMA pro Zyklus pro Tensorkern
(4 Tensor-Kerne/SM)
Verbraucher Ampere
FMA pro Zyklus pro Tensorkern
(4 Tensor-Kerne/SM)
Bunker
FMA pro Zyklus pro Tensorkern
(4 Tensor-Kerne/SM)
1-Bit-Werte 7.5 - 1024 1024 4096 2048 -
4-Bit-Ganzzahlen 7.5 8.0 256 256 1024 512 -
8-Bit Ganzzahlen 7.2 8.0 128 128 512 256 1024
8-Bit Gleitkomma FP8 (E4M3 und E5M2) mit FP16 akkumulieren 9.0 9.0 - - - - 1024
8-Bit Fließkomma FP8 (E4M3 und E5M2) mit FP32 akkumulieren 9.0 9.0 - - - - 1024
16-Bit Fließkomma FP16 mit FP16 akkumulieren 7.0 8.0 64 64 256 128 512
16-Bit Fließkomma FP16 mit FP32 akkumulieren 7.0 8.0 64 32 256 64 512
16-Bit Fließkomma BF16 mit FP32 akkumulieren 8.0 8.0 - - 256 64 512
32-Bit-Gleitkomma (19 Bits verwendet) TF32 8.0 8.0 - - 128 32 256
64-Bit Fließkomma 8.0 - - - 16 32

Hinweis: Fehlende Zeilen oder leere Einträge spiegeln einen Mangel an Informationen über genau diesen Punkt wider.

Technische Daten Rechenleistung (Version)
1.0 1.1 1.2 1.3 2.x 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.1 6.2 7.0 7.2 7.5 8.0 8.6 9.0 9.x
Maximale Anzahl von residenten Gittern pro Gerät
(gleichzeitige Kernel-Ausführung)
t.b.d. 16 4 32 16 128 32 16 128 16 128
Maximale Dimensionalität eines Gitters von Thread-Blöcken 2 3
Maximale x-Dimension eines Gitters von Fadenblöcken 65535 231 − 1
Maximale y- oder z-Dimension eines Gitters von Fadenblöcken 65535
Maximale Dimensionalität eines Fadenblocks 3
Maximale x- oder y-Abmessung eines Blocks 512 1024
Maximale z-Dimension eines Blocks 64
Maximale Anzahl von Fäden pro Block 512 1024
Warp-Größe 32
Maximale Anzahl von residenten Blöcken pro Multiprozessor 8 16 32 16 32 16
Maximale Anzahl residenter Warps pro Multiprozessor 24 32 48 64 32 64 48
Maximale Anzahl von residenten Threads pro Multiprozessor 768 1024 1536 2048 1024 2048 1536
Anzahl der 32-Bit-Register pro Multiprozessor 8 K 16 K 32 K 64 K 128 K 64 K
Maximale Anzahl von 32-Bit-Registern pro Thread-Block 32 K 64 K 32 K 64 K 32 K 64 K 32 K 64 K
Maximale Anzahl von 32-Bit-Registern pro Thread 124 63 255
Maximale Menge an gemeinsamem Speicher pro Multiprozessor 16 KB 48 KB 112 KB 64 KB 96 KB 64 KB 96 KB 64 KB 96 KB
(von 128)
64 KB
(von 96)
164 KB
(von 192)
100 KB
(von 128)
Maximale Menge an gemeinsamem Speicher pro Thread-Block 48 KB 96 KB 48 KB 64 KB 163 KB 99 KB
Anzahl der gemeinsam genutzten Speicherbänke 16 32
Menge des lokalen Speichers pro Thread 16 KB 512 KB
Größe des konstanten Speichers 64 KB
Cache-Arbeitsspeicher pro Multiprozessor für konstanten Speicher 8 KB 4 KB 8 KB
Cache-Arbeitsspeicher pro Multiprozessor für Texturspeicher 6 - 8 KB 12 KB 12 - 48 KB 24 KB 48 KB 24 KB 48 KB 24 KB 32 - 128 KB 32 - 64 KB 28 - 192 KB 28 - 128 KB
Maximale Breite für 1D-Texturreferenzen, die an ein CUDA
Array gebunden
8192 65536 131072
Maximale Breite für eine 1D-Texturreferenz, die an einen linearen
Speicher gebunden
227 228 227 228 227 228
Maximale Breite und Anzahl der Schichten für eine 1D-geschichtete
Textur-Referenz
8192 × 512 16384 × 2048 32768 x 2048
Maximale Breite und Höhe für eine 2D-Texturreferenz, die an ein
an ein CUDA-Array
65536 × 32768 65536 × 65535 131072 x 65536
Maximale Breite und Höhe für eine 2D-Texturreferenz, die an ein
an einen linearen Speicher
65000 x 65000 65536 x 65536 131072 x 65000
Maximale Breite und Höhe für eine 2D-Texturreferenz, die an ein
an ein CUDA-Array, das Textur-Gathering unterstützt
16384 x 16384 32768 x 32768
Maximale Breite, Höhe und Anzahl der Schichten für eine 2D
geschichtete Textur-Referenz
8192 × 8192 × 512 16384 × 16384 × 2048 32768 x 32768 x 2048
Maximale Breite, Höhe und Tiefe für eine 3D-Textur
Referenz, die an linearen Speicher oder ein CUDA-Array gebunden ist
20483 40963 163843
Maximale Breite (und Höhe) für eine Cubemap-Texturreferenz 16384 32768
Maximale Breite (und Höhe) und Anzahl der Schichten
für eine Cubemap-Texturreferenz mit Schichten
16384 × 2046 32768 × 2046
Maximale Anzahl von Texturen, die an einen Kernel gebunden werden können
Kernel
128 256
Maximale Breite für eine 1D-Oberflächenreferenz, die an ein
CUDA-Array
Nicht
unterstützt
65536 16384 32768
Maximale Breite und Anzahl der Schichten für eine 1D-geschichtete
Oberflächenreferenz
65536 × 2048 16384 × 2048 32768 × 2048
Maximale Breite und Höhe für eine 2D-Flächenreferenz
gebunden an ein CUDA-Array
65536 × 32768 16384 × 65536 131072 × 65536
Maximale Breite, Höhe und Anzahl der Schichten für eine 2D
geschichtete Oberflächenreferenz
65536 × 32768 × 2048 16384 × 16384 × 2048 32768 × 32768 × 2048
Maximale Breite, Höhe und Tiefe für eine 3D-Oberfläche
Referenz, die an ein CUDA-Array gebunden ist
65536 × 32768 × 2048 4096 × 4096 × 4096 16384 × 16384 × 16384
Maximale Breite (und Höhe) für eine an ein CUDA-Array gebundene Cubemap-Oberflächenreferenz 32768 16384 32768
Maximale Breite und Anzahl der Ebenen für eine Cubemap
geschichtete Oberflächenreferenz
32768 × 2046 16384 × 2046 32768 × 2046
Maximale Anzahl von Oberflächen, die an ein Array gebunden werden können
Kernel
8 16 32
Maximale Anzahl von Anweisungen pro Kernel 2 Millionen 512 Millionen
Technische Daten 1.0 1.1 1.2 1.3 2.x 3.0 3.2 3.5 3.7 5.0 5.2 5.3 6.0 6.1 6.2 7.0 7.2 7.5 8.0 8.6 9.0 9.x
Rechenleistung (Version)
Spezifikationen der Architektur Rechenleistung (Version)
1.0 1.1 1.2 1.3 2.0 2.1 3.0 3.5 3.7 5.0 5.2 6.0 6.1, 6.2 7.0, 7.2 7.5 8.0 8.6 9.0 9.x
Anzahl der ALU-Spuren für Ganzzahl- und Gleitkomma-Arithmetikoperationen mit einfacher Genauigkeit 8 32 48 192 128 64 128 64
Anzahl der speziellen Funktionseinheiten für transzendente Funktionen mit einfacher Genauigkeit und Gleitkomma 2 4 8 32 16 32 16
Anzahl der Textur-Filtereinheiten für jede Textur-Adresseinheit oder Render-Output-Einheit (ROP) 2 4 8 16 8
Anzahl von Warp-Schedulern 1 2 4 2 4
Maximale Anzahl von Anweisungen, die von einem einzelnen Scheduler gleichzeitig ausgegeben werden 1 2 1
Anzahl der Tensor-Kerne 8 4
Größe des vereinheitlichten Speichers in KB für Daten-Cache und gemeinsamen Speicher pro Multiprozessor t.b.d. 128 96 192 128

Für weitere Informationen lesen Sie bitte das Nvidia CUDA Programmierhandbuch.

Beispiel

Dieser Beispielcode in C++ lädt eine Textur aus einem Bild in ein Array auf der GPU:

Nachfolgend ein Beispiel in Python, das das Produkt zweier Arrays auf der GPU berechnet. Die inoffiziellen Python-Sprachbindungen können von PyCUDA bezogen werden.

Zusätzliche Python-Bindungen zur Vereinfachung von Matrix-Multiplikationsoperationen finden Sie im Programm pycublas.

während CuPy direkt NumPy ersetzt:

Aktuelle und zukünftige Anwendungen der CUDA Architektur

  • Beschleunigtes Rendering von 3D-Grafiken
  • Beschleunigte Interkonvertierung von Videodateiformaten
  • Beschleunigte Verschlüsselung, Entschlüsselung und Komprimierung
  • Bioinformatik, z. B. NGS-DNA-Sequenzierung BarraCUDA
  • Verteilte Berechnungen, wie z. B. die Vorhersage der nativen Konformation von Proteinen
  • Simulationen für medizinische Analysen, z. B. virtuelle Realität auf der Grundlage von CT- und MRT-Bildern
  • Physikalische Simulationen, insbesondere in der Fluiddynamik
  • Training neuronaler Netze bei Problemen des maschinellen Lernens
  • Gesichtserkennung
  • Projekte für verteiltes Rechnen, wie SETI@home und andere Projekte, die BOINC nutzen
  • Molekulare Dynamik
  • Schürfen von Kryptowährungen
  • Struktur aus Bewegung (SfM) Software

Alternativen

Beispiele für andere GPGPU-Lösungen:

  • OpenCL ist ein von der Khronos Group initiierter offener Standard, der für alle Grafikkarten funktioniert und für die meisten Betriebssysteme verfügbar ist.
  • Der ebenfalls von der Khronos Group entwickelte offene Vulkan-Standard unterstützt ebenfalls OpenCL ähnliche Compute-Shader.
  • DirectCompute: eine in die DirectX-API integrierte Schnittstelle für GPGPUs von Microsoft

Kritik, Nachteile

Grafikprozessoren (GPUs) sind Prozessoren mit einem anwendungsspezifischen Design, daher kennen GPUs eher exotische Datentypen wie 9 Bit oder 12 Bit mit Festkommastelle, verzichten hingegen aber häufig auf die für Allzweck-CPUs und FPUs üblichen Registerbreiten von 32, 48, 64 oder 80 Bit (usw.). Somit sind Berechnungen, beispielsweise mit den Genauigkeiten nach IEEE 754 (64 Bit für double precision), häufig nicht im Befehlssatz der GPU vorgesehen und müssen relativ aufwendig per Software emuliert werden. Daher eignen sich GPUs vor allem zur Berechnung von Datentypen, die mit vergleichsweise geringen Bit-Breiten arbeiten.

Zum aktuellen Stand (2010) fertigen erste Hersteller bereits erweiterte GPUs, die neben den von der GPU benötigten Datentypen auch universelle Datentypen und Operationen z. B. zur direkten Berechnung IEEE 754 konformer Ergebnisse beinhalten. Als einer der aktuell führenden Hersteller stellt Nvidia mit der Fermi-Generation GPUs bereit, die sowohl 32-Bit-Integer, als auch einfach- und doppelt-genaue Gleitkomma-Datenformate nativ bereitstellen (float/double).

Ein anderer Nachteil ist die Anbindung an die Rechnerarchitektur, sie erfolgt bei aktuellen GPUs meist über PCIe und bringt, im Vergleich zur direkten Anbindung von Prozessoren, schlechtere (höhere) Latenzzeiten und geringere I/O-Durchsatzraten mit sich. Daher lohnt die Auslagerung nur bei Funktionen mit einigem Rechenaufwand – besonders dann, wenn eine GPU für diese Aufgaben vom Befehlssatz her (z. B. für große Matrizen) besser geeignet ist.

Weiter wird die feste Bindung an einen Hersteller kritisiert. Nutzt man CUDA, im Unterschied zu Bibliotheken für CPUs mit MMX- oder SSE-Erweiterungen (die praktisch auf allen CPUs der verschiedenen Hersteller von x86-Prozessoren laufen), so bindet man ein Programm an den GPU-Hersteller Nvidia und somit an das Vorhandensein von Nvidia-Hardware. Das inzwischen auf Vulkan/SPIR-V abgestützte OpenCL ist universeller und bietet eine Implementierung für GPUs von Nvidia, AMD (vormals ATI), VIA, S3 und Anderen. Dazu ist eine CPU-Unterstützung für x86-Prozessoren über die SSE3-Erweiterungen implementiert, weiter bietet IBM eine OpenCL-Implementierung für die Power-Architektur und die Cell Broadband Engine an. Aus dem breiteren Ansatz von OpenCL ergibt sich im Vergleich von CUDA mit OpenCL (auf identischer Nvidia-Hardware) allerdings ein merklicher Performance-Nachteil. Bei der Verwendung von OpenCL sind je nach Problemstellung Einbußen zwischen 5 und 50 % zu beobachten.