Quando usar volátil com memória compartilhada CUDA

Em que circunstâncias você deve usar ovolatile palavra-chave com a memória compartilhada do kernel CUDA? Eu entendi aquilovolatile diz ao compilador para não armazenar nenhum valor, mas minha pergunta é sobre o comportamento com um array compartilhado:

__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];
}

Eu precisoproducts&nbsp;ser volátil neste caso? Cada entrada de matriz é acessada apenas por um único thread, exceto no final, onde tudo é lido pelo thread 0. É possível que o compilador possa armazenar em cache toda a matriz, e por isso eu preciso que ele sejavolatile, ou vai apenas armazenar elementos em cache?

Obrigado!