Я пытаюсь понять код CUDA для сегментного сокращения. На изображении ниже показано, как следует выполнять упражнение на сокращение в каждом блоке. Нам нужно, чтобы каждый блок занимал сегмент входного массива и вычислял сумму:
Вот фрагмент кода сокращения:
unsigned int segment = 2*blockDim.x*blockIdx.x;
unsigned int i = segment + 2*threadIdx.x;
for(unsigned int stride = 1; stride <= BLOCK_DIM; stride *= 2) {
if(threadIdx.x%stride == 0) {
input[i] += input[i + stride];
}
__syncthreads();
}
Я не могу понять, почему мы поставили:
unsigned int segment = 2*blockDim.x*blockIdx.x;
unsigned int i = segment + 2*threadIdx.x;
Откуда взялись 2?
Я новичок ie в cuda, поэтому, пожалуйста, помните мой вопрос.