Vale la pena preoccuparsi della località di riferimento della GPU?


9

La località di riferimento fa la differenza tanto quanto le prestazioni della GPU quanto le prestazioni della CPU?

Ad esempio, se invio 200 comandi di disegno alla GPU, vedrò una differenza (potenzialmente) evidente se i dati per ciascun comando sono contigui in memoria invece di saltare nei buffer / mappe di trama?

Domanda a margine: presumo che la GPU garantisca i problemi di falsa condivisione avendo la maggior parte delle risorse immutabili. Ma nel caso in cui non lo siano, è per questo che i thread fanno sempre quattro frammenti di lavoro?

Risposte:


10

La località di riferimento è importante, ma non devi preoccuparti così tanto ... perché non hai il controllo assoluto.

Quando si utilizza OpenGL / DirectX di solito si ha un controllo limitato sul layout della memoria, il driver farà il resto. Ad esempio, è possibile provare più layout di buffer di vertici, ad esempio l'utilizzo dei dati dei vertici interleaved o non interleaved e in base alle prestazioni dei dati / driver / GPU varierà. Profilo e scegli ciò che meglio si adatta alla tua applicazione.

Ad esempio nell'ottimizzazione della GPU Gems Pipeline Pipeline, la località di riferimento viene menzionata due volte , la prima:

Accedi ai dati dei vertici in modo relativamente sequenziale. Le GPU moderne accedono alla memoria cache quando recuperano i vertici. Come in qualsiasi gerarchia di memoria, la località spaziale di riferimento aiuta a massimizzare gli hit nella cache, riducendo così i requisiti di larghezza di banda.

E il secondo

Ottimizza per la cache dei vertici post-T & L. Le GPU moderne hanno una piccola cache FIFO (first-in, first-out) che memorizza il risultato dei vertici trasformati più di recente; un successo in questa cache salva tutto il lavoro di trasformazione e illuminazione, insieme a tutto il lavoro svolto in precedenza nella pipeline. Per sfruttare questa cache, è necessario utilizzare primitive indicizzate e ordinare i vertici per massimizzare la località di riferimento sulla mesh. Sono disponibili strumenti, tra cui D3DX e NVTriStrip (NVIDIA 2003), che possono aiutarti in questo compito.

A mio avviso, tali raccomandazioni seguono ciò di cui sto parlando e implicano che non si ha il controllo assoluto sul layout della memoria, tuttavia ciò su cui si ha il controllo, ad esempio il modo in cui sono disposti i vertici di VBO, può influire sulle prestazioni.

Se la tua applicazione ha un impatto sulle prestazioni, dovresti prima rilevare il collo di bottiglia, potrebbe non essere un problema di localizzazione dei dati di riferimento, ma potrebbe esserci perché ci sono enormi quantità di dati senza abbattimento, ad esempio non stai eseguendo l'abbattimento del frustum. ecc. Puoi controllare la mia risposta qui sull'argomento.

Penso che dovresti preoccuparti di più sulla località di riferimento quando usi OpenCL / CUDA dove hai spesso il controllo assoluto sul layout della memoria.


3

Inizialmente, le GPU venivano utilizzate solo per applicazioni multimediali che mostrano un riutilizzo dei dati limitato. Man mano che le GPU vengono sempre più utilizzate per applicazioni di uso generale (da qui il termine GPGPU), ora dispongono di cache gestite dall'hardware di grandi dimensioni, ad esempio, la GPU Fermi ha 768 KB di cache di ultimo livello, la GPU Kepler ha 1536 KB di cache di ultimo livello e la GPU Maxwell ha 2048 KB di cache di ultimo livello. Questo, insieme a una vasta serie di ricerche sulle cache GPU, dimostra che la localizzazione dei dati è sicuramente importante per le GPU. Vedi il mio documento di indagine per dettagli e riferimenti per quanto sopra.

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.