2010-03-04 18 views
5

La guida di programmazione CUDA afferma chesignificato della larghezza di banda in CUDA e perché è importante

"larghezza di banda è uno dei più importanti fattori di gating per le prestazioni. Quasi tutte le modifiche al codice devono essere effettuate nel contesto di come influenzano la larghezza di banda. "

Si passa a calcolare la larghezza di banda teorica che è nell'ordine di centinaia di gigabyte al secondo. Sono in perdita sul motivo per cui quanti byte si possono leggere/scrivere sulla memoria globale è un riflesso di quanto sia ottimizzato un kernel.

Se ho un kernel che esegue calcoli intensivi su dati memorizzati in memoria condivisa e/o registri, con solo una lettura singola all'inizio e scrivi alla fine da e verso la memoria globale, sicuramente l'effettiva larghezza di banda sarà piccolo, mentre il kernel stesso può essere molto efficiente.

Qualcuno potrebbe spiegare ulteriormente la larghezza di banda in questo contesto?

Grazie

risposta

4

la maggior parte di tutti i kernel computazionali non banali, in CPU e GPU, vincolati alla memoria. La GPU ha un'intensità e una velocità di elaborazione molto elevate, ma l'accesso alla memoria principale è molto lento e presenta un'elevata latenza, alcune centinaia di cicli per lettura/memoria rispetto a quattro cicli per molte operazioni aritmetiche.

Sembra che il tuo kernel sia legato alla computazione, quindi la tua fortuna. Tuttavia, è ancora necessario fare attenzione al conflitto di banchi di memoria condivisi, che può serializzare inaspettatamente porzioni di codice.

0

Tipicamente i kernel sono abbastanza piccole e semplici ed eseguire la stessa operazione su un sacco di dati. Potresti avere un gruppo di kernel che invochi in sequenza per eseguire un'operazione più complessa (pensala come una pipeline di elaborazione). Ovviamente il throughput della tua pipeline dipenderà sia dall'efficienza dei kernel che dalla limitatezza della larghezza di banda della memoria.

1

La maggior parte dei kernel è legata alla memoria, quindi la massimizzazione del throughput della memoria è fondamentale. Se sei abbastanza fortunato da avere un kernel legato all'elaborazione, l'ottimizzazione per il calcolo è generalmente più semplice. Devi stare attento alla divergenza e dovresti comunque assicurarti di avere abbastanza thread per nascondere la latenza della memoria.

Consulta la presentazione Advanced CUDA C per ulteriori informazioni, compresi alcuni suggerimenti su come confrontare le prestazioni realizzate con le prestazioni teoriche. Anche Best Practices Gude di CUDA ha alcune buone informazioni, è disponibile come parte del toolkit CUDA (download dallo NVIDIA site).

Problemi correlati