2013-02-08 9 views
7

Cercare di comprendere le differenze tra l'architettura virtuale e reale di cuda e in che modo le diverse configurazioni influenzeranno le prestazioni del programma, ad es.differenze tra architettura virtuale e reale di cuda

-gencode arch=compute_20,code=sm_20 
-gencode arch=compute_20,code=sm_21 
-gencode arch=compute_21,code=sm_21 
... 

La seguente spiegazione è stata data nel manuale NVCC,

compilazione GPU avviene tramite una rappresentazione intermedia, PTX ([...]), che può essere considerato come assemblaggio di una architettura virtuale della GPU. Contrariamente a un processore grafico reale , tale GPU virtuale è definita interamente dall'insieme di funzionalità o funzionalità, , che fornisce all'applicazione. In particolare, un'architettura GPU virtuale fornisce un set di istruzioni generico (in gran parte) e la codifica delle istruzioni binarie è un non-problema poiché i programmi PTX sono sempre rappresentati in formato testo. Quindi, un comando di compilazione nvcc utilizza sempre due architetture: un'architettura di calcolo per specificare l'architettura intermedia virtuale, oltre a una vera architettura GPU per specificare il processore desiderato da eseguire. Affinché un comando nvcc sia valido, , l'architettura reale deve essere un'implementazione (in qualche modo o un'altra) dell'architettura virtuale . Questo è ulteriormente spiegato di seguito. L'architettura virtuale scelta è più una dichiarazione sulle funzionalità della GPU che richiede l'applicazione : l'utilizzo di un'architettura virtuale più piccola consente comunque un intervallo più ampio di architetture effettive per il secondo stadio nvcc. Al contrario, la specifica di un'architettura virtuale che fornisce funzionalità inutilizzate dall'applicazione limita inutilmente il set di possibili GPU che possono essere specificate nel secondo stadio nvcc.

Ma ancora non riesce quasi mai come le prestazioni sarà influenzato da diverse configurazioni (o, forse interesserà solo la selezione dei dispositivi fisici GPU?). In particolare, questa affermazione è più confuso per me:

In particolare, un'architettura GPU virtuale fornisce una (in gran parte) generico set di istruzioni , e la codifica di istruzioni binario è un non-problema, perché programmi PTX sono sempre rappresentati in formato testo.

risposta

6

La sezione utente NVIDIA CUDA Compiler Driver NVCC La sezione GPU Compilation fornisce una descrizione molto dettagliata dell'architettura virtuale e fisica e del modo in cui i concetti vengono utilizzati nel processo di generazione.

L'architettura virtuale specifica il set di funzionalità a cui è indirizzato il codice. La tabella elencata di seguito mostra alcune delle evoluzioni dell'architettura virtuale. Durante la compilazione è necessario specificare l'architettura virtuale più bassa con un set di funzionalità sufficiente per consentire l'esecuzione del programma sulla più ampia gamma di architetture fisiche.

Virtuale dell'Architettura Feature List (dalla Guida per l'utente)

compute_10 Basic features 
compute_11 + atomic memory operations on global memory 
compute_12 + atomic memory operations on shared memory 
      + vote instructions 
compute_13 + double precision floating point support 
compute_20 + Fermi support 
compute_30 + Kepler support 

L'architettura fisica specifica l'attuazione della GPU. Ciò fornisce al compilatore il set di istruzioni, la latenza delle istruzioni, il throughput delle istruzioni, le dimensioni delle risorse, ecc. In modo che il compilatore possa tradurre in modo ottimale l'architettura virtuale in codice binario.

È possibile specificare più coppie di architettura fisiche e virtuali nel compilatore e fare in modo che il compilatore restituisca il PTX e il binario finali in un singolo binario. Durante il runtime, il driver CUDA sceglierà la migliore rappresentazione per il dispositivo fisico installato. Se il codice binario non viene fornito nel fatbinary, il driver può eseguire in runtime JIT la migliore implementazione di PTX.

