In quali circostanze si deve utilizzare la parola chiave volatile
con una memoria condivisa del kernel CUDA? Capisco che volatile
dice al compilatore di non memorizzare nella cache tutti i valori, ma la mia domanda è circa il comportamento con una matrice comune:Quando utilizzare volatile con memoria CUDA condivisa
__shared__ float products[THREADS_PER_ACTION];
// some computation
products[threadIdx.x] = localSum;
// wait for everyone to finish their computation
__syncthreads();
// then a (basic, ugly) reduction:
if (threadIdx.x == 0) {
float globalSum = 0.0f;
for (i = 0; i < THREADS_PER_ACTION; i++)
globalSum += products[i];
}
Devo products
ad essere volatili in questo caso? Ogni voce dell'array è accessibile solo da un singolo thread, tranne alla fine, dove tutto viene letto dal thread 0. È possibile che il compilatore possa memorizzare l'intero array, e quindi ho bisogno che sia il volatile
, o lo memorizzerà solo nella cache elementi?
Grazie!
Ottima risposta, non sapevo di memoria-scherma. Grazie! –