1. iMX8 Panoramica

La famiglia di System on Modules (SoM) i.MX8 di Variscite offre scalabilità pin-to-pin tra le famiglie i.MX 8, iMX 8X e i.MX 8M di SoC NXP. Ogni SoM è dotato di una GPU che consente l’accelerazione hardware di applicazioni grafiche e computazionali. Questo articolo mira a presentare ai clienti Variscite la GPU e fornire passaggi pratici su come selezionare il SoM corretto, come segue:

  • Un confronto tra le GPU di ogni SoM della famiglia i.MX8 di Variscite
  • Un’introduzione alle API software disponibili per accelerare le attività grafiche e computazionali
  • Risultati del benchmark OpenGL ES utilizzando l’accelerazione GPU
  • Risultati dei benchmark di vari calcoli utilizzando CPU e GPU
  • Suggerimenti e linee guida utili per ottenere i migliori risultati
  • Passaggi successivi per selezionare il SoM corretto per la tua applicazione
1.1 CPU e GPU

Prima di iniziare, è essenziale citare la differenza tra la Central Processing Unit (CPU) e la Graphics Processing Unit ( GPU) e perché la GPU è così cruciale per lo sviluppo di applicazioni grafiche.
La CPU è progettata per gestire rapidamente un’ampia gamma di attività, ma è limitata dal numero di attività che possono essere eseguite contemporaneamente. D’altra parte, la GPU è progettata pensando al multitasking e generalmente supporta il tipo di carico di lavoro relativo all’elaborazione grafica, come il rendering di immagini ad alta risoluzione e video.
Le CPU e le GPU differiscono nella loro architettura generale; mentre la CPU è «stretta e profonda», le GPU sono «poco profonde e larghe». In generale, la CPU ha una cache di memoria enorme, fa branch prediction e ha una velocità di clock molto più elevata rispetto alla GPU. La GPU contiene diverse unità di calcolo, che sono molto più semplici di una normale CPU, ma possono eseguire una singola istruzione in parallelo su più dati. La GPU non fa branch prediction.

Ad esempio, un codice che ha molte ramificazioni e condizioni come le istruzioni «if-else» verrà eseguito in modo più efficiente su una CPU, grazie alle sue capacità di previsione dei rami, mentre un codice che ha molte operazioni SIMD (Single Instruction Multiple Data) verrà eseguito in modo più efficiente su una GPU, a causa delle sue capacità di elaborazione parallela.

 

i.MX8 System on Module con 3D GPU - GC7000 XSVX (x2)

i.MX8 System on Module con 3D GPU – GC7000 XSVX (x2)

 

2. GPU su processori applicativi i.MX 8

La famiglia di processori per applicazioni i.MX 8 di NXP incorpora le GPU di Vivante (VeriSilicon). Queste GPU accelerano diverse Application Programming Interfaces (APIs) a livello utente. Guarda la seguente tabella con una panoramica generale dei processori e del loro attuale supporto:

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

Le API elencate sono definite dal Khronos Group, che è un consorzio aperto, senza scopo di lucro e guidato dai membri di oltre 160 aziende leader del settore, che crea standard di interoperabilità avanzati e esenti da royalty per grafica 3D, realtà aumentata e realtà virtuale, programmazione parallela, accelerazione visiva e Machine Learning:

  • OpenCL: utilizzato per la programmazione parallela multipiattaforma di processori moderni.
  • OpenGL ES (OpenGL for Embedded Systems): utilizzato per il rendering di grafica 2D e 3D avanzata su sistemi embedded.
  • OpenVG: utilizzato per interfacce utente avanzate e librerie di grafica vettoriale come SVG.
  • OpenVX: abilita l’elaborazione della visione artificiale ottimizzata per le prestazioni e il consumo energetico, che è importante in casi d’uso embedded e real-time come il tracciamento di viso, corpo e gesti, videosorveglianza intelligente, ecc.
  • Vulkan: consente agli sviluppatori di scegliere come target un’ampia gamma di dispositivi con le stesse API grafiche.

Per ulteriori informazioni sulle velocità di clock,  numero di shader, GFLOPS, ecc. fare riferimento a:

 

Evaluation kit basato su iMX8 con accelerazione grafica 2D/3D

Evaluation kit basato su iMX8 con accelerazione grafica 2D/3D

 

3. Accelerazione grafica 2D/3D

Pacchetto di supporto di Variscite  (BSP) include diversi esempi delle API più comuni, come OpenCL, OpenVG, OpenGL e altro ancora. Questi esempi possono essere trovati nella cartella /opt delle recenti Release Yocto. Ad esempio, per eseguire la demo di Bloom OpenGL ES, esegui:

# cd /opt/imx-gpu-sdk/GLES3/Bloom
# ./GLES3.Bloom_Wayland

