Come controllo quali calcoli vengono eseguiti sulla CPU e quali sulla GPU?


14

La mia attuale comprensione è che tutto ciò che viene fatto in un file shader viene fatto sulla GPU e tutto ciò che viene fatto nel mio codice (Java, nel mio caso) viene fatto sulla CPU.

Questa è una descrizione accurata?


2
Inoltre, puoi fare il calcolo sulla GPU usando qualcosa come OpenCL che essenzialmente ti consente di eseguire il codice sulla GPU.
Insaponato il

Risposte:


20

Questo è il senso.

In linea di principio, la piattaforma potrebbe, plausibilmente, fare tutto ciò che vuole. Si potrebbe immaginare un sistema operativo avanzato che esegua la traduzione just-in-time del codice compilato da, diciamo, x86 al codice GPU. Allo stesso modo, i driver OpenGL potrebbero funzionare come vogliono sulla CPU host.

Ma davvero, quello che hai appena descritto, è ciò che accade.


5
IIRC, gli shader vengono compilati sulla CPU prima di essere inviati alla GPU. E questo è fatto dal driver GPU senza il sistema operativo.
MSalters il

Vero. Ho riscontrato molti errori di compilazione durante l'esecuzione del programma negli shader, anche quando il codice java è già stato compilato.
Bassista il

1
Teorico: diciamo che avevo un programma che richiedeva molta CPU ma era solo un'interfaccia a riga di comando (nessun lavoro grafico). Posso scaricare parte del lavoro sulla GPU? In realtà non ho intenzione di farlo, è solo una cosa concettuale che mi interessa.
Bassinator

2
Sì! Il link che @return true ha pubblicato è per una libreria Java che lo fa. Più in generale, è possibile scrivere uno "shader di calcolo" in OpenGL o utilizzare OpenCL. In tutti i casi, è necessario isolare parte del codice che è parallelizzabile e passare informazioni da e verso di esso. (Le GPU sono ottime soprattutto per compiti "imbarazzanti in parallelo".)
David Van Brink,

1
Un asterisco da aggiungere a questa risposta è che alcune implementazioni supportano l'idea di un "preshader", ovvero un codice che fa parte dello shader, ma il cui risultato sarà costante per tutte le invocazioni in una determinata chiamata di disegno (come la moltiplicazione della vista uniforme e matrici di proiezione). Un compilatore di shader così incline può identificare bit di codice come questo e sollevarli per essere eseguiti una volta sul lato CPU, incluso l'output costante risultante nel lavoro inviato alla GPU. Questo è un caso comune in cui l'assunto "shader = GPU" potrebbe essere piegato, anche se solo in dettaglio.
DMGregory

7

Generalmente sì. Java viene utilizzato per scrivere programmi in esecuzione sulla CPU. I linguaggi shader (cg, hlsl, et al) sono usati per scrivere programmi che girano sulla GPU.

Verrà utilizzata un'eccezione alla regola API di terze parti che possono colmare il divario.


1
Consiglio molto interessante, il tuo link ad "aparapi". Esegui un po 'di codice JVM sulla GPU ... intrigante!
David Van Brink,

3

David Van Brink ha risposto alla tua domanda in generale.

Ma come dice, il driver OpenGL potrebbe eseguire roba sulla CPU, e in realtà succede molto. Soprattutto con i contesti di compatibilità, in cui alcune strane funzioni legacy non possono essere implementate sulle schede grafiche. Richiedono l'emulazione del software. Ad esempio, ho sentito prima che la punteggiatura viene eseguita sulla CPU. Puoi aspettarti anche sorprese con la raccolta.
Queste sorprese possono verificarsi ancora di più su MacOS usando i contesti 2.1, perché Apple ha unificato abbastanza bene la vista di OpenGL attraverso la loro gamma hardware, e alcuni hardware più piccoli mancano di alcune cose che devono essere emulate. Si arriva al punto di poter effettivamente eseguire la specifica INTERA OpenGL 2.1 completamente sulla CPU, se il codice di creazione del contesto specifica esplicitamente un dispositivo software.

Al contrario, il codice che viene eseguito tramite librerie di elaborazione come vexcl o boost compute o AMP di microsoft o nVidia spinta, PUO 'essere eseguito sulla GPU o sulla CPU a seconda dei flag di configurazione dell'API.

E per il tocco finale, all'interno della CPU hai anche un'architettura DSP con la parte che chiamiamo SIMD. Il compilatore ispc di Intel fornisce assistenza per la generazione di codice "garantito" per l'esecuzione su corsie SIMD con un sacco di diagnostica delle prestazioni in fase di compilazione per aiutarti a trarne il massimo. Aggiungi OpenMP a questo e puoi ottenere SIMD multithread, che si avvicina ai concetti di GPU. Se hai una CPU di fascia alta e una GPU di fascia bassa, questo può effettivamente essere più performante.
http://ispc.github.io/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.