Domanda

Qual è il miglior modello per ottenere una GPU in modo efficiente calcolare 'anti-funzionale' routine, che dipendono in genere posizionato memoria scrive invece di legge?Es.come calcolare un istogramma, la cernita, la divisione di un numero per le percentuali, la fusione di dati di diversa dimensione in liste etc.ecc.

È stato utile?

Soluzione

I termini stabiliti sono raccogliere letture e scrive a dispersione

raccogliere letture

Ciò significa che il tuo programma scriverà in una posizione fissa (come la posizione del frammento target di uno shader di frammenti), ma ha un rapido accesso alle fonti di dati arbitrarie (trame, uniformi, ecc.)

scrive a dispersione

Ciò significa che un programma riceve un flusso di dati di input che non può affrontare arbitamente, ma che può eseguire le scritture rapide a posizioni di memoria arbitrarie.

Chiaramente l'architettura shader di OpenGL è un sistema di raccolta. L'ultimo OpenGL-4 consente anche alcune scritture a dispersione nello shader di frammenti, ma sono lenti.

Quindi qual è il modo più efficiente, in questi giorni, per emulare "scattering" con OpenGL. Finora questo utilizza uno shader vertice che opera su punti di dimensioni pixel. Inviete tutti i punti che hai i punti di dati per elaborare e disperderli nella memoria target impostando le loro posizioni di conseguenza. È possibile utilizzare gli shader di geometria e di maglietta per produrre i punti elaborati nell'unità Vertex. È possibile utilizzare buffer di trama e UBO per l'input dei dati, utilizzando l'indice Vertex/Point per l'indirizzo.

Altri suggerimenti

GPU sono costruiti con diversi tipi di memoria.Un tipo è il DDRx RAM che è accessibile per la CPU e la GPU.In OpenCL e CUDA questo chiamato 'globale' di memoria.Per la Gpu dati in memoria globale deve essere trasferiti tra la GPU e Host.Di solito organizzati in banche per consentire la pipeline di accesso alla memoria.In modo casuale legge/scrive su 'globale' di memoria sono relativamente lenti.Il modo migliore per accedere alla sezione 'globale' di memoria in modo sequenziale.
La sua dimensione varia da 1G - 6B per dispositivo.

Il prossimo tipo di memoria della GPU.È la memoria condivisa che è disponibile per un numero di thread/orditi all'interno di una unità di calcolo/multi-processore.Questo è più veloce di memoria globale, ma non direttamente accessibili dall'host.CUDA chiama questa memoria condivisa.OpenCL chiama questa memoria locale.Questo è il migliore di memoria da utilizzare per l'accesso casuale a matrici.Per CUDA c'è 48K e OpenCL c'è di 32 kb.

Il terzo tipo di memoria della GPU registri, detti privati in OpenCL o locali in CUDA.Memoria privata, è il più veloce, ma c'è meno disponibile rispetto a locali/memoria condivisa.

La strategia migliore per ottimizzare l'accesso casuale per memoria per copiare i dati tra il globale e il locale/memoria condivisa.Così una GPU applicazione copiare porzioni la sua memoria globale al locale, condiviso, fare il lavoro utilizzando locali/condivisa e copiare i risultati per global.

Il modello di copia locale, il processo di utilizzo di locali e copia globale è un modello importante per capire e imparare a programmare bene su Gpu.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top