2012-05-26 15 views
11

Di recente ho eseguito l'aggiornamento da una GTX480 a una GTX680 nella speranza che il numero triplo di core si sia manifestato come un significativo aumento delle prestazioni nel mio codice CUDA. Con mio orrore, ho scoperto che i miei kernel CUDA con memoria intensiva funzionano con il 30% -50% più lento su GTX680.Come quantificare i compromessi di elaborazione dei dispositivi CUDA per i kernel C?

Mi rendo conto che questa non è una domanda di programmazione, ma influisce direttamente sulle prestazioni dei kernel CUDA su dispositivi diversi. Qualcuno può fornire alcune informazioni sulle specifiche dei dispositivi CUDA e su come possono essere utilizzate per dedurre le loro prestazioni sui kernel CUDA C?

+3

Per le massime prestazioni è necessario ottimizzare il codice per diverse configurazioni della GPU. –

+3

Da quello che Wikipedia mi dice, la memoria BW del 680 non è molto più alta di quella del 480. Quindi, se sei legato alla memoria, non vedrai molta accelerazione. Non riesco a spiegare perché vedi un rallentamento, comunque. –

+0

Quella versione del toolkit CUDA si usa? – geek

risposta

9

Non esattamente una risposta alla tua domanda, ma alcune informazioni che potrebbero essere di aiuto per comprendere le prestazioni del GK104 (Keplero, GTX680) contro il GF110 (Fermi, GTX580):

On Fermi , i core funzionano a doppia frequenza rispetto al resto della logica. Su Keplero, corrono alla stessa frequenza. Questo dimezza in modo efficace il numero di core su Keplero se si vuole fare più di un confronto mele-mele con Fermi. Così lascia GK104 (Kepler) con 1536/2 = 768 "nuclei equivalenti di Fermi", che è solo il 50% in più dei 512 core del GF110 (Fermi).

Osservando i conteggi dei transistor, la GF110 ha 3 miliardi di transistor mentre la GK104 ha 3,5 miliardi. Quindi, anche se Keplero ha 3 volte più core, ha solo un po 'più transistor. Così ora, non solo Keplero ha solo il 50% in più di "Fermi equivalenti" di Fermi, ma ognuno di questi core deve essere molto più semplice di quelli di Fermi.

Quindi, questi due problemi probabilmente spiegano perché molti progetti vedono un rallentamento durante il porting su Kepler.

Inoltre, il GK104, essendo una versione di Kepler realizzata per schede grafiche, è stato regolato in modo tale che la cooperazione tra i thread sia più lenta rispetto a Fermi (in quanto tale cooperazione non è così importante per la grafica). Qualsiasi potenziale guadagno potenziale di prestazioni, dopo aver tenuto conto dei fatti di cui sopra, può essere negato da questo.

C'è anche il problema delle prestazioni in virgola mobile a doppia precisione. La versione di GF110 utilizzata nelle schede Tesla può eseguire un virgola mobile a doppia precisione a 1/2 della prestazione di precisione singola. Quando il chip viene utilizzato nelle schede grafiche, le prestazioni a doppia precisione sono artificialmente limitate a 1/8 delle prestazioni a precisione singola, ma questo è ancora molto meglio rispetto alle prestazioni a doppia precisione 1/24 di GK104.

+0

Ottima informazione, grazie. –

+2

Alcune prestazioni integer, compresi spostamenti, confronti e moltiplicazioni, sono anche molto più lente su GK104. Digita anche le conversioni. Vedere la Tabella 5-1 (pagina 74) della Guida alla programmazione CUDA C versione 4.2. La capacità di calcolo 3.0 è GK104. Fai attenzione al rapporto con le operazioni in virgola mobile a precisione singola. Il GK110, in arrivo il 4 ° trimestre 2012, risolve molti di questi, ed è la parte "reale" della prossima generazione di Tesla. – Peter

+0

@Peter: Grazie per l'informazione. Mi sembra che tutto ciò che mostra davvero sia che il GK104 non è mai stato concepito come una parte di calcolo. Tuttavia, il chip si sta facendo strada in una carta Tesla, il K10. A meno che la versione della scheda grafica non sia stata in qualche modo zoppicante, questo non ha molto senso per me. Ci sono degli speedup, ma solo su algoritmi che assomigliano molto agli algoritmi usati quando i core sono usati come shader (per la grafica). –

1

Credo che il problema può risiedere nel numero di Streaming Multiprocessor: La GTX 480 ha 15 SM, la GTX 680 solo 8.

