Когда использовать volatile с общей памятью CUDA

При каких обстоятельствах вы должны использоватьvolatile ключевое слово с ядром CUDA 'с общей памятью? Я это понимаюvolatile говорит компилятору никогда не кэшировать какие-либо значения, но мой вопрос касается поведения с разделяемым массивом:

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

Нужно ли мнеproducts быть изменчивым в этом случае? Каждая запись массива доступна только одному потоку, кроме как в конце, где все читается потоком 0. Возможно ли, чтобы компилятор мог кэшировать весь массив, и поэтому мне нужно, чтобы он былvolatileили это будут только элементы кеша?

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос