Dopo che è stata rilasciata la funzione di calcolo 2.0 (Fermi), mi sono chiesto se per la memoria condivisa sono rimasti dei casi d'uso. Cioè, quando è meglio usare la memoria condivisa che lasciare che L1 esegua la sua magia sullo sfondo?CUDA: Quando utilizzare la memoria condivisa e quando fare affidamento sulla memorizzazione nella cache L1?
La memoria condivisa è semplicemente lì per consentire agli algoritmi progettati per CC < 2.0 di funzionare in modo efficiente senza modifiche?
Per collaborare tramite memoria condivisa, i thread in un blocco scrivono nella memoria condivisa e si sincronizzano con __syncthreads()
. Perché non scrivere semplicemente nella memoria globale (tramite L1) e sincronizzarsi con __threadfence_block()
? Quest'ultima opzione dovrebbe essere più semplice da implementare in quanto non deve riguardare due diverse posizioni di valori, e dovrebbe essere più veloce perché non esiste una copia esplicita dalla memoria globale a quella condivisa. Poiché i dati vengono memorizzati nella cache in L1, i thread non devono attendere che i dati raggiungano effettivamente la memoria globale.
Con la memoria condivisa, è garantito che un valore che è stato messo lì rimane lì per tutta la durata del blocco. Questo è in contrasto con i valori in L1, che vengono sfrattati se non vengono utilizzati abbastanza spesso. Ci sono casi in cui è meglio memorizzare nella cache i dati usati raramente nella memoria condivisa piuttosto che lasciare che la L1 li gestisca in base al modello di utilizzo effettivamente utilizzato dall'algoritmo?
Grazie, questo risponde alla mia domanda. Avevo immaginato la cache come in grado di tenere traccia di quali elementi venivano utilizzati di più, e preferisco memorizzarli nella cache. Ho letto su cache associative n-way ora e mi sembra che il problema principale è che possono buttare fuori un valore che viene spesso utilizzato semplicemente perché un'altra linea cache si adatta allo slot. –
Penso che ciò significhi che una buona strategia per scrivere programmi CUDA potrebbe spesso essere prima scrivere l'algoritmo per usare solo la memoria globale e vedere se L1 funziona abbastanza bene che la latenza della memoria è nascosta. E poi considera l'ottimizzazione della mano con la memoria condivisa se l'algoritmo risulta vincolato alla memoria. –