2012-09-23 9 views
12

Esiste un modo per i dispositivi CUDA 2.0 di disabilitare la cache L1 solo per una variabile specifica? So che è possibile disabilitare la cache L1 in fase di compilazione aggiungendo il flag -Xptxas -dlcm=cg a nvcc per tutte le operazioni di memoria. Tuttavia, voglio disabilitare la cache solo per le letture della memoria su una specifica variabile globale in modo che tutto il resto della memoria sia letto per passare attraverso la cache L1.CUDA disabilita la cache L1 solo per una variabile

Sulla base di una ricerca eseguita nel web, una possibile soluzione è tramite il codice dell'assieme PTX.

risposta

14

come detto sopra è possibile utilizzare in linea PTX, ecco un esempio:

__device__ __inline__ double ld_gbl_cg(const double *addr) { 
    double return_value; 
    asm("ld.global.cg.f64 %0, [%1];" : "=d"(return_value) : "l"(addr)); 
    return return_value; 
} 

Si può facilmente variare a questo scambiando .f64 per .f32 (float) o .s32 (int), ecc, il vincolo di return_value "= d" per "= f" (float) o "= r" (int) etc. Si noti che l'ultimo vincolo prima (addr) - "l" - indica l'indirizzamento a 64 bit, se si utilizza l'indirizzamento a 32 bit, dovrebbe essere "r".

+0

Grazie! Funziona alla grande! – zeus2

+0

@Reguj, questo non è fornito dalle intestazioni di NVIDIA da nessuna parte? – einpoklum

+0

[questo] (https://nvlabs.github.io/cub/classcub_1_1cache_modified_input_iterator.html#details) potrebbe essere di interesse –

5

PTX in linea può essere utilizzato per caricare e memorizzare la variabile. Le istruzioni ld.cg e st.cg memorizzano solo i dati nella cache in L2. Gli operatori cache sono descritti nella sezione 8.7.8.1 Cache Operators del documento PTX ISA 2.3. Le istruzioni o gli interessi sono ld e st. Inline PTX è descritto in Using Inline PTX Assembly in CUDA.

0

Se si dichiara la variabile come volatile, verrà memorizzata nella cache L2 solo sulle GPU Fermi. Si noti che alcune ottimizzazioni del compilatore, come la rimozione di carichi ripetuti, non vengono eseguite su variabili volatili perché il compilatore presuppone che possano essere scritte da un altro thread.

+1

Non penso che il modello di programmazione fornisca alcuna rappresentazione sulla capacità di memorizzazione delle variabili volatili. – ArchaeaSoftware

+0

@Archaea L'architettura Fermi rende impossibile la memorizzazione nella cache dei dati volatili, a causa dell'assenza di coerenza della cache. Avendo incontrato errori nella documentazione CUDA in passato, non considero affidabile la documentazione del modello di memoria di CUDA. – Heatsink

+0

Ho provato la soluzione con la declinazione variabile volatile e non ha funzionato. Sembra che la variabile sia di nuovo memorizzata nella cache. – zeus2