il numero di SMS è importante, poiché al massimo 8/16 blocchi o 1536/2048 thread (capacità di calcolo 2.0/3.0) possono risiedere su un singolo SM. Le risorse che condividono, ad es. memoria condivisa e registri, può ulteriormente limitare il numero di blocchi per SM. Inoltre, il numero più elevato di core per SM sulla GTX 680 può essere sfruttato solo in modo ragionevole usando instruction-level parallelism, cioè eseguendo pipeline di più operazioni indipendenti.

Per individuare il numero di blocchi che è possibile eseguire contemporaneamente per SM, è possibile utilizzare il foglio di calcolo CUDA Occupancy Calculator di nVidia. Per visualizzare la quantità di memoria condivisa e i registri richiesti dal kernel, aggiungere -Xptxas –v alla riga di comando nvcc durante la compilazione.

+0

È quasi certamente un problema di larghezza di banda di memoria, ho ristretto alcuni kernel per ridurre i costi generali della memoria e la disparità delle prestazioni ridotta a pochi punti percentuali. –

+0

@GearoidMurphy: Ok, ma potresti comunque provare a ristrutturare i blocchi e il codice per sfruttare il> 3x numero di core. – Pedro

2

Uno dei progressi della nuova architettura Kepler è costituito da 1536 core raggruppati in 8 SMX 192-core, ma allo stesso tempo questo numero di core è un grosso problema. Perché la memoria condivisa è ancora limitata a 48 kb. Quindi, se l'applicazione richiede molte risorse SMX, non è possibile eseguire 4 warp in parallelo su SMX singolo. Puoi profilare il tuo codice per trovare l'occupazione reale della tua GPU. I modi possibili per migliorare l'applicazione:

  1. utilizzare le funzioni di voto di curvatura invece delle comunicazioni di memoria condivisa;
  2. aumenta un numero di blocchi del battistrada e diminuisce un numero di fili in un blocco;
  3. ottimizza carichi/negozi globali. Kepler ha 32 moduli di carico/archivio per ogni SMX (due volte più di Kepler).
+0

@Pedro SMX è un'abbreviazione. NVidia chiama il design SM di nuova generazione come SMX. vedere [White paper NVidia] (http://www.geforce.com/Active/en_US/en_US/pdf/GeForce-GTX-680-Whitepaper-FINAL.pdf). Le funzioni di votazione possono aiutare a scambiare/condividere alcuni valori senza memorizzarli nella memoria condivisa. Ad esempio è possibile implementare la riduzione senza l'utilizzo della memoria condivisa. – geek

+0

Questa risposta è un po 'confusa. Puoi espanderlo un po 'per chiarezza? – Pedro

2

Sto installando nvieuw e utilizzo i coolbits 2.0 per sbloccare i core dello shader dal valore predefinito alle massime prestazioni. Inoltre, è necessario disporre di entrambi i connettori del dispositivo su 1 display, che può essere abilitato nella schermata 1/2 del pannello di controllo nVidia e nella schermata 2/2. Ora è necessario clonare questa schermata con l'altra e la configurazione della risoluzione di Windows imposta la modalità schermo su desktop esteso.

Con nVidia inspector 1.9 (driver di livello BIOS), è possibile attivare questa modalità impostando un profilo per l'applicazione (è necessario aggiungere il file exe dell'applicazione al profilo). Ora hai quasi il doppio delle prestazioni (tieni d'occhio la temperatura).

DX11 dispone anche di tesselation, quindi si desidera eseguire l'override e ridimensionare la risoluzione nativa. La risoluzione nativa può essere ottenuta con un rendering inferiore come 960-540P e lasciare che le condotte 3D facciano il resto per scalare fino all'HD completo (nella dimensione e posizione del desktop del pannello di controllo di nv). Ora ridimensiona la ris più bassa a schermo intero con display, e hai Full HD con il doppio della quantità di rendering della dimensione della trama al volo e tutto dovrebbe essere buono per il rendering di trame 3D con estremo bias LOD (livello di dettaglio). Lo schermo deve essere su zoom automatico!

Inoltre, è possibile battere i computer sli config. In questo modo ottengo punteggi più alti rispetto a 3 vie in tessmark. Le alte impostazioni AA come il campione misto 32X fanno sembrare l'hd in qualità AAA (in benchmark e benchon pesanti). Non ci sono impostazioni di risoluzione in endscore, quindi questo dimostra che non è importante il rendering della risoluzione nativa!

Questo dovrebbe darti dei risultati reali, quindi per favore leggi attentamente non letterario.

Problemi correlati