Beispiele für CUDA-Entwickler, die Funktionen im CUDA Toolkit demonstrieren. Diese Version unterstützt CUDA Toolkit 12.5.
In diesem Abschnitt werden nur die Versionshinweise für die CUDA-Beispiele auf GitHub beschrieben.
Laden Sie das CUDA Toolkit 12.5 für Ihre entsprechende Plattform herunter und installieren Sie es. Informationen zu den Systemanforderungen und Installationsanweisungen für das cuda Toolkit finden Sie im Linux-Installationshandbuch und im Windows-Installationshandbuch.
Klonen Sie mit git das Repository der CUDA-Beispiele mit dem folgenden Befehl.
git clone https://github.com/NVIDIA/cuda-samples.git
Ohne Git können Sie diese Beispiele am einfachsten verwenden, indem Sie die ZIP-Datei mit der aktuellen Version herunterladen, indem Sie auf der Repo-Seite auf die Schaltfläche „ZIP herunterladen“ klicken. Anschließend können Sie das gesamte Archiv entpacken und die Beispiele verwenden.
Die Windows-Beispiele werden mit der Visual Studio-IDE erstellt. Für jede unterstützte Version von Visual Studio werden Lösungsdateien (.sln) im folgenden Format bereitgestellt:
*_vs<version>.sln - for Visual Studio <version>
Vollständige Beispiellösungsdateien sind im übergeordneten Verzeichnis des Repos vorhanden:
Jedes einzelne Beispiel verfügt über einen eigenen Satz Lösungsdateien unter: <CUDA_SAMPLES_REPO>Samples<sample_dir>
Um alle Beispiele auf einmal zu erstellen/untersuchen, sollten die vollständigen Lösungsdateien verwendet werden. Zum Erstellen/Untersuchen eines einzelnen Beispiels sollten die einzelnen Beispiellösungsdateien verwendet werden.
Die Linux-Beispiele werden mithilfe von Makefiles erstellt. Um die Makefiles zu verwenden, ändern Sie das aktuelle Verzeichnis in das Beispielverzeichnis, das Sie erstellen möchten, und führen Sie make aus:
$ cd <sample_dir>
$ make
Die Beispiel-Makefiles können bestimmte Optionen nutzen:
TARGET_ARCH= – Cross-Compile, das auf eine bestimmte Architektur abzielt. Zulässige Architekturen sind x86_64, ppc64le, armv7l, aarch64. Standardmäßig ist TARGET_ARCH auf HOST_ARCH gesetzt. Auf einer x86_64-Maschine entspricht das Nichtfestlegen von TARGET_ARCH dem Festlegen von TARGET_ARCH=x86_64.
$ make TARGET_ARCH=x86_64
$ make TARGET_ARCH=ppc64le
$ make TARGET_ARCH=armv7l
$ make TARGET_ARCH=aarch64
Weitere Informationen zur plattformübergreifenden Kompilierung von Cuda-Beispielen finden Sie hier.
dbg=1 – Build mit Debug-Symbolen
$ make dbg=1
SMS="AB ..." – überschreibt die SM-Architekturen, für die das Beispiel erstellt wird, wobei "AB ..."
eine durch Leerzeichen getrennte Liste von SM-Architekturen ist. Um beispielsweise SASS für SM 50 und SM 60 zu generieren, verwenden Sie SMS="50 60"
.
$ make SMS="50 60"
HOST_COMPILER=<host_compiler> – überschreibt den Standard-G++-Host-Compiler. Eine Liste der unterstützten Host-Compiler finden Sie im Linux-Installationshandbuch.
$ make HOST_COMPILER=g++
Grundlegende CUDA-Beispiele für Anfänger, die Schlüsselkonzepte bei der Verwendung von CUDA und CUDA-Laufzeit-APIs veranschaulichen.
Dienstprogrammbeispiele, die veranschaulichen, wie Gerätefunktionen abgefragt und die GPU/CPU-Bandbreite gemessen werden.
Beispiele, die CUDA-bezogene Konzepte und gängige Problemlösungstechniken veranschaulichen.
Beispiele, die CUDA-Funktionen demonstrieren (kooperative Gruppen, dynamische CUDA-Parallelität, CUDA-Diagramme usw.).
Beispiele, die die Verwendung von CUDA-Plattformbibliotheken (NPP, NVJPEG, NVGRAPH cuBLAS, cuFFT, cuSPARSE, cuSOLVER und cuRAND) veranschaulichen.
Beispiele, die domänenspezifisch sind (Grafik, Finanzen, Bildverarbeitung).
Beispiele, die die Leistungsoptimierung demonstrieren.
Beispiele, die die Verwendung von libNVVVM und NVVM IR veranschaulichen.
Einige CUDA-Beispiele basieren zum Erstellen oder Ausführen auf Anwendungen und/oder Bibliotheken von Drittanbietern oder auf Funktionen, die vom CUDA Toolkit und dem CUDA-Treiber bereitgestellt werden. Diese Abhängigkeiten sind unten aufgeführt.
Wenn ein Beispiel über eine Drittanbieterabhängigkeit verfügt, die auf dem System verfügbar, aber nicht installiert ist, verzichtet das Beispiel zum Zeitpunkt der Erstellung auf sich selbst.
Die Abhängigkeiten jedes Beispiels sind im Abschnitt „Abhängigkeiten“ der README-Datei aufgeführt.
Diese Abhängigkeiten von Drittanbietern sind für einige CUDA-Beispiele erforderlich. Sofern verfügbar, werden diese Abhängigkeiten entweder automatisch auf Ihrem System installiert oder können über den Paketmanager Ihres Systems (Linux) oder eine Website eines Drittanbieters installiert werden.
FreeImage ist eine Open-Source-Bildbibliothek. FreeImage kann normalerweise unter Linux mit dem Paketmanagersystem Ihrer Distribution installiert werden. FreeImage kann auch von der FreeImage-Website heruntergeladen werden.
Um FreeImage auf einem Windows-System einzurichten, extrahieren Sie die FreeImage-DLL-Distribution in den Ordner ../../../Common/FreeImage/Dist/x64
sodass sie die .h- und .lib-Dateien enthält. Kopieren Sie die DLL-Datei in den Stammordner bin/win64/Debug
und bin/win64/Release
.
MPI (Message Passing Interface) ist eine API zur Kommunikation von Daten zwischen verteilten Prozessen. Ein MPI-Compiler kann mit dem Paketmanagersystem Ihrer Linux-Distribution installiert werden. Es ist auch auf einigen Online-Ressourcen verfügbar, beispielsweise auf Open MPI. Unter Windows kann man zum Erstellen und Ausführen von MPI-CUDA-Anwendungen das MS-MPI SDK installieren.
Einige Beispiele können nur auf einem 64-Bit-Betriebssystem ausgeführt werden.
DirectX ist eine Sammlung von APIs, die die Entwicklung von Multimediaanwendungen auf Microsoft-Plattformen ermöglichen sollen. Für Microsoft-Plattformen unterstützt der CUDA-Treiber von NVIDIA DirectX. Mehrere CUDA-Beispiele für Windows demonstrieren die CUDA-DirectX-Interoperabilität. Um solche Beispiele zu erstellen, muss Microsoft Visual Studio 2012 oder höher installiert werden, das Microsoft Windows SDK für Windows 8 bereitstellt.
DirectX 12 ist eine Sammlung fortschrittlicher Low-Level-Programmier-APIs, die den Treiberaufwand reduzieren können und die Entwicklung von Multimediaanwendungen auf Microsoft-Plattformen ab Windows 10 ermöglichen. Für Microsoft-Plattformen unterstützt der CUDA-Treiber von NVIDIA DirectX. Nur wenige CUDA-Beispiele für Windows demonstrieren die CUDA-DirectX12-Interoperabilität. Um solche Beispiele zu erstellen, muss Windows 10 SDK oder höher mit VS 2015 oder VS 2017 installiert werden.
OpenGL ist eine Grafikbibliothek, die für das 2D- und 3D-Rendering verwendet wird. Auf Systemen, die OpenGL unterstützen, wird die OpenGL-Implementierung von NVIDIA mit dem CUDA-Treiber bereitgestellt.
OpenGL ES ist eine Grafikbibliothek für eingebettete Systeme, die für 2D- und 3D-Rendering verwendet wird. Auf Systemen, die OpenGL ES unterstützen, wird die OpenGL ES-Implementierung von NVIDIA mit dem CUDA-Treiber bereitgestellt.
Vulkan ist eine plattformübergreifende 3D-Grafik- und Rechen-API mit geringem Overhead. Vulkan zielt auf leistungsstarke Echtzeit-3D-Grafikanwendungen wie Videospiele und interaktive Medien auf allen Plattformen ab. Auf Systemen, die Vulkan unterstützen, wird die Vulkan-Implementierung von NVIDIA mit dem CUDA-Treiber bereitgestellt. Zum Erstellen und Ausführen von Vulkan-Anwendungen muss das Vulkan SDK installiert werden.
OpenMP ist eine API für Multiprocessing-Programmierung. OpenMP kann mit dem Paketmanagersystem Ihrer Linux-Distribution installiert werden. Normalerweise ist GCC vorinstalliert. Es ist auch auf der OpenMP-Website zu finden.
Screen ist ein Fenstersystem des QNX-Betriebssystems. Screen ist normalerweise Teil des Root-Dateisystems.
X11 ist ein Fenstersystem, das häufig auf Betriebssystemen im *-nix-Stil zu finden ist. X11 kann mit dem Paketmanager Ihrer Linux-Distribution installiert werden und ist auf Mac OS X-Systemen vorinstalliert.
EGL ist eine Schnittstelle zwischen Khronos-Rendering-APIs (wie OpenGL, OpenGL ES oder OpenVG) und dem zugrunde liegenden nativen Plattform-Fenstersystem.
EGLOutput ist eine Reihe von EGL-Erweiterungen, die es EGL ermöglichen, direkt auf der Anzeige zu rendern.
EGLSync ist eine Reihe von EGL-Erweiterungen, die Synchronisierungsobjekte bereitstellen, die Synchronisierungsprimitive sind und Ereignisse darstellen, deren Abschluss getestet oder abgewartet werden kann.
NvSci ist eine Reihe von Kommunikationsschnittstellenbibliotheken, aus denen CUDA mit NvSciBuf und NvSciSync zusammenarbeitet. Mit NvSciBuf können Anwendungen Puffer im Speicher zuweisen und austauschen. Mit NvSciSync können Anwendungen Synchronisierungsobjekte verwalten, die den Beginn und das Ende von Operationssequenzen koordinieren.
NvMedia bietet eine leistungsstarke Verarbeitung von Multimediadaten für echte Hardwarebeschleunigung auf allen NVIDIA Tegra-Geräten. Anwendungen nutzen die NvMedia Application Programming Interface (API), um die Bild- und Videodaten zu verarbeiten.
Diese CUDA-Funktionen werden von einigen CUDA-Beispielen benötigt. Sie werden entweder vom CUDA Toolkit oder vom CUDA Driver bereitgestellt. Einige Funktionen sind möglicherweise auf Ihrem System nicht verfügbar.
CUFFT-Rückrufroutinen sind vom Benutzer bereitgestellte Kernelroutinen, die CUFFT beim Laden oder Speichern von Daten aufruft. Diese Rückrufroutinen sind nur auf Linux x86_64- und ppc64le-Systemen verfügbar.
Mit CDP (CUDA Dynamic Parallellism) können Kernel von Threads gestartet werden, die auf der GPU ausgeführt werden. CDP ist nur auf GPUs mit der SM-Architektur 3.5 oder höher verfügbar.
Multi Block Cooperative Groups (MBCG) erweitert Cooperative Groups und das CUDA-Programmiermodell, um die Synchronisation zwischen Thread-Blöcken auszudrücken. MBCG ist auf GPUs mit Pascal und höherer Architektur verfügbar.
Multi Device Cooperative Groups erweitert Cooperative Groups und das CUDA-Programmiermodell und ermöglicht Thread-Blöcken, die auf mehreren GPUs ausgeführt werden, bei der Ausführung zusammenzuarbeiten und sich zu synchronisieren. Diese Funktion ist auf GPUs mit Pascal und höherer Architektur verfügbar.
CUBLAS (CUDA Basic Linear Algebra Subroutines) ist eine GPU-beschleunigte Version der BLAS-Bibliothek.
IPC (Interprocess Communication) ermöglicht es Prozessen, Gerätezeiger gemeinsam zu nutzen.
CUFFT (CUDA Fast Fourier Transform) ist eine GPU-beschleunigte FFT-Bibliothek.
CURAND (CUDA Random Number Generation) ist eine GPU-beschleunigte RNG-Bibliothek.
CUSPARSE (CUDA Sparse Matrix) bietet lineare Algebra-Unterprogramme für Berechnungen mit dünn besetzten Matrizen.
Die CUSOLVER-Bibliothek ist ein High-Level-Paket, das auf den Bibliotheken CUBLAS und CUSPARSE basiert. Es vereint drei separate Bibliotheken unter einem einzigen Dach, die jeweils unabhängig oder zusammen mit anderen Toolkit-Bibliotheken verwendet werden können. Die Absicht von CUSOLVER besteht darin, nützliche LAPACK-ähnliche Funktionen bereitzustellen, wie z. B. gemeinsame Matrixfaktorisierung und Dreieckslösungsroutinen für dichte Matrizen, einen Löser für die Lösung kleinster Quadrate mit geringer Dichte und einen Eigenwertlöser. Darüber hinaus bietet cuSolver eine neue Refaktorisierungsbibliothek, die zum Lösen von Matrizensequenzen mit einem gemeinsamen Sparsity-Muster nützlich ist.
NPP (NVIDIA Performance Primitives) bietet GPU-beschleunigte Bild-, Video- und Signalverarbeitungsfunktionen.
NVGRAPH ist eine GPU-beschleunigte Grafikanalysebibliothek.
Die NVJPEG-Bibliothek bietet leistungsstarke, GPU-beschleunigte JPEG-Dekodierungsfunktionen für Bildformate, die häufig in Deep-Learning- und Hyperscale-Multimedia-Anwendungen verwendet werden.
NVRTC (CUDA RunTime Compilation) ist eine Laufzeitkompilierungsbibliothek für CUDA C++.
Stream-Prioritäten ermöglichen die Erstellung von Streams mit festgelegten Prioritäten. Stream-Prioritäten sind nur auf GPUs mit einer SM-Architektur von 3,5 oder höher verfügbar.
UVM (Unified Virtual Memory) ermöglicht Speicher, auf den sowohl die CPU als auch die GPU zugreifen können, ohne dass explizit zwischen beiden kopiert werden muss. UVM ist nur auf Linux- und Windows-Systemen verfügbar.
FP16 ist ein 16-Bit-Gleitkommaformat. Für das Vorzeichen wird ein Bit, für den Exponenten fünf Bits und für die Mantisse zehn Bits verwendet.
NVCC-Unterstützung von C++11-Funktionen.
Die libNVVM-Beispiele werden mit CMake 3.10 oder höher erstellt.
Wir freuen uns über Ihre Anregungen zu Problemen und Vorschläge für Muster. Derzeit nehmen wir keine Beiträge von der Öffentlichkeit an. Schauen Sie hier noch einmal vorbei, während wir unser Beitragsmodell weiterentwickeln.
Wir verwenden den Google C++ Style Guide für alle Quellen https://google.github.io/styleguide/cppguide.html
Antworten auf häufig gestellte Fragen zu CUDA finden Sie unter http://developer.nvidia.com/cuda-faq und in den Versionshinweisen zum CUDA Toolkit.