regolare C/Costanti di stile C++: le costanti CUDA C (a sua volta una modifica di C99) sono entità assolute di tempo di compilazione. Ciò non sorprende, dato che la quantità di ottimizzazione che si verifica in NVCC è MOLTO coinvolta data la natura dell'elaborazione della GPU.
#define
: i macro sono come sempre molto ineleganti ma utili in un pizzico.
Lo specifier variabile __constant__
è, tuttavia, un animale completamente nuovo e qualcosa di un termine improprio a mio parere. Io sedare quella Nvidia ha here nello spazio sottostante:
Il __constant__
qualificazione, eventualmente utilizzati insieme con __device__
, dichiara una variabile che:
- risiede nello spazio di memoria costante,
- La durata di un'applicazione,
- È accessibile da tutti i thread all'interno della griglia e dall'host tramite la libreria di runtime (cudaGetSymbolAddress()/ cudaGetSymbolSize()/cudaMemcpyToSymbol()/cudaMemcpyFromSymbol()).
documentazione Nvidia specifica che __constant__
è disponibile a registro velocità livello (quasi zero latenza) a condizione che sia la stessa costante accedano tutte fili di ordito.
Sono dichiarati a livello globale nel codice CUDA. TUTTAVIA, in base all'esperienza personale (e attualmente in corso), bisogna fare attenzione con questo specificatore quando si tratta di compilare separatamente, come la separazione del codice CUDA (.cu e.file cuh) dal codice C/C++ inserendo funzioni wrapper in intestazioni in stile C.
A differenza delle tradizionali variabili "costanti" specificate, tuttavia, queste vengono inizializzate in fase di esecuzione dal codice host che alloca la memoria del dispositivo e infine avvia il kernel. Ripeto che sto attualmente lavorando codice che dimostra questi possono essere impostati in runtime utilizzando cudaMemcpyToSymbol() prima dell'esecuzione del kernel.
Sono abbastanza pratici per non dire altro data la velocità del livello di cache L1 che è garantita per l'accesso.
le costanti che sono note al momento della compilazione devono essere definite utilizzando le macro del preprocessore (ad esempio '# define'). In altri casi, '__constant__' [variabili] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#constant) può essere una delle opzioni che il programmatore CUDA usa per ottimizzare il codice che accede variabili calcolate che non cambiano. Nota che il tuo uso di "" M "' per fare riferimento a un simbolo non è più valido in cuda 5. –
Sarebbe interessante sapere quanto sia la differenza di runtime tra queste due possibilità. Sto lavorando su alcuni codici cfd e vorrei passare i parametri come opzioni al programma, quindi sarebbe necessario utilizzare il primo approccio. D'altra parte, se utilizzo macro di preprocessore, ciò non sarebbe possibile. – jrsm
Poiché il secondo esempio non genera alcun codice macchina di alcun tipo, non è una domanda sensata. È necessario porre uno scenario di utilizzo di runtime effettivo al fine di dare un senso a questa domanda. Per il caricamento iniziale di un singolo valore scalare immediato in una variabile o registro, il secondo metodo sarà sempre più veloce. –