W jakich okolicznościach należy użyć słowa kluczowego volatile
z pamięcią wspólną jądra CUDA? Rozumiem, że volatile
informuje kompilator nigdy buforować żadnych wartości, ale moje pytanie jest o zachowanie ze wspólną tablicy:Kiedy używać volatile ze wspólną pamięcią CUDA
__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];
}
muszę products
być lotny w tym przypadku? Do każdego wpisu tablicy dostęp ma tylko jeden wątek, z wyjątkiem na końcu, gdzie wszystko jest czytane przez wątek 0. Czy możliwe jest, że kompilator może buforować całą tablicę, a więc potrzebuję go jako volatile
, czy też będzie to tylko pamięć podręczna elementy?
Dzięki!
Świetna odpowiedź, nie wiedziałem o ogrodzeniu pamięci. Dziękuję Ci! –