GPU

Introduzione alla programmazione GPU

Introduzione alla programmazione GPU

Il calcolo per scopi generici su una GPU (Graphics Processing Unit), meglio noto come programmazione GPU, è l'uso di una GPU insieme a una CPU (Central Processing Unit) per accelerare il calcolo in applicazioni tradizionalmente gestite solo dalla CPU.Anche se la programmazione GPU è stata praticabile solo negli ultimi due decenni, le sue applicazioni ora includono praticamente ogni settore. Ad esempio, la programmazione GPU è stata utilizzata per accelerare l'elaborazione di video, immagini digitali e segnali audio, fisica statistica, calcolo scientifico, imaging medico, visione artificiale, reti neurali e deep learning, crittografia e persino rilevamento delle intrusioni, tra molte altre aree.

Questo articolo serve come introduzione teorica rivolta a coloro che desiderano imparare a scrivere programmi con accelerazione GPU e a coloro che hanno solo un interesse generale in questo affascinante argomento.

La differenza tra una GPU e una CPU

Molto tempo prima che la grafica 3D ad alta risoluzione e ad alta fedeltà diventasse la norma, la maggior parte dei computer non aveva GPU. Invece, la CPU ha eseguito tutte le istruzioni dei programmi per computer eseguendo le operazioni aritmetiche, logiche, di controllo e di input/output (I/O) di base specificate dalle istruzioni. Per questo motivo la CPU viene spesso descritta come il cervello del computer.

Ma negli ultimi anni, la GPU, progettata per accelerare la creazione di immagini per l'output su un dispositivo di visualizzazione, ha spesso aiutato la CPU a risolvere problemi in aree che in precedenza erano gestite esclusivamente dalla CPU.

Il produttore di schede grafiche Nvidia fornisce un modo semplice per comprendere la differenza fondamentale tra una GPU e una CPU: "Una CPU è costituita da pochi core ottimizzati per l'elaborazione seriale sequenziale mentre una GPU ha un'architettura parallela massiccia composta da migliaia di più piccoli, più efficienti core progettati per gestire più attività contemporaneamente."

La capacità di gestire più attività contemporaneamente rende le GPU altamente adatte per alcune attività, come la ricerca di una parola in un documento, mentre altre attività, come il calcolo della sequenza di Fibonacci, non beneficiano affatto dell'elaborazione parallela.

Tuttavia, tra le attività che beneficiano in modo significativo dell'elaborazione parallela c'è l'apprendimento profondo, una delle competenze più ricercate oggi nella tecnologia. Gli algoritmi di deep learning imitano l'attività in strati di neuroni nella neocorteccia, consentendo alle macchine di imparare a comprendere il linguaggio, riconoscere schemi o comporre musica.

A causa della crescente importanza dell'intelligenza artificiale, la domanda di sviluppatori che comprendono l'elaborazione generica su una GPU è aumentata vertiginosamente.

CUDA contro OpenCL contro OpenACC

Poiché le GPU comprendono i problemi computazionali in termini di primitive grafiche, i primi sforzi per utilizzare le GPU come processori generici hanno richiesto la riformulazione dei problemi computazionali nel linguaggio delle schede grafiche.

Fortunatamente, ora è molto più semplice eseguire l'elaborazione con accelerazione GPU grazie a piattaforme di elaborazione parallela come CUDA, OpenCL o OpenACC di Nvidia. Queste piattaforme consentono agli sviluppatori di ignorare la barriera linguistica che esiste tra la CPU e la GPU e, invece, di concentrarsi su concetti di elaborazione di livello superiore.

CUDA

Rilasciato inizialmente da Nvidia nel 2007, CUDA (Compute Unified Device Architecture) è oggi il framework proprietario dominante. "Con CUDA, gli sviluppatori sono in grado di velocizzare notevolmente le applicazioni di elaborazione sfruttando la potenza delle GPU", descrive il framework Nvidia.

Gli sviluppatori possono chiamare CUDA da linguaggi di programmazione come C, C++, Fortran o Python senza alcuna competenza nella programmazione grafica. Inoltre, il CUDA Toolkit di Nvidia contiene tutto ciò di cui gli sviluppatori hanno bisogno per iniziare a creare applicazioni con accelerazione GPU che superano notevolmente le loro controparti legate alla CPU.

