2013-04-07 6 views
49

So OpenCL dà il controllo di architettura di memoria della GPU e permette quindi una migliore ottimizzazione, ma, lasciando questa parte, possiamo usare Compute Shaders per operazioni vettoriali (addizione, moltiplicazione, inversione, ecc)?Qual è la differenza tra OpenCL e OpenGL?

risposta

47

Contrariamente agli altri tipi di shader OpenGL, gli shader di calcolo non sono direttamente correlati alla grafica del computer e forniscono un'astrazione molto più diretta dell'hardware sottostante, simile a CUDA e OpenCL. Fornisce dimensioni del gruppo di lavoro personalizzabili, memoria condivisa, sincronizzazione all'interno del gruppo e tutte le cose conosciute e amate da CUDA e OpenCL.

Le principali differenze sono essenzialmente:

  • Esso utilizza GLSL invece di OpenCL C. Anche se non v'è una grande differenza così bewteen quei linguaggi di programmazione, è possibile comunque utilizzare tutte le funzioni GLSL relativi alla grafica non a disposizione di OpenCL, come tipi avanzati di texture (ad esempio cubetti mappa), filtraggio avanzato (ad esempio mipmapping, ben Ok, si avrà probabilmente bisogno di calcolare il livello di MIP-te), e piccole cose di convenienza come matrici 4x4 o funzioni geometriche.
  • Si tratta di un programma OpenGL shader di come qualsiasi altro dello shader GLSL. Ciò significa che l'accesso ai dati OpenGL (come tamponi, texture, immagini) è solo banale, mentre interfacciamento tra OpenGL e OpenCL/CUDA può ottenere noioso, con possibilità di intervento manuale sincronizzazione dal lato. Allo stesso modo, l'integrazione in un flusso di lavoro OpenGL esistente è anche banale, mentre l'impostazione di OpenCL è un libro a sé stante, per non parlare della sua integrazione in una pipeline grafica esistente.

Così che cosa questo si riduce a è che shaders calcolo siano veramente destinati per l'utilizzo in applicazioni OpenGL esistenti, anche se esibendo il solito (OpenCL/CUDA-like) calcolare approccio alla programmazione GPU, in contrasto con la grafica -approach delle altre fasi di shader, che non avevano la flessibilità di calcolo di OpenCL/CUDA (pur offrendo altri vantaggi, ovviamente). In questo modo, le attività di elaborazione sono più flessibili, dirette e facili rispetto a comprimerle in altri stadi dello shader non destinati all'elaborazione generale o all'introduzione di un ulteriore framework di elaborazione con cui sincronizzarsi.

Gli shader di elaborazione devono essere in grado di eseguire praticamente qualsiasi operazione con OpenCL con la stessa flessibilità e controllo delle risorse hardware e con lo stesso approccio di programmazione. Quindi se hai un buon algoritmo adatto alla GPU (che funzionerebbe bene con CUDA o OpenCL) per l'attività che vuoi fare, allora sì, puoi farlo anche con shader di calcolo. Ma non avrebbe molto senso usare OpenGL (che è ancora e sarà probabilmente sempre un framework per la grafica computerizzata in tempo reale in primo luogo) solo per via degli shader computazionali. Per questo è sufficiente utilizzare OpenCL o CUDA. La vera forza degli shader computazionali entra in gioco quando si mescolano funzionalità grafiche e di elaborazione.

+9

Non dimenticare le garanzie di precisione che OpenCL fornisce che GLSL esplicitamente * non *. –

+0

@NicolBolas Intendi per operazioni e funzioni aritmetiche? –

+1

Sì. La precisione a virgola mobile è molto diversa tra i due. –

2

Cercare here per un altro punto di vista. Riassumendo:

Sì, OpenCL già esisteva, ma si rivolge applicazioni pesanti (pensano CFD, FEM, ecc), ed è molto più universale di OpenGL (pensare al di là GPU ... l'architettura Xeon Phi di Intel supporta> 50 core x86).

Inoltre, la condivisione di buffer tra OpenGL/CUDA e OpenCL non è divertente.

+0

In pratica, una GPU di fascia alta è >> 40 volte più capace di una CPU di fascia alta per risolvere un problema parallelizzabile, nel calcolo a matrice, per essere più specifici. Per ora non mi interessa la capacità della CPU. Quindi, per tornare alla mia domanda, possiamo dire Matrix Inversion con gli shader computazionali? E quanto lavoro è necessario rispetto a OpenCL? – Maiss

+0

AFAIK, esistono algoritmi paralleli solo per l'inversione delle matrici * sparse * e questi sono sufficientemente complessi che probabilmente vorrai scriverli in C99 (linguaggio del kernel di OpenCL). –

+1

È possibile eseguire molti tipi di computazione negli shader di elaborazione di OpenGL che sarebbero simili a OpenCL, con la principale differenza che OpenGL utilizza _GLSL_ (The OpenGL Shading Language) come linguaggio del kernel, rispetto al dialetto C99 di OpenCL. Non c'è alcuna limitazione per fare calcoli a matrice (ad esempio, solo lavorando con matrici sparse), e in casi particolari, potresti essere in grado di utilizzare algoritmi a matrice basati su blocchi che sfruttano alcune delle operazioni di matrice nativa di GLSL. – radical7