Il calcolo generale per una GPU (unità di elaborazione grafica), meglio conosciuta come programmazione GPU, è l'uso di una GPU insieme a una CPU (unità di elaborazione centrale) per accelerare il calcolo nelle applicazioni tradizionalmente gestite solo dalla CPU.Anche se la programmazione GPU è stata praticamente praticabile solo negli ultimi due decenni, le sue applicazioni ora includono praticamente ogni settore. Ad esempio, la programmazione GPU è stata utilizzata per accelerare il video, l'immagine digitale e l'elaborazione del segnale audio, la fisica statistica, il calcolo scientifico, l'imaging medico, la visione informatica, le reti neurali e l'apprendimento profondo, la crittografia e persino il rilevamento delle intrusioni, tra molte altre aree.
Questo articolo funge da introduzione teorica rivolta a coloro che vorrebbero imparare a scrivere programmi accelerati dalla GPU e a coloro che hanno solo un interesse generale in questo affascinante argomento.
Molto tempo prima che la grafica 3D ad alta risoluzione ad alta fedeltà diventasse la norma, la maggior parte dei computer non aveva GPU. Invece, la CPU ha effettuato tutte le istruzioni dei programmi per computer eseguendo le operazioni aritmetiche, logiche, di controllo e input/output di base (I/O) specificate dalle istruzioni. Per questo motivo, la CPU è spesso descritta come il cervello del computer.
Ma negli ultimi anni, la GPU, progettata per accelerare la creazione di immagini da output su un dispositivo di visualizzazione, ha spesso aiutato la CPU a risolvere i problemi in aree precedentemente gestite esclusivamente dalla CPU.
Il produttore di schede grafiche NVIDIA fornisce un modo semplice come comprendere la differenza fondamentale tra una GPU e una CPU: “Una CPU è costituita da alcuni core ottimizzati per l'elaborazione seriale sequenziale mentre una GPU ha un'architettura enormemente parallele composta da migliaia di migliaia di più piccole, 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 di elaborazione parallela.
Tuttavia, tra i compiti che beneficiano significativamente dall'elaborazione parallela c'è il Deep Learning, una delle competenze più ricercate nella tecnologia oggi. Gli algoritmi di apprendimento profondo imitano l'attività in strati di neuroni nella neocorteccia, consentendo alle macchine di imparare a comprendere il linguaggio, riconoscere i modelli o comporre musica.
Come risultato della crescente importanza dell'intelligenza artificiale, la domanda di sviluppatori che comprendono il calcolo per uso generale su una GPU è stata salente.
Poiché le GPU comprendono i problemi computazionali in termini di primitive grafiche, i primi sforzi per utilizzare le GPU come processori per uso generale hanno richiesto la riformulazione dei problemi computazionali nel linguaggio delle schede grafiche.
Fortunatamente, ora è molto più facile eseguire il calcolo accelerato dalla GPU grazie a piattaforme di elaborazione parallele come la 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, si concentrano su concetti di elaborazione di livello superiore.
Cuda
Inizialmente rilasciato da Nvidia nel 2007, CUDA (Calcod Unified Device Architecture) è oggi il quadro proprietario dominante. "Con CUDA, gli sviluppatori sono in grado di accelerare drasticamente le applicazioni di calcolo sfruttando il potere delle GPU", descrive il framework Nvidia.
Gli sviluppatori possono chiamare CUDA da linguaggi di programmazione come C, C ++, Fortran o Python senza alcuna abilità nella programmazione grafica. Inoltre, il toolkit CUDA di Nvidia contiene tutto ciò che gli sviluppatori hanno bisogno per iniziare a creare applicazioni accelerate dalla 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 Shader e C ++ AMP.
OpenCl
Inizialmente rilasciato dal gruppo Khronos nel 2009, OpenCL è lo standard aperto più popolare e royalty per la programmazione parallela e parallela. Secondo il gruppo Khronos, “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 intrattenimento, software scientifico e medico, strumenti creativi professionali, elaborazione della visione e formazione della rete neurale e inferenze."
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 popolari 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 di programmazione e piattaforme come Python o Java.
OpenAcc
OpenAcc è lo standard di programmazione più giovane per il calcolo parallelo descritto in questo articolo. È stato inizialmente rilasciato nel 2015 da un gruppo di aziende che comprendono Cray, CAPS, NVIDIA e PGI (il Gruppo Portland) per semplificare la programmazione parallela di sistemi eterogenei CPU/GPU.
“OpenAcc è un modello di programmazione parallelo portale basato su per le prestazioni basato sull'utente progettato per scienziati e ingegneri interessati a portare i propri codici a una vasta vanezza delle piattaforme eterogenee hardware HPC e architetture con uno sforzo di programmazione significativamente inferiore modello.,"States OpenAcc sul suo sito ufficiale.
Gli sviluppatori interessati a OpenAcc possono annotare C, C ++ e il codice sorgente Fortran per dire alla GPU quali aree che dovrebbero essere accelerate. L'obiettivo è fornire un modello per la programmazione dell'acceleratore portatile tra 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, il CUDA è ampiamente utilizzato nel mondo accademico ed è anche considerato il più semplice 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.
https: // linuxhint.com/gpu-programming-python/
https: // linuxhint.com/gpu-programming-cpp/
Per familiarizzare con CUDA, ti consigliamo di seguire le istruzioni nella Guida di avvio rapido CUDA, che spiega come far funzionare CUDA su Linux, Windows e MacOS. La Guida alla programmazione OpenCL di AMD fornisce una fantastica e approfondita panoramica 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 nelle specifiche OpenACC.