L'SDK CUDA è disponibile per Microsoft Windows, Linux e macOS. la piattaforma CUDA supporta anche altre interfacce computazionali, tra cui OpenCL, DirectCompute di Microsoft, OpenGL Compute Shaders e C++ AMP.

ApriCL

Rilasciato inizialmente dal Khronos Group nel 2009, OpenCL è lo standard aperto e royalty-free più popolare per la programmazione parallela multipiattaforma. Secondo il Khronos Group, "OpenCL migliora notevolmente la velocità e la reattività di un ampio spettro di applicazioni in numerose categorie di mercato tra cui titoli di gioco e di intrattenimento, software scientifico e medico, strumenti creativi professionali, elaborazione della visione e formazione e inferenza della rete neurale."

Finora OpenCL è stato implementato da Altera, AMD, Apple, ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx e ZiiLABS e supporta tutti i sistemi operativi più diffusi su tutte le principali piattaforme, rendendolo estremamente versatile. OpenCL definisce un linguaggio simile a C per la scrittura di programmi, ma esistono API di terze parti per altri linguaggi e piattaforme di programmazione come Python o Java.

Apri ACC

OpenACC è lo standard di programmazione più giovane per il calcolo parallelo descritto in questo articolo. È stato inizialmente rilasciato nel 2015 da un gruppo di società comprendente Cray, CAPS, Nvidia e PGI (il Gruppo Portland) per semplificare la programmazione parallela di sistemi CPU/GPU eterogenei.

“OpenACC è un modello di programmazione parallela portatile e basato su direttive, guidato dall'utente, progettato per scienziati e ingegneri interessati a portare i loro codici su un'ampia varietà di piattaforme e architetture hardware HPC eterogenee con uno sforzo di programmazione significativamente inferiore rispetto a modello.,” afferma OpenACC sul suo sito ufficiale.

Gli sviluppatori interessati a OpenACC possono annotare il codice sorgente C, C++ e Fortran per indicare alla GPU quali aree devono essere accelerate. L'obiettivo è fornire un modello per la programmazione degli acceleratori che sia portabile su tutti i sistemi operativi e vari tipi di CPU e acceleratori host.

Quale dovrei usare??

La scelta tra queste tre piattaforme di elaborazione parallela dipende dai tuoi obiettivi e dall'ambiente in cui lavori. Ad esempio, CUDA è ampiamente utilizzato nel mondo accademico ed è anche considerato il più facile da imparare. OpenCL è di gran lunga la piattaforma di elaborazione parallela più portatile, sebbene i programmi scritti in OpenCL debbano ancora essere ottimizzati individualmente per ciascuna piattaforma di destinazione.

Impara la codifica GPU su LinuxHint.come

Programmazione GPU con Python

Programmazione GPU con C++

Ulteriori letture

Per acquisire familiarità con CUDA, ti consigliamo di seguire le istruzioni nella Guida di avvio rapido di CUDA, che spiega come far funzionare CUDA su Linux, Windows e macOS. La Guida alla programmazione OpenCL di AMD fornisce una panoramica fantastica e approfondita di OpenCL, ma presuppone che il lettore abbia familiarità con i primi tre capitoli della specifica OpenCL. OpenACC offre un tutorial introduttivo in tre fasi progettato per dimostrare come sfruttare la programmazione GPU e ulteriori informazioni sono disponibili nella specifica OpenACC.

Come installare e giocare a Doom su Linux
Introduzione a Doom La serie Doom è nata negli anni '90 dopo l'uscita dell'originale Doom. È stato un successo immediato e da quel momento in poi la s...
Vulkan per utenti Linux
Con ogni nuova generazione di schede grafiche, vediamo gli sviluppatori di giochi spingere i limiti della fedeltà grafica e avvicinarsi di un passo al...
OpenTTD vs Simutrans
Creare la tua simulazione di trasporto può essere divertente, rilassante ed estremamente allettante. Ecco perché devi assicurarti di provare quanti pi...