1

L'architettura virtuale specifica quali funzionalità ha una GPU e l'architettura reale specifica come funziona.

Non riesco a pensare a nessun esempio specifico a portata di mano. Un esempio (probabilmente non corretto) può essere una GPU virtuale che specifica il numero di core di una scheda, quindi viene generato il codice che punta a quel numero di core, mentre la carta reale potrebbe avere qualche altro per la ridondanza (o alcuni meno a causa della produzione errori) e alcuni metodi di mappatura ai core attualmente in uso, che possono essere posizionati in cima al codice più generico generato nel primo passaggio.

Si può pensare al codice di ordine simile al codice PTX, che si rivolge a una determinata architettura, che può quindi essere compilata in codice macchina per un processore specifico. Targeting del codice assembly per il giusto tipo di processore genererà, in generale, un codice macchina migliore.

0

bene in genere ciò che nvidia scrive come documento fa sì che le persone (me compreso) diventino più confuse! (solo io forse!)

si è interessati alle prestazioni, in pratica ciò che questo dice è che non è (probabilmente) ma si dovrebbe. In sostanza l'architettura GPU è come la natura. corrono su qualcosa e succede qualcosa. poi cercano di spiegarlo. e poi te lo danno da mangiare.

alla fine dovrebbe probabilmente eseguire alcuni test e vedere quale configurazione dà il miglior risultato.

l'architettura virtuale è ciò che è progettato per farti pensare liberamente. dovresti obbedire a questo, usare tutti i thread che vuoi, puoi assegnare praticamente tutto come numero di thread e blocchi, non importa, sarà tradotto in PTX e il dispositivo lo eseguirà.

l'unico problema è che se si assegna più di 1024 thread per un singolo blocco si otterranno 0 s come risultato, perché il dispositivo (l'architettura reale) non lo supporta.

o ad esempio il dispositivo supporta CUDA 1.2, è possibile definire le variabili di puntamento doppie nel codice, ma di nuovo si otterranno 0 s come risultato perché semplicemente il dispositivo non può eseguirlo.

Per quanto riguarda le prestazioni, è necessario sapere che ogni 32 thread (ad esempio orditi) devono accedere a una singola posizione in memoria, altrimenti l'accesso verrà serializzato e così via.

Quindi spero che tu abbia capito il punto, è una scienza relativamente nuova e GPU è un'architettura hardware davvero sofisticata, tutti cercano di trarne il massimo, ma è un gioco di test e un poca conoscenza dell'architettura reale dietro CUDA. Suggerisco di cercare l'architettura GPU e vedere come vengono effettivamente implementati i thread virtuali ei blocchi di thread.

3

Il codice "architettura virtuale" verrà compilato da un compilatore just-in-time prima di essere caricato sul dispositivo. AFAIK, è lo stesso compilatore di quello invocato da NVCC quando si crea un codice di "architettura fisica" offline, quindi non so se ci saranno differenze nelle prestazioni delle applicazioni risultanti.

Fondamentalmente, ogni generazione dell'hardware CUDA è binaria incompatibile con la generazione precedente - immagina la prossima generazione di processori Intel con set di istruzioni ARM. In questo modo, le architetture virtuali forniscono una rappresentazione intermedia dell'applicazione CUDA che può essere compilata per l'hardware compatibile. Ogni generazione di hardware introduce nuove funzionalità (ad es. Atomics, Parallelismo dinamico CUDA) che richiedono nuove istruzioni: ecco perché sono necessarie nuove architetture virtuali.

In sostanza, se si desidera utilizzare CDP, è necessario compilare per SM 3.5. È possibile compilarlo sul dispositivo binario che avrà il codice assembly per la generazione di dispositivi CUDA specifici o è possibile compilarlo al codice PTX che può essere compilato nell'assembly del dispositivo per qualsiasi generazione di dispositivo che fornisce queste funzionalità.

Problemi correlati