Graphic Processing Unit GPU
ARCHITETTURA DI COMUNICAZIONE
Display Architettura di Comunicazione AGP 2x, 4x e 8x (banda massima 528 MB/sec) PCI Express PCI Express (la banda massima teorica è di 4 GB/sec in ingresso e di 4 GB/sec in uscita contemporaneamente) Efficiente Co-Processore Off-Screen Multi-Pass Algorithm
Architettura PIPELINE GRAFICA
Traditional Traditional Graphics Pipeline Le operazioni sono eseguite in relativo isolamento. Questo significa che l'elaborazione di un dato vertice o fragment non influisce sugli altri. Primitive Assembly ( 2D ) Position (x,y,z) Normal (x,y,z) Color (r,g,b,a) Vertex Model ( 3D ) Pixel colorati Render ( 2D ) fragment Rasterizzazione ( 2D ) Vertex Model Position (x,y,z) Normal (x,y,z) Color (r,g,b,a) Multi-Pass Algorithm La Pipeline Grafica è una pipeline di processori con differenti caratteristiche (tipicamente processori SIMD o MIMD) che operano su stream di primitive grafiche (vertici, frammenti, texture …)
Recent Recent Graphics Pipeline Multi-Pass Algorithm MIMD SIMD
Recent Recent Graphics Pipeline Off-Screen L’estensione Framebuffer object (FBO) permette il multi-RENDER TO TEXTUREs MULTIPASS Algorithm RENDER TO TEXTURE (PING PONG)
New New Graphics Pipeline FBO
New New Graphics Pipeline MIMD
VERTEX Processing
Vertex Processing Trasform Vertex 3D Vertex 2D 3D Model 2D Image glu Perspective glu LookAt Lighting glu Perspective glu LookAt gl Lightfv
Vertex Processing
Vertex Processor – I/O
FRAGMENT Processing
Fragment Processor - Shading y1y1 x1x1 (r1,g1,b1,a1) y2y2 x2x2 (r2,g2,b2,a2) (r2,g2,b2,a2) = F ( (r1,g1,b1,a1), TEX ) TEX F è il fragment shader (il programma che colora il frammento corrente utilizzando una o più texture) Multi-Pass Algorithm Immagine 2D RASTERIZZATA Immagine 2D RENDERIZZATA INPUTOUTPUT NB: L’I/O è una lettura / scrittura ordinata
Fragment Processor – I/O
Architettura SIMD
Streaming – elaborazione SIMD INPUT Stream OUTPUT Stream p0p0 p1p1 p2p2 p3p3 pnpn p0p0 p1p1 p2p2 p3p3 pnpn STREAM: vettore ordinato di dati (vertici o frammenti) U0U0 U1U1 U2U SIMD Processor KERNEL: opera su ogni elemento dello stream indipendentemente K K K uniform vec3 LightPosition; const float SpecularContribution = 0.3; const float DiffuseContribution = SpecularContribution; varying float LightIntensity; varying vec2 MCposition; void main(void) { vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Vertex); vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal); vec3 lightVec = normalize(LightPosition - ecPosition); vec3 reflectVec = reflect(-lightVec, tnorm); vec3 viewVec = normalize(-ecPosition); float diffuse = max(dot(lightVec, tnorm), 0.0); float spec = 0.0; if (diffuse > 0.0) { spec = max(dot(reflectVec, viewVec), 0.0); spec = pow(spec, 16.0); } LightIntensity = DiffuseContribution * diffuse + SpecularContribution * spec; MCposition = gl_Vertex.xy; gl_Position = ftransform(); } Kernel Letture Ordinate Input Ordinato oppure Scritture Ordinate Output Ordinato oppure Flussi INDIPENDENTI
Fragment Streaming FU Letture Ordinate Scritture Ordinate Letture Random Input Ordinato Output Ordinato oppure Texture (r,g,b,a) Multi-Pass Algorithm Una texture può essere vista come un array bidimensionale o tridimensionale Display FBO based Fragment Processor
Architettura Gerarchia di Memoria
Ho quattro tipi astrazioni grafiche in corrispondenza dei seguenti stream: · Vertex stream · Texture stream · Fragment stream · Framebuffer stream ( Il Framebuffer stream comincia e termina all’interno della GPU) Mem.CENTRALE Cache Registri Mem.VIDEO ALU GRAFICAGRAFICA INTERFACCIAINTERFACCIA Utilizzano particolari accessi a memoria utilizzando specifiche primitive come vertici, fragment, texture e framebuffer OpenGL Direct3D
Texture Stream + FB Stream FB Stream Texture Stream Multipass Algorirhm Render to Texture E’ necessaria L’estensione GLEW delle OpenGL per gestire il Framebuffer Object (FBO)
Architettura PROGRAMMABILE
Programmabilità della GPU
Pipeline GPU unità parallele z-cull scarta i pixel che sono occlusi da oggetti Assemble primitives I vertici sono poi raggruppati in primitive: punti, linee e triangoli. Rasterizzazione calcola quanti fragment compongono ogni primitiva Fragment è un “possibile” pixel I fragment lasciano i fragment processor nell'ordine in cui sono stati rasterizzati e fluiscono all'unità z-compare e all'unità blend, che eseguono vari test, quindi il colore finale viene scritto sul render target o sul framebuffer. Cull / Clip / Setup esegue le operazioni pre-primitiva, rimuovendo le primitive che non sono visibili perché dietro la visuale e ritagliando le primitive che intersecano il riquadro visualizzabile. Quad / RGBA 1 – 128 unità parallele
Riepilogo sulla Programmabilità Le zone non programmabili, posso comunque sfruttarle, come blocchi decisionali, per scartare determinate porzioni dello stream in input senza ricorrere a codice aggiuntivo. Tale tecnica sicuramente alleggerisce il codice degli shader file ma il vero vantaggio risiede nel guadagno ottenuto in fase di esecuzione.
GPU Linguaggi di programmazione
I Metalinguaggi non sono linguaggi veri e propri ma delle librerie che incluse in un linguaggio di programmazione aggiungono nuovi comandi di facile lettura e scrittura che facilitano il lavoro del programmatore. Sia Sh che Brook sono metalinguaggi che si appoggiano al C++, e permettono l'utilizzo della GPU come coprocessore. La differenza principale tra Sh e Brook è che il primo si propone per un utilizzo grafico, ma facilita la stesura anche di applicazioni general purpose mentre Brook è specializzato per la general purpose computation. Inoltre Brook ha un suo compilatore che traduce il codice in Cg che poi deve essere ricompilato, mentre Sh viene compilato direttamente insieme al codice C++, saltando questa fase intermedia. Linguaggi di Shading Le differenze spesso sono puramente sintattiche mentre l'insieme delle funzioni disponibili è praticamente identico. Gestiscono array ed è possibile definire strutture, prevedono controlli di flusso quali le condizioni, i cicli e infine le chiamate di funzioni. Data la natura dei dati che devono gestire, il supporto a vettori e matrici e relativi operatori matematici sono fortemente ottimizzati ed è prevista tutta una serie di funzioni tipiche dell'ambiente grafico. GLSL
Linguaggi di Shading - GLSL vs Cg
OpenGL/Direct3D Interfacce: OpenGL / Direct3D La vera differenza sta nella portabilità.
OpenGL/Direct3D Interfacce: OpenGL / Direct3D
Compilazione Dinamica OpenGL
Gestori di finestre: GLUT / SDL La visualizzazione avviene in una finestra messa a disposizione dal window system: Il frame buffer viene mappato sulla finestra Utilizza il paradigma event driven programming Gestione interazione applicazione utente tramite callback (message handlers ecc.) attivate in risposta a vari eventi (messaggi) gestiti dal sistema operativo (pressione di un tasto del mouse o della tastiera, reshape della finestra, ecc.) Il flusso principale dell’applicazione è in mano all’utente, o meglio al sistema operativo che intercetta le azioni dell’utente OpenGL è indipendente dallo specifico window system, quindi non ha modo di fare da solo questa mappatura
Shader ver. 2.0 PIXEL Shader 2.0 PIXEL Shader 1.0 VERTEX Shader 2.0
NVIDIA G80 Architecture
Interconnessione SLI Link Interface Scalabile SLI Frame Rendering: Combina due schede grafiche PCI Express con un connettore SLI per scalare in modo trasparente le prestazioni delle applicazioni su un singolo display, presentandole al sistema operativo come un’unica scheda grafica SLI Multi View: Combina la potenza di due schede grafiche NVIDIA Quadro PCI Express per estendere su più display una singola finestra di un’applicazione OpenGL ad accelerazione hardware, eseguire una singola applicazione per GPU con più output su display, o abilitare altri usi flessibili di due schede grafiche PCI Express.
NVIDIA G80 Architecture
Destinata ad appassionati di videogame NVIDIA GeForce 8800 GTX 700 dollari
Set di Driver specificamente Indirizzato ad applicazioni professionali dollari 3000 dollari