Mark HarrisによるCUDAの並列削減の最適化の記事を読んだことがあり、それは非常に便利であることがわかりましたが、それでも1つまたは2つの概念を理解できないことがあります。18ページに書かれています:
//First add during load
// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
最適化されたコード:2回のロードと最初の削減の追加:
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.x; ...1
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x; ...2
sdata[tid] = g_idata[i] + g_idata[i+blockDim.x]; ...3
__syncthreads(); ...4
2行目がわかりません。256個の要素があり、ブロックサイズとして128を選択した場合、なぜ2を掛けるのですか?ブロックサイズの決定方法を説明してください。