Ссылка на его слайдах:CUDA: Не параллельный редукционный образец Марка Харриса, просто суммирующий каждый блок нити?
Вот его код первой версии параллельного сокращения:
__global__ void reduce0(int *g_idata, int *g_odata) {
extern __shared__ int sdata[];
// 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();
// do reduction in shared mem
for(unsigned int s=1; s < blockDim.x; s *= 2) {
if (tid % (2*s) == 0) {
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
// write result for this block to global mem
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}
, который позже он оптимизирует. Как это не просто суммировать все int для каждого потока и помещать ответ в другой вектор? Это то, что он должен делать? Разве не * g_odata сам вектор, так как он помещает сумму в каждую «blockIdx.x» точку в векторе? Как вы получаете вектор g_idata для суммирования на один номер?
Да, что это то, что это делает, и вы получаете окончательное сокращение, запустив ядро восстановления * дважды *. – talonmies