Loading

Alison's New App is now available on iOS and Android! Download Now

Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Nella lezione precedente abbiamo imparato sull'hardware della grafica di base. Inoltre abbiamo appreso dei dispositivi di input e output grafici e anche architettura generale di un sistema grafico. Ora, continueremo la nostra discussione su questo hardware grafico e oggi copriremo le basi della programmazione GPU e GPU, che fanno parte dell'hardware grafico.
Quindi, iniziamo con GPU. Cos' è e come viene utilizzato per implementare la pipeline.
Una cosa che dovremmo notare nella grafica è che le operazioni grafiche sono altamente parallele in natura. Si tratta di caratteristiche molto cruciali delle operazioni grafiche. Di conseguenza, è necessario procedere al trattamento parallelo di queste operazioni.
Per esempio, considerare la fase di trasformazione della modellazione. Ricordate che in questa fase, cosa facciamo? Convertiamo o trasformiamo oggetti definiti nel loro sistema di coordinate locale o locale in una scena coordinata a livello mondiale. Ora, come facciamo, applichiamo le trasformazioni, ad esempio le rotazioni ai vertici che definiscono gli oggetti.
E qual è la trasformazione? Se potrete riraccogliere dalle nostre discussioni precedenti, definiamo la trasformazione come una moltiplicazione di due cose. Una è una matrice di trasformazione e l'altra è un vettore vertex. La cosa da notare qui è che la stessa moltiplicazione di matrice vettoriale è fatta per tutti i vertici che vogliamo trasformare. Questo significa che stiamo essenzialmente eseguendo la stessa moltiplicazione di funzionamento per tutti i vertici.
Ora, ci viene dato un insieme di vertici che definiscono gli oggetti. Possiamo andare per una moltiplicazione seriale in cui eseguiamo una moltiplicazione vettoriale a matrice alla volta. Tuttavia, che comunque non sarà molto efficiente. Perché essenzialmente stiamo eseguendo la stessa operazione, quindi invece di andare per la moltiplicazione seriale, se possiamo eseguire la stessa operazione su tutti i vettori contemporaneamente che è in parallelo allora avremo un guadagno significativo nelle prestazioni. E questo è molto importante nel rendering in tempo reale delle scene perché tipicamente dobbiamo processare milioni di vertici alla volta o milioni di vertici al secondo. Pertanto, se possiamo elaborare tutti questi milioni di vertici paralleli allora avremo un enorme guadagno nelle prestazioni.
Se stiamo eseguendo queste operazioni utilizzando la nostra CPU allora non possiamo approfittare di queste intrinseche natura parallele delle operazioni grafiche. Perché le CPU non sono progettate per questo. Per affrontare la questione in cui vogliamo approfittare di questi parallelismo intrinseci, c'è un hardware di uso speciale che arriva con i nostri sistemi. Quasi tutti i sistemi grafici arrivano con una scheda grafica separata, contenente la propria unità di elaborazione e elementi di memoria. Ora, questo sistema hardware specializzato separato viene chiamato unità di elaborazione grafica o GPU. Quindi, essenzialmente GPU significa un hardware specializzato che viene utilizzato per eseguire l'operazione grafica sfruttando il parallelismo intrinseca che ci sono nelle operazioni grafiche.
Andiamo all'interno degli allenamenti della GPU. Ora, dobbiamo notare che la GPU è un sistema multicore che significa che contiene un gran numero di core o elementi di elaborazione di unità. Ora, ognuno di questi core o questi elementi di elaborazione di unità si chiama processore di flusso. Perché funziona su flussi di dati, flussi di dati di input.
Ora, questi core non sono altro che hardware semplice in grado di eseguire solo operazioni aritmetiche intere e a virgola mobile. Quindi, ogni core può eseguire solo operazioni aritmetiche, interi aritmetici o aritmetici a virgola mobile. E più core sono raggruppati per formare un'altra unità chiamata multiprocessori in streaming o SM. Quindi, ogni core si chiama stream processor e molti simili sono raggruppati per formare multiprocessori in streaming.
Ora, questo ci porta all'idea di SIMD, nota il termine. Per capire, consideriamo un esempio, la trasformazione geometrica dei vertici di cui si stava discutendo in precedenza. Quindi, qui la nostra istruzione è la stessa che è la moltiplicazione. Ora, i dati su cui opera questa istruzione variano, perché i vettori vertex variano. Anche se la matrice di trasformazione rimane la stessa. Quindi, allora qui quello che stiamo facendo, stiamo avendo un'istruzione unica che lavora su più dati. Questa è l'idea di SIMD o Single Instruction Multiple Data, e i multiprocessori in streaming di GPU sono essenzialmente esempi di SIMD. Così, come funziona, qui come potete vedere, abbiamo lo stesso insegnamento dato a tutti i core e i core prendono dati che possono essere diversi ma l'istruzione sarà uguale e la stessa istruzione opererà su diversi flussi di dati. Un'altra illustrazione di questa idea è data qui, qui se non consideriamo SIMD allora cosa succede. Così abbiamo due operazioni di aggiunta su due flussi di dati. A0 B0 e A1 B1, quindi ci saranno due istruzioni separate per eseguire queste due aggiunte separate che danno l'uscita di C0 e C1, questa è un'operazione normale. In caso di SIMD ciò che accade è che abbiamo questo come flussi di dati e l'istruzione è unica. Qui da notare che abbiamo due istruzioni che lavorano su due flussi di dati separati. Qui abbiamo un'istruzione unica che funziona sia sui flussi di dati per darci l'output desiderato. Questa è l'idea di SIMD. Quindi, ora sai che le GPU contengono SM o multiprocessori in streaming che funzionano in base all'idea di SIMD.
Allora diamo uno sguardo a come sono organizzate le GPU. Come ho detto ogni multiprocessore streaming è progettato per eseguire operazioni SIMD. Così e abbiamo molti multiprocessori in streaming, come mostrato qui. Poi abbiamo qualche memoria specializzata, scopo di cui vi verrà spiegato a breve, e altri componenti per gestire questa elaborazione parallela. Ogni multiprocessore in streaming contiene più processori in streaming o corso come mostrato qui. E ogni core è in grado di eseguire solo operazioni aritmetiche intere o a virgola mobile. (Riferimento Slide Time: 11.33) Così, che è sostanzialmente ciò che ci sono in GPU, multiprocessori in streaming e unità di memoria dedicate più componenti aggiuntivi per gestire questa elaborazione parallela. Ora, cerchiamo di capire come funzionano le operazioni grafiche nelle GPU. Per prima cosa dovremmo notare che la maggior parte dei sistemi grafici in tempo reale ipotizza che la scena sia fatta di triangoli. Quindi, in realtà convertiamo qualsiasi superficie in triangoli o maglie triangolari. Questo punto abbiamo già discusso in precedenza quando si parlava di rappresentazione dell'oggetto.
Ora, dato che le informazioni di mesh triangolari cosa succede è che, quelle API dedicate che vengono fornite nella libreria grafica come OpenGL o Direct3D, questi triangoli sono invii a GPU, un vertice alla volta serialmente e GPU li assembla in triangoli.
Inoltre, dovremmo notare qui che i vertici sono rappresentati con sistema di coordinate omogenee. Così i vertici sono rappresentati nel sistema di coordinate omogenee.
E quindi abbiamo a che fare qui con la primississima fase che è la definizione oggetto, quindi questi oggetti sono definiti nei loro sistemi di coordinate locali o di modellazione. Poi la GPU esegue tutte le fasi, quindi prima esegue la trasformazione di modellazione sui vertici che è la prima fase di elaborazione.
E come abbiamo spiegato in precedenza questa trasformazione si ottiene con una singola matrice di trasformazione e l'operazione di moltiplicazione dei punti vettoriali.
Come abbiamo notato in precedenza, la GPU multicore esegue tali operazioni contemporaneamente o parallele, quindi essenzialmente i vertici multipli vengono trasformati contemporaneamente contemporaneamente. Non è che uno dopo l'altro stiamo eseguendo le moltiplicazioni. Quindi, quello che otteniamo dopo la moltiplicazione che è flusso di triangoli ma questa volta, sono definiti nel sistema di coordinate mondiali, che è lo scopo della modellazione della fase di trasformazione. Si ipotizza inoltre che il visore si trovi all'origine del sistema di coordinate del mondo e la direzione vista sia allineata con l'asse z. Questo è il presupposto utilizzando il quale viene progettato l'hardware.
Così, dopo la trasformazione di modellazione, la GPU calcola il colore vertex o lo stage di illuminazione. Ora, questo viene fatto in base alla luce che viene definita per la scena, quindi si ipotizza qualche fonte di luce e basata su quella sorgente luminosa questa colorazione è fatta. Ora, perché la GPU è adatta ai colori di calcolo perché se si può riraccogliere la nostra discussione sull'illuminazione, abbiamo notato che la colorazione può essere computata da prodotti dot dot e da una serie di operazioni di aggiunta e moltiplicazione. E queste operazioni vengono eseguite contemporaneamente per più vertici dalla GPU perché è progettato in quel modo, quindi ancora qui stiamo sfruttando la natura intrinseca delle operazioni grafiche che è il parallelismo.
Dopo la colorazione, ogni vertex 3D colorato viene proiettato sul piano blu. E che di nuovo si fa usando la moltiplicazione vettoriale di matrice, abbiamo già notato questo prima durante la nostra discussione sulla trasformazione in proiezione e l'output che otteniamo è flusso di triangoli nelle coordinate dello schermo o del dispositivo pronti per essere convertiti in pixel. Ora, notare qui che questa proiezione in realtà coinvolge anche la trasformazione vista. Cosa che non abbiamo esplicitamente citato qui come finestra per visualizzare la trasformazione. Tutte queste trasformazioni possiamo club insieme moltiplicando le corrispondenti matrici di trasformazione per ottenere una singola matrice di trasformazione.
Così, dopo quella tappa otteniamo i triangoli dello spazio del dispositivo e ora andiamo per la ristierizzazione o la conversione della scansione. Quindi qui si può notare che ogni triangolo spaziale del dispositivo sovrappone alcuni pixel sullo schermo che significa che quei pixel fanno parte dei triangoli. Nella fase di rasterizzazione questi pixel sono determinati.
Ora, i progettisti della GPU che hanno sviluppato le GPU nel corso degli anni hanno incorporato molti algoritmi di rasterizzazione, ne abbiamo già discusso pochi nelle nostre discussioni sulla rasterizzazione. Ora, questi algoritmi sfruttano un'osservazione cruciale che è ogni pixel può essere trattato indipendentemente da tutti gli altri pixel. Quindi, non è necessario trattare i pixel come dipendenti l'uno dall'altro possono essere trattati in modo indipendente.
Di conseguenza, i pixel possono essere rasterizzati paralleli, quindi è possibile utilizzare questo parallelismo intrinseca per rasterizzare contemporaneamente tutti i pixel. E questo è un grande vantaggio di avere GPU, non dobbiamo processare un pixel alla volta, invece possiamo elaborare tutti i pixel insieme per ottenere un risultato rapido, in uscita rapida.
Ora, se si può riraccogliere la pipeline grafica 3D, durante la fase di elaborazione dei pixel ci sono altre due fasi che ci sono, altre due attività che ci sono, una è la texturing di superficie o l'assegnazione dei modelli ai colori di superficie e la seconda è la rimozione della superficie nascosta o l'HSR.
Ora, l'idea di tessitura superficiale è molto semplice qui l'immagine texture è lì che in realtà viene imposta sulla superficie per darci l'illusione dei dettagli. Da notare che si tratta solo di una creazione di illusione piuttosto che di calcolo davvero un modello di tessitura, un semplice sostituzione dei colori dei pixel con il colore texture. Questa è l'idea più semplice che abbiamo discusso prima. (Riferimento Slide Time: 20.40) Ora, al fine di poter memorizzare questa texture immagini o mappe di texture. E dato che dobbiamo accederla, che le immagini texture frequentemente, idealmente dovrebbero essere memorizzate in memoria ad alta velocità, in modo che il tempo di accesso sia minore. Ecco, questo perché come abbiamo detto i calcoli di pixel precedenti sono molto frequenti e ogni calcolo di pixel deve accedere a queste immagini texture. In secondo luogo l'accesso è di solito molto regolare in natura. Il che significa che i pixel vicini tendono ad accedere alle vicine immagini texture o alle posizioni delle immagini di texture. Quindi, per ridurre l'orario di accesso la cache della memoria specializzata viene utilizzata per memorizzare le immagini texture come mostrato qui in questa figura. Si tratta di posizioni di memoria specializzate nella GPU per memorizzare immagini texture.
Inoltre, abbiamo discusso prima durante la nostra discussione sulla rimozione della superficie nascosta, l'idea di algoritmo di Z buffer o algoritmo di buffer di profondità. Ora, che viene implementato nelle GPU e per questo anche tipicamente le GPU sono dotate di elementi di memoria specializzati o di profondità. E memorizza la distanza dei telespettatori da ogni pixel. Quindi, questo è tipicamente parte della GPU.
Ora se potete riscuotere come funziona il buffer Z, quindi qui anche GPU confronta i pixel a distanza con distanza di pixel già presente che è semplicemente esegua l'algoritmo e la memoria di visualizzazione viene aggiornata solo se il nuovo pixel è più vicino. Quindi, implementa l'algoritmo di buffer Z, per maggiori dettagli si può fare riferimento alla lezione 23. Quindi, si hanno i multiprocessori in streaming, ogni corso contenente, poi questi vari elementi di dati per l'esecuzione di queste operazioni simultanee più la memoria di texture specializzata che formano GPU.
Ora, c'è un altro concetto che è l'idea di shader e di programmazione shader. Cerchiamo di capire questo concetto di programmazione in breve a un livello molto introduttivo. Nella nostra precedente discussione su GPU ciò che abbiamo discusso è che, come le GPU implementano le fasi di pipeline. Ora, in quella discussione se si può aver notato che ci sono due ampi gruppi di attività, una è l'elaborazione di vertici o di elaborazione di vertex chiamato anche elaborazione della geometria. Altro è l'elaborazione di pixel. Così, questi due ampi gruppi di attività sono stati discussi per spiegare il lavoro di GPU.
Ora, durante i primi anni di GPU che usavano per arrivare con la pipeline hardware a funzione fissa, questo significa che tutte le fasi di pipeline o tutte le fasi che implementano la pipeline sono pre - programmate e integrate nell'hardware. I componenti dedicati al contenuto GPU per attività specifiche e l'utente non avevano alcun controllo su come questa attività deve essere eseguita e quale unità di elaborazione esegue quale fase della pipeline. Quindi, la GPU precedente viene utilizzata per arrivare con questo hardware di funzione fissa che significa che tutto era prestabilito, che componente della GPU si occuperà di quale parte della pipeline e l'utente non aveva alcun controllo su di esso. Quindi, il flusso è stato tipicamente simile a questo dal programma utente i primitivi sono stati inviati, poi i componenti erano presenti per l'elaborazione della geometria, l'output è le coordinate dello schermo 2D da lì le elaborazioni dei pixel iniziano e i componenti sono stati nuovamente fissi.
Ma poi la gente si rende conto che, che in realtà sta riducendo la flessibilità e a causa di quella potenza di GPU non è stata completamente sfruttata. Per far leva meglio la potenza della GPU, le GPU moderne sono progettate per essere programmabili che significa che possiamo programmarle. Le unità di funzione fissa sono sostituite da una griglia unificata di processori detti "shaders". Così, in precedenza c'erano unità di funzione fissa, ora ci sono una griglia unificata di processori che si chiamano shaders.
E qualsiasi unità di elaborazione può essere utilizzata per l'esecuzione di qualsiasi calcolo della fase di pipeline. E gli elementi GPU, ovvero le unità di elaborazione e la memoria possono essere riutilizzati attraverso programmi utente.
Così, prima avevamo delle unità fisse per l'esecuzione di diverse fasi, ora abbiamo strutture comuni che vengono riutilizzate per eseguire diverse fasi e che sono determinate attraverso la programmazione. Quale porzione e come sono utilizzati gli elementi della GPU ovvero le unità di elaborazione e la memoria per le operazioni di esecuzione correlate ad una determinata fase. L'idea viene mostrata qui come si può vedere una volta che i primitivi vengono inviati alla GPU, la GPU come elemento comune, ora sottoinsieme di questi elementi comuni sono utilizzati per scopi diversi come si può vedere qui anche la memoria è condivisa e riutilizzata.
Ora, l'idea è che scriviamo programmi per utilizzare elementi GPU, questi programmi sono chiamati programmi shader e l'approccio corrispondente è chiamato shader programming. Passiamo brevemente attraverso le basi della programmazione shader.
Ora, con la GPU programmabile che abbiamo appena introdotto è possibile per programmatore modificare come i processi hardware della GPU i vertici e le sfumature pixel, sfumature significa assegnazione colore ai pixel. Questo è possibile scrivendo vertex shaders e shaders di frammento, questi sono anche chiamati vertex programmi e programmi di frammento. Questi sono termini che probabilmente siete arrivati con questi vengono utilizzati per specificare alla GPU come utilizzare il suo hardware per scopi specifici. E questo approccio come ho detto è noto come programmazione shader e ha altri nomi anche come la programmazione GPU, la programmazione hardware grafica e così via.
In caso di vertex shader, ciò che accade è che, questi programmi vengono utilizzati per elaborare vertici o la geometria. Essenzialmente questi programmi sono utilizzati per eseguire trasformazioni di modellazione, illuminazione e proiezione a coordinate dello schermo che coinvolgono tutte le trasformazioni intermedie di trasformazione della vista. E concettualmente la finestra per visualizzare anche la trasformazione.
In caso di shader di frammento fa un lavoro diverso, si tratta di programmi che eseguono le elaborazioni necessarie per l'elaborazione dei pixel. Ora quali sono i calcoli, quelli sono correlati a come ogni pixel viene reso, come viene applicata la texture o la mappatura della texture e se disegnare un pixel o meno che sia la rimozione della superficie nascosta. Quindi, questi 3 sono il compito fatto dagli shader di frammento. Da notare che tutti questi 3 sono relativi alla lavorazione dei pixel. Così, i caricatori di vertex stanno elaborando dei vertici per lo più legati alle trasformazioni dalla coordinazione della modellazione alla coordinata periferica, e tutte le trasformazioni in mezzo. Mentre gli shader di frammento si occupano di elaborazione di pixel che sta rendering di pixel che applicano le texture oltre ad eseguire la rimozione della superficie nascosta a livello di pixel.
Ora, perché si chiama frammento shader le unità di elaborazione dei pixel, implica che la GPU in qualsiasi istante possa elaborare un sottoinsieme o frammento di tutti i pixel dello schermo presenti. Così, in un momento in cui un sottoinsieme dei pixel dello schermo vengono elaborati da qui viene chiamato shader di frammento.
Ora, questi programmi di shader sono piccoli pezzi di codici e vengono inviati all'hardware grafico dai programmi degli utenti così essenzialmente richiamando alcune API ed eseguite su hardware grafici. Quindi, dovremmo tenere presente che sono piccoli pezzi di codici che vengono eseguiti su hardware grafici e che sono integrati nei programmi utente, inviati all'hardware dai programmi utente.
Infatti questa capacità di programmare le GPU ha dato vita a una nuova idea che è l'idea di una GPU di finalità generale o GPGPU. Di nuovo questi sono termini comuni oggigiorno e probabilmente si è arrivati attraverso questo termine, questo significa che possiamo utilizzare GPU per qualsiasi scopo non necessariamente solo per eseguire operazioni relative alla grafica. Quindi, con l'idea di GPGPU possiamo eseguire compiti che non sono legati alla grafica, comunque questi sono soggetti molto coinvolti e non andremo oltre a spiegare questi concetti.
Così, in sintesi quello che abbiamo imparato oggi, cerchiamo di ricapitolarci rapidamente.
Abbiamo imparato su come funziona l'hardware. Ora, questo significa l'unità di elaborazione grafica che sono comunque parte dei sistemi informatici che si occupano di operazioni grafiche. Abbiamo anche imparato come le fasi di pipeline sono implementate nella GPU e sono state introdotte all'idea di programmi di shader e shader.
Ora, questo riguarda l'hardware. Così, nella lezione precedente e la lezione di oggi abbiamo imparato sull'hardware grafico. Abbiamo iniziato con la discussione sull'architettura generale di un sistema di grafica un'architettura molto generica, poi spiegano termini diversi e poi in alcuni dettagli hanno imparato come funziona la GPU. Un componente rimane quello che come programmatore possiamo scrivere un programma per eseguire operazioni grafiche. Che impareremo quell' aspetto del corso che sta scrivendo programmi per eseguire l'operazione grafica o creare una scena sullo schermo che impareremo nella lezione successiva, dove impareremo a scrivere programmi utilizzando OpenGL che è una libreria grafica.
Qualunque cosa abbiamo discusso oggi potete trovare in questo libro, precisamente il capitolo 10, sezione 10 punto 3. Questo è tutto per oggi, ci vediamo nella lezione successiva. Grazie e addio.