È importante ricordare che se l’applicazione richiede una Graphical User Interface (GUI), l’utente deve utilizzare OpenGL ES (alias GLES), un sottoinsieme di API OpenGL per il rendering 2D e 3D di computer grafica. GLES esegue l’accelerazione grafica direttamente o utilizzando un framework astratto di alto livello. Per creare un’applicazione utilizzando grafica con accelerazione hardware, ci sono fondamentalmente due opzioni:

  • OpenGL ES: scrivere l’applicazione utilizzando il framework nativo, che offre all’utente un maggiore controllo. Però, questo è il modo più impegnativo per ottenere i risultati attesi.
  • Library/Framework: utilizzando un framework che supporta già l’accelerazione grafica OpenGL ES, ad esempio Qt.
3.1 Test con il benchmark glmark2

Per ottenere una stima delle prestazioni della GPU, i seguenti test sono stati eseguiti con lo strumento di benchmark glmark2, con il regolatore di scaling della CPU impostato su prestazione, e con un dissipatore sul SOC.

Esecuzione dei test con glmark2

I test sono stati eseguiti con il seguente comando:

# glmark2-es2-wayland -s 640x480

Il comando taskset può essere utilizzato per eseguire il benchmark su core CPU specifici. Ad esempio, nel System on Modules alimentato dalla famiglia i.MX 8, che ha 4x core A53 e 2x core A72, è possibile selezionare un set di core dello stesso tipo (A53 o A72), specificando i numeri di core, con i seguenti comandi:

# taskset -c 0-3 glmark2-es2-wayland -s 640x480
# taskset -c 4,5 glmark2-es2-wayland -s 640x480

NOTA: anche se gli esempi precedenti utilizzano set degli stessi tipi di core (A53 o A72), è possibile utilizzare qualsiasi combinazione di core.

Risultati dei test

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


Risultati single-core vs multicore

Un’osservazione interessante dalla tabella sopra è che i core SPEAR-MX8 e VAR-SOM-MX8 , 2x A72 hanno funzionato meglio di 6x (2x A72 + 4x A53) core. La tabella seguente mostra i risultati quando si utilizza SPEAR-MX8 e si esegue glmark2-es2-wayland su uno o più core CPU specifici:

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

Sebbene il test sia il benchmarking della GPU, dipende anche dalla CPU. Per questa specifica applicazione, l’utilizzo di 2 core A72 produce i migliori risultati. Questo perché i core A72 sono più veloci dei core A53. Poiché l’attività non sfrutta più CPU, l’assegnazione dell’attività ai core più veloci produce i migliori risultati.

3.2 Accelerazione OpenCL

OpenCL (Open Computing Language) è uno standard aperto e privo di royalty per la programmazione parallela multipiattaforma di diversi acceleratori presenti in supercomputer, server cloud, personal computer, dispositivi mobili e piattaforme embedded.

Di seguito sono riportati i risultati dei benchmark e i collegamenti al codice sorgente di due esempi scritti sia per i core della CPU che della GPU utilizzando OpenCL:

Moltiplicazione di matrici (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

Ricerca binaria

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

L’esempio di moltiplicazione della matrice viene eseguito più velocemente sulla GPU mentre l’esempio di ricerca binaria viene eseguito più velocemente sulla CPU.
Questo ha senso, perché:

a. L’esempio di ricerca binaria utilizza molti rami (istruzioni if-else), mentre l’esempio di moltiplicazione della matrice no, rendendolo più adatto alla CPU.
b. L’esempio di moltiplicazione della matrice utilizza molte delle stesse istruzioni su più dati, e questo è più adatto per la GPU.

 

4. Pensieri finali

A questo punto, probabilmente hai riconosciuto che ci sono molte variabili che possono influire sulle prestazioni che puoi aspettarti da attività grafiche e computazionali accelerate da GPU. Ogni SoC ha una configurazione unica di CPU, GPU e memoria con prestazioni e caratteristiche diverse. Scaricare il lavoro della CPU su un coprocessore è utile non solo per un calcolo più veloce, ma anche per ridurre il carico sulla CPU, liberandola per fare qualcos’altro.
Per un’attività a thread singolo, è possibile ottenere risultati migliori assegnandola a un core della CPU con prestazioni più elevate, come l’A72.

Ogni applicazione ha requisiti specifici. Mentre le specifiche e i benchmark numerici possono aiutarti a orientarti nella giusta direzione, è meglio fare un benchmark della tua applicazione sull’hardware di destinazione. Variscite consiglia di utilizzare un EVK e SOM compatibili pin-to-pin per valutare la tua applicazione e utilizzare risultati reali per aiutarti a identificare il SoM corretto per la tua applicazione.

Per ulteriori informazioni ed esempi, visita la directory Esempi di OpenCL nel nostro repository var-demos su GitHub.