1. iMX8 Übersicht
Die i.MX8-Familie von Modulsystemen (Englisch: System on Modules, kuz SoMs) von Variscite bietet eine Pin-zu-Pin Skalierbarkeit zwischen den Familien i.MX 8, iMX 8X und i.MX 8M der NXP-SoCs (SoC steht für System on Chip, ein System auf einem Chip). Jedes SoM verfügt über einen Grafikprozessor, der die Hardware-Beschleunigung von grafischen und rechenintensiven Anwendungen ermöglicht. Dieser Artikel zielt darauf ab, die Kunden von Variscite mit dem Grafikprozessor (Englische Abkürzung: GPU) vertraut zu machen und eine praktische Anleitung zur Auswahl des richtigen SoMs zu geben:
- Ein Vergleich der GPUs der einzelnen SoMs der i.MX8-Familie von Variscite
- Eine Einführung in die verfügbaren Software-APIs zur Beschleunigung von grafischen und rechenintensiven Aufgaben
- Ergebnisse des OpenGL ES-Benchmarks mit GPU-Beschleunigung
- Benchmark-Ergebnisse verschiedener Berechnungen mit CPU und GPU
- Hilfreiche Tipps und Richtlinien, um die besten Ergebnisse zu erzielen
- Die nächsten Schritte zur Auswahl des richtigen SoM für Ihre Anwendung
1.1 Hauptprozessor (CPU) und Grafikprozessor (GPU)
Bevor wir beginnen, ist es wichtig, den Unterschied zwischen dem Hauptprozessor (CPU) und dem Grafikprozessor (GPU) zu erläutern und zu erklären, warum die GPU für die Entwicklung grafischer Anwendungen so wichtig ist.
Die CPU ist darauf ausgelegt, vielfältige Aufgaben schnell zu erledigen – aber es gibt nur eine begrenzte Anzahl an Prozessen, die von ihr zeitgleich ausgeführt werden können. Der Grafikprozessor hingegen ist auf die zeitgleiche Ausführung vieler verschiedener Prozesse (Multitasking) ausgelegt und unterstützt allgemein sämtliche Aufgaben, die mit der Grafikverarbeitung zusammenhängen, z. B. das Rendern von hochauflösenden Bildern und Videos.
CPUs und GPUs unterscheiden sich in ihrer grundlegenden Architektur: Während die CPU ’schmal und tief‘ strukturiert ist, sind die GPUs ‚flach und breit‘ angelegt. Im Allgemeinen verfügt die CPU über einen großen Cache-Speicher, nimmt selbstständig Verzweigungsvorhersagen vor und hat eine viel höhere Taktfrequenz als die GPU. Der Grafikprozessor enthält mehrere baugleiche Recheneinheiten, die viel einfacher strukturiert sind als eine normale CPU, aber so einen einzigen Befehl parallel auf mehreren Datensätze anwenden können. Die GPU nimmt dabei keine Verzweigungsvorhersagen vor.
So wird beispielsweise ein Code mit vielen Verzweigungen und Bedingungen wie ‚Wenn, dann‘-Anweisungen (Englisch: if-else) aufgrund der Verzweigungsvorhersagefähigkeiten einer CPU auf dieser effizienter ausgeführt, während ein Code mit vielen SIMD-Operationen (Englisch für ‚Single Instruction Multiple Data‘ – ein einziger Befehl für die gleichzeitige Anwendung auf mehrere Datensätze) aufgrund der Parallelverarbeitungsfähigkeiten einer GPU auf dieser effizienter ausgeführt wird.
2. Die GPU auf i.MX 8 Anwendungsprozessoren
Die i.MX 8-Anwendungsprozessorfamilie von NXP enthält GPUs von Vivante (VeriSilicon). Diese GPUs beschleunigen verschiedene Anwendungsprogrammierungsschnittstellen (Englisch: ‚Application Programming Interfaces‘, kurz: API) auf der Benutzerebene. In der folgenden Tabelle finden Sie einen allgemeinen Überblick über die Prozessoren und ihren aktuellen Support-Status:
NXP SoC | Variscite System on Module | 3D GPU | 2D GPU | 3D API | 2D API | Compute API | Other APIs |
i.MX 8 | VAR-SOM-MX8,
SPEAR-MX8 |
GC7000 XSVX (x2) | High Perf 2D Blit Engine | GLES, Vulkan | OpenVG, G2D | OpenCL | OpenVX |
i.MX 8X | VAR-SOM-MX8X | GC7000 Lite | High Perf 2D Blit Engine | GLES, Vulkan | OpenVG, G2D | OpenCL | N/A |
i.MX 8M | DART-MX8M | GC7000 Lite | N/A | GLES, Vulkan | OpenVG | OpenCL | N/A |
i.MX 8M Mini | DART-MX8M-MINI,
VAR-SOM-MX8M-MINI |
GCNano Ultra | GC320 | GLES | OpenVG, G2D | N/A | N/A |
i.MX 8M Nano | VAR-SOM-MX8M-NANO | GC7000 Ultra Lite | N/A | GLES, Vulkan | OpenVG, G2D | OpenCL | N/A |
i.MX 8M Plus | DART-MX8M-PLUS,
VAR-SOM-MX8M-PLUS |
GC7000 Ultra Lite | GC520L | GLES, Vulkan | OpenVG, G2D | OpenCL | OpenVX |
Die aufgeführten APIs werden von der Khronos Group definiert, einem offenen, gemeinnützigen und mitgliedergestützten Konsortium von über 160 branchenführenden Unternehmen, das fortschrittliche, lizenzfreie Interoperabilitätsstandards für 3D-Grafik, Erweiterte und Virtuelle Realität, Parallelprogrammierung , Bildverarbeitungsbeschleunigung und Maschinelles Lernen bereitstellt:
- OpenCL: Dieser Standard wird für die plattformübergreifende, parallele Programmierung moderner Prozessoren verwendet.
- OpenGL ES (OpenGL für Eingebettete Systeme): Dieser Standard wird für das Rendering fortschrittlicher 2D- und 3D-Grafiken auf eingebetteten Systemen verwendet.
- OpenVG: Dieser Standard wird für moderne Benutzeroberflächen und Vektorgrafik-Bibliotheken wie SVG verwendet.
- OpenVX: Dieser Standard ermöglicht eine leistungs- und energieoptimierte computergestützte Bild- und Videoerkennung, die für eingebettete Systeme und Echtzeit-Anwendungsfälle wie Gesichts, Körper- und Gestenerkennung, intelligente Videoüberwachung usw. wichtig ist.
- Vulkan: Dieser Standard ermöglicht es Entwicklern, eine breite Palette von Geräten mit derselben Grafik-API anzusprechen.
Weitere Informationen zu den Taktfrequenzen, zur Anzahl der Shader, zu den GFLOPS etc. finden Sie unter:
3. 2D/3D Graphics Acceleration
Das ‚Board-Support-Paket‘ (BSP) enthält mehrere Beispiele für die gängigsten APIs, wie OpenCL, OpenVG , OpenGL und mehr. Diese Beispiele finden Sie im Ordner / opt der aktuellen Yocto-Veröffentlichungen. Um zum Beispiel die ‚OpenGL ES‘-Demo von Bloom auszuführen, führen Sie folgenden Code aus:
# cd /opt/imx-gpu-sdk/GLES3/Bloom
# ./GLES3.Bloom_Wayland
Es ist wichtig zu erwähnen, dass wenn die Anwendung eine grafische Benutzeroberfläche (GUI) benötigt, der Benutzer OpenGL ES (auch bekannt als GLES), eine Untermenge der OpenGL-API für 2D- und 3D-Rendering von Computergrafiken, verwenden sollte. GLES übernimmt die Grafikbeschleunigung entweder direkt oder über ein abstrahiertes High-Level-Framework. Um eine Anwendung mit hardwarebeschleunigten Grafiken zu erstellen, gibt es grundsätzlich zwei Möglichkeiten:
- OpenGL ES: Hier erfolgt das Schreiben der Anwendung unter Verwendung des nativen Frameworks, das dem Benutzer mehr Kontrolle bietet. Allerdings ist dies der schwierigste Weg, um die erwarteten Ergebnisse zu erzielen.
- Bibliothek/Framework: Hierbei arbeitet man unter Verwendung eines Frameworks, das die OpenGL ES-Grafikbeschleunigung bereits unterstützt, z. B. Qt.
3.1 Tests mit dem glmark2-Benchmark
Um eine Schätzung der Leistung einer GPU zu erhalten, wurden die folgenden Tests mit dem glmark2-Benchmark-Tool durchgeführt, wobei der CPU-Skalierungsregulator auf Leistung eingestellt wurde. Der Test erfolgte mit einem Kühlkörper auf dem SOC.
Die Durchführung der Tests mit glmark2
Die Tests wurden mit dem folgenden Befehl ausgeführt:
# glmark2-es2-wayland -s 640x480
Der Befehl taskset kann verwendet werden, um den Benchmark auf bestimmten CPU-Kernen auszuführen. Zum Beispiel auf den SoMs, die Teil der i.MX 8-Familie sind, welche über 4 x A53 und 2 x A72 Kerne verfügen, können Sie mit den folgenden Befehlen einen Satz von Kernen desselben Typs (A53 oder A72) auswählen, indem Sie die Kernnummern angeben:
# taskset -c 0-3 glmark2-es2-wayland -s 640x480
# taskset -c 4,5 glmark2-es2-wayland -s 640x480
HINWEIS: Auch wenn in den obigen Beispielen Sätze mit denselben Kerntypen (A53 oder A72) verwendet werden, können Sie tatsächlich jede beliebige Kombination von Kernen verwenden.
Die Testergebnisse
Variscite System on Module | BSP Version | Module Version | DRAM | GL Renderer | GL Version | Score |
VAR-SOM-MX8 4x A53 | 5.4.85
|
V1.3 | 4GB
|
GC7000XSVX | OpenGL ES 3.2 | 2151 |
VAR-SOM-MX8 2x A72 | 5.4.85
|
V1.3 | 4GB
|
GC7000XSVX | OpenGL ES 3.2 | 2315 |
VAR-SOM-MX8 6x cores | 5.4.85 | V1.3 | 4GB | GC7000XSVX | OpenGL ES 3.2 | 2121 |
SPEAR-MX8 4x A53 | 5.4.85 | V1.2 | 4GB
|
GC7000XSVX | OpenGL ES 3.2 | 2070 |
SPEAR-MX8 2x A72 | 5.4.85
|
V1.2 | 4GB
|
GC7000XSVX | OpenGL ES 3.2 | 2256 |
SPEAR-MX8 6x cores | 5.4.85 | V1.2 | 4GB | GC7000XSVX | OpenGL ES 3.2 | 2060 |
VAR-SOM-MX8X | 4.14 | V1.2 | 2GB
|
GC7000L | OpenGL ES 3.1 | 952 |
DART-MX8M | 5.4.142 | V1.3 | 4GB | GC7000L | OpenGL ES 3.1 | 946 |
DART-MX8M-MINI | 5.4.142 | V1.2 | 2GB | GC7000
NanoUltra |
OpenGL ES 2.0 | 389 |
VAR-SOM-MX8M-MINI | 5.4.142 | V1.3 | 2GB
|
GC7000
NanoUltra |
OpenGL ES 2.0 | 381 |
VAR-SOM-MX8M-NANO | 5.4.142 | V1.3 | 1GB | GC7000UL | OpenGL ES 3.1 | 361 |
DART-MX8M-PLUS | 5.4.70 | V1.1 | 4GB | GC7000UL | OpenGL ES 3.1 | 992 |
VAR-SOM-MX8M-PLUS | 5.4.70 | V1.1 | 4GB | GC7000UL | OpenGL ES 3.1 | 987 |
Die Ergebnisse bei einzelnen und mehreren Kernen
Eine interessante Beobachtung, die sich aus der obigen Tabelle ergibt, ist es, dass die Kerne SPEAR-MX8 und VAR-SOM-MX8 sowie die zweifachen A72-Kerne besser abschneiden als die Kombination aus sechs Kernen (2 x A72 + 4 x A53). Die folgende Tabelle zeigt die Ergebnisse unter Verwendung des SPEAR-MX8 und bei der Ausführung von glmark2-es2-wayland auf einem oder mehreren bestimmten CPU-Kernen:
Variscite System on Module | Used CPU Cores | CPU Max Usage | Score |
SPEAR-MX8 | 1x A53 | 95% | 1462 |
SPEAR-MX8 | 2x A53 | 130% | 2039 |
SPEAR-MX8 | 3x A53 | 126% | 2042 |
SPEAR-MX8 | 4x A53 | 124% | 2070 |
SPEAR-MX8 | 1x A72 | 85% | 1843 |
SPEAR-MX8 | 2x A72 | 112% | 2256 |
Obwohl der Test eigentlich die GPU-Leistung testet, hängt sein Ergebnis auch von der CPU ab. Für diese spezielle Anwendung liefert die Verwendung von zwei A72-Kernen die besten Ergebnisse. Das liegt daran, dass die A72-Kerne schneller sind als die A53-Kerne. Da bei dieser Aufgabe nicht die Vorteile mehrerer CPUs zum Tragen kommen, führt die Zuweisung der Aufgabe an die jeweils schnellsten Kerne zu den besten Ergebnissen.
3.2 OpenCL Beschleunigung
OpenCL (Englische Abkürzung für ‚Open Computing Language‘) ist ein offener, lizenzgebührenfreier Standard für die plattformübergreifende und parallele Programmierung verschiedener Beschleuniger, die in Supercomputern, Cloud-Servern, PCs, mobilen Geräten und eingebetteten Plattformen zu finden sind.
Im Folgenden finden Sie einige Benchmark-Ergebnisse und Links zum Quellcode von zwei Beispielen, die sowohl für die CPU- als auch für die GPU-Kerne unter Verwendung von OpenCL geschrieben wurden:
Matrixmultiplikation (512×512)
Variscite System on Module | Used CPU Cores | CPU Time (s) | GPU Time (s) |
VAR-SOM-MX8 | 1x A72@600Mhz | 3.64 | 0.67 |
DART-MX8M-PLUS | 1x A53@1200Mhz | 15.67 | 1.66 |
- Das Quellcode-Beispiel für diesen Test finden Sie unter Matrixmultiplikationsbeispiel.
Binäre Suche
Variscite System on Module | Used CPU Cores | CPU Time (ms) | GPU Time (ms) |
VAR-SOM-MX8 | 1x A72@600Mhz | 0.008 | 0.109 |
DART-MX8M-PLUS | 1x A53@1200Mhz | 0.007 | 0.125 |
- Das Quellcodebeispiel für diesen Test finden Sie unter Binärsuchenbeispiel.
Das Beispiel für die Matrixmultiplikation läuft auf der GPU schneller, während das Beispiel für die binäre Suche auf der CPU schneller abläuft.
Das macht Sinn, denn es gilt:
a. Das Beispiel für die binäre Suche verwendet viele Verzweigungen (wenn-dann-Anweisungen), während das Beispiel für die Matrixmultiplikation dies nicht tut, sodass es eher für die Ausführung auf der CPU geeignet ist.
b. Das Beispiel für die Matrixmultiplikation verwendet viele identische Anweisungen für mehrere Datensätze und ist daher besser für die Ausführung auf der GPU geeignet.
4. Abschließende Überlegungen
Inzwischen haben Sie wahrscheinlich erkannt, dass es viele Variablen gibt, welche sich auf die Leistung auswirken können, die Sie dementsprechend bei verschiedenen GPU-beschleunigten Grafik- und Berechnungsaufgaben erwarten können. Jeder SoC verfügt über eine einzigartige CPU-, GPU- und Speicherkonfiguration mit unterschiedlicher Leistungsfähigkeit und Ausstattungsoptionen. Die Auslagerung der CPU-Arbeit auf einen Koprozessor ist nicht nur im Sinne einer schnelleren Berechnung von Vorteil, sondern dient auch der Entlastung der CPU, die dadurch für andere Aufgaben frei wird.
Bei einer Aufgabe, die nur über einen Thread verfügt, können Sie bessere Ergebnisse erzielen, wenn Sie sie einem leistungsstärkeren CPU-Kern wie dem A72 zuweisen.
Jede Anwendung hat ihre ganz eigenen Anforderungen. Die technischen Daten und numerische Benchmarks können Ihnen zwar dabei helfen, die richtige Richtung einzuschlagen, aber am besten ist es, Ihre Anwendung auf der gewünschten Hardware selbst zu testen. Variscite empfiehlt die Verwendung eines EVK und Pin-zu-Pin-kompatibler SoMs, um Ihre Anwendung zu evaluieren und die Ergebnisse aus der Praxis zu nutzen, um das richtige SoM für Ihre Anwendung zu finden.
Weitere Informationen und Beispiele finden Sie im Verzeichnis OpenCL-Beispiele in unserem Archiv var-demos bei GitHub.