GPU

Einführung in die GPU-Programmierung

Einführung in die GPU-Programmierung

Universal-Computing auf einer GPU (Graphics Processing Unit), besser bekannt als GPU-Programmierung, ist die Verwendung einer GPU zusammen mit einer CPU (Central Processing Unit), um die Berechnung in Anwendungen zu beschleunigen, die traditionell nur von der CPU verwaltet werden.Obwohl die GPU-Programmierung erst in den letzten zwei Jahrzehnten praktisch realisierbar war, umfassen ihre Anwendungen heute praktisch jede Branche. GPU-Programmierung wurde beispielsweise verwendet, um die Video-, digitale Bild- und Audiosignalverarbeitung, statistische Physik, wissenschaftliches Rechnen, medizinische Bildgebung, Computer Vision, neuronale Netze und Deep Learning, Kryptographie und sogar Intrusion Detection und viele andere Bereiche zu beschleunigen.

Dieser Artikel dient als theoretische Einführung und richtet sich an alle, die lernen möchten, wie man GPU-beschleunigte Programme schreibt, sowie an alle, die nur ein allgemeines Interesse an diesem faszinierenden Thema haben.

Der Unterschied zwischen einer GPU und einer CPU

Lange bevor hochauflösende 3D-Grafiken mit hoher Wiedergabetreue zur Norm wurden, hatten die meisten Computer keine GPU. Stattdessen führte die CPU alle Anweisungen von Computerprogrammen aus, indem sie die grundlegenden arithmetischen, logischen, Steuerungs- und Eingabe-/Ausgabe-(E/A)-Operationen durchführte, die durch die Anweisungen spezifiziert sind. Aus diesem Grund wird die CPU oft als das Gehirn des Computers bezeichnet.

Aber in den letzten Jahren hat die GPU, die die Erstellung von Bildern für die Ausgabe auf einem Anzeigegerät beschleunigen soll, der CPU oft dabei geholfen, Probleme in Bereichen zu lösen, die zuvor ausschließlich von der CPU bearbeitet wurden.

Der Grafikkartenhersteller Nvidia bietet eine einfache Möglichkeit, den grundlegenden Unterschied zwischen einer GPU und einer CPU zu verstehen: „Eine CPU besteht aus wenigen Kernen, die für die sequentielle serielle Verarbeitung optimiert sind, während eine GPU eine massiv parallele Architektur hat, die aus Tausenden von kleineren, effizienteren besteht Kerne für die gleichzeitige Bearbeitung mehrerer Aufgaben.”

Die Möglichkeit, mehrere Aufgaben gleichzeitig zu bearbeiten, macht GPUs für einige Aufgaben wie die Suche nach einem Wort in einem Dokument sehr gut geeignet, während andere Aufgaben wie die Berechnung der Fibonacci-Folge überhaupt nicht von der parallelen Verarbeitung profitieren.

Zu den Aufgaben, die von der parallelen Verarbeitung erheblich profitieren, gehört jedoch Deep Learning, eine der gefragtesten Fähigkeiten in der heutigen Technik. Deep-Learning-Algorithmen ahmen die Aktivität in Schichten von Neuronen im Neocortex nach, sodass Maschinen lernen, Sprache zu verstehen, Muster zu erkennen oder Musik zu komponieren.

Aufgrund der wachsenden Bedeutung von künstlicher Intelligenz ist die Nachfrage nach Entwicklern, die das allgemeine Computing auf einer GPU verstehen, gestiegen.

CUDA im Vergleich zu OpenCL im Vergleich zu OpenACC

Da GPUs Rechenprobleme in Form von Grafikprimitiven verstehen, mussten frühe Bemühungen, GPUs als Allzweckprozessoren zu verwenden, Rechenprobleme in der Sprache von Grafikkarten umformulieren.

Glücklicherweise ist GPU-beschleunigtes Computing dank paralleler Computing-Plattformen wie Nvidias CUDA, OpenCL oder OpenACC jetzt viel einfacher. Diese Plattformen ermöglichen es Entwicklern, die Sprachbarriere zwischen CPU und GPU zu ignorieren und sich stattdessen auf übergeordnete Computing-Konzepte zu konzentrieren.

CUDA

CUDA (Compute Unified Device Architecture) wurde ursprünglich 2007 von Nvidia veröffentlicht und ist heute das dominierende proprietäre Framework. „Mit CUDA sind Entwickler in der Lage, Computing-Anwendungen drastisch zu beschleunigen, indem sie die Leistung von GPUs nutzen“, beschreibt das Framework Nvidia.

Entwickler können CUDA aus Programmiersprachen wie C, C++, Fortran oder Python ohne Kenntnisse in der Grafikprogrammierung aufrufen. Darüber hinaus enthält das CUDA Toolkit von Nvidia alles, was Entwickler benötigen, um GPU-beschleunigte Anwendungen zu erstellen, die ihre CPU-gebundenen Gegenstücke deutlich übertreffen.

Das CUDA SDK ist für Microsoft Windows, Linux und macOS verfügbar. die CUDA-Plattform unterstützt auch andere Computerschnittstellen, einschließlich OpenCL, DirectCompute von Microsoft, OpenGL Compute Shaders und C++ AMP.

OpenCL

OpenCL wurde ursprünglich 2009 von der Khronos Group veröffentlicht und ist der beliebteste offene, gebührenfreie Standard für plattformübergreifende, parallele Programmierung. Laut der Khronos Group verbessert OpenCL die Geschwindigkeit und Reaktionsfähigkeit eines breiten Spektrums von Anwendungen in zahlreichen Marktkategorien, darunter Spiele- und Unterhaltungstitel, wissenschaftliche und medizinische Software, professionelle Kreativwerkzeuge, Bildverarbeitung sowie neuronales Netzwerktraining und Inferencing.”

OpenCL wurde bisher von Altera, AMD, Apple, ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx und ZiiLABS implementiert und unterstützt alle gängigen Betriebssysteme auf allen wichtigen Plattformen extrem vielseitig. OpenCL definiert eine C-ähnliche Sprache zum Schreiben von Programmen, aber es gibt APIs von Drittanbietern für andere Programmiersprachen und Plattformen wie Python oder Java.

OpenACC

OpenACC ist der jüngste Programmierstandard für paralleles Rechnen, der in diesem Artikel beschrieben wird. Es wurde ursprünglich im Jahr 2015 von einer Gruppe von Unternehmen, bestehend aus Cray, CAPS, Nvidia und PGI (der Portland Group), veröffentlicht, um die parallele Programmierung von heterogenen CPU/GPU-Systemen zu vereinfachen.

„OpenACC ist ein benutzergesteuertes, direktivenbasiertes, leistungsportables paralleles Programmiermodell, das für Wissenschaftler und Ingenieure entwickelt wurde, die ihre Codes auf eine Vielzahl von heterogenen HPC-Hardwareplattformen und -architekturen mit deutlich weniger Programmieraufwand als bei einer Low-Level-Version portieren möchten Modell-.,“ erklärt OpenACC auf seiner offiziellen Website.

Entwickler, die sich für OpenACC interessieren, können C-, C++- und Fortran-Quellcode kommentieren, um der GPU mitzuteilen, welche Bereiche beschleunigt werden sollen. Ziel ist es, ein Modell für die Beschleunigerprogrammierung bereitzustellen, das über Betriebssysteme und verschiedene Arten von Host-CPUs und Beschleunigern portierbar ist.

Welches soll ich verwenden?

Die Wahl zwischen diesen drei parallelen Computing-Plattformen hängt von Ihren Zielen und der Umgebung ab, in der Sie arbeiten. CUDA wird zum Beispiel in der Wissenschaft weit verbreitet und gilt auch als am einfachsten zu erlernen. OpenCL ist bei weitem die portabelste Parallel-Computing-Plattform, obwohl in OpenCL geschriebene Programme noch individuell für jede Zielplattform optimiert werden müssen.

Lernen Sie GPU-Codierung unter LinuxHint.com

GPU-Programmierung mit Python

GPU-Programmierung mit C++

Weiterführende Literatur

Um sich mit CUDA vertraut zu machen, empfehlen wir Ihnen, die Anweisungen in der CUDA-Kurzanleitung zu befolgen, die erklärt, wie Sie CUDA unter Linux, Windows und macOS einrichten und ausführen. Das OpenCL-Programmierhandbuch von AMD bietet einen fantastischen, ausführlichen Überblick über OpenCL, setzt jedoch voraus, dass der Leser mit den ersten drei Kapiteln der OpenCL-Spezifikation vertraut ist. OpenACC bietet ein dreistufiges Einführungs-Tutorial, das zeigt, wie Sie die GPU-Programmierung nutzen können. Weitere Informationen finden Sie in der OpenACC-Spezifikation.

OpenTTD-Tutorial
OpenTTD ist eines der beliebtesten Wirtschaftssimulationsspiele auf dem Markt. In diesem Spiel musst du ein wunderbares Transportunternehmen aufbauen....
SuperTuxKart für Linux
SuperTuxKart ist ein großartiger Titel, der entwickelt wurde, um Ihnen das Mario Kart-Erlebnis kostenlos auf Ihrem Linux-System zu bieten. Es ist ziem...
Battle for Wesnoth-Tutorial
The Battle for Wesnoth ist eines der beliebtesten Open-Source-Strategiespiele, die Sie derzeit spielen können. Dieses Spiel befindet sich nicht nur se...