У меня есть ядро, которое для каждого потока в данном блоке вычисляет цикл for с другим числом итераций. Я использую буфер размером N_BLOCKS для хранения количества итераций, необходимых для каждого блока. Следовательно, каждый поток в данном блоке должен знать количество итераций, специфичных для его блока.Как распределить общее значение между потоками в заданном блоке?
Однако я не уверен, какой путь является лучшим (говорящий по производительности), чтобы прочитать значение и распространить его на все другие потоки. Я вижу только один хороший способ (скажите, пожалуйста, если что-то лучше): сохраните значение в общей памяти и прочитайте каждый поток. Например:
__global__ void foo(int* nIterBuf)
{
__shared__ int nIter;
if(threadIdx.x == 0)
nIter = nIterBuf[blockIdx.x];
__syncthreads();
for(int i=0; i < nIter; i++)
...
}
Другие лучшие решения? Мое приложение будет использовать множество данных, поэтому я хочу получить лучшую производительность.
Спасибо!
Выглядит хорошо для меня. –
Что делать, если я скопировал общую переменную в локальную переменную? Тем не менее, я чувствую, что, если я использую его только один раз в цикле for, это не стоит. По-прежнему существует конфликт банков в общей памяти, необходимый для копирования значения в локальную память. –
Да, вы можете сохранить его в реестре. Не уверен, что это будет действительно быстрее, плюс он использует регистр. И нет там никакого банковского конфликта, так как все потоки читаются с одного и того же адреса. –