Я работаю над документом «Сокращение параллельных сокращений Cuda», но, к сожалению, мой алгоритм многократно приводит к неправильным результатам, и я не могу понять, почему (конечно, пример учебника должен работать? просто делать что-то очень очевидное неправильно?). Вот моя функция ядра:Уменьшение параллельного списка в CUDA
Мои определить:
#define BLOCK_SIZE 512
Моего Kernel функции:
__global__ void total(float * inputList, float * outputList, int len) {
__shared__ float sdata[2*BLOCK_SIZE];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x;
sdata[t] = inputList[i]+inputList[i+blockDim.x];
__syncthreads();
for (unsigned int s=blockDim.x/2; s>0; s>>=1) {
if (tid < s) {
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
if (tid == 0)
outputList[blockIdx.x] = sdata[0];
}
Моего распределение памяти:
outputSize = inputSize/(BLOCK_SIZE<<1);
cudaMalloc((void**) &deviceInput, inputSize*sizeof(float));
cudaMalloc((void**) &deviceOutput, outputSize*sizeof(float));
cudaMemcpy(deviceInput, hostInput, inputSize*sizeof(float), cudaMemcpyHostToDevice);
Мой вызов устройства: принести
dim3 dimGrid((inputSize-1)/BLOCK_SIZE +1, 1, 1);
dim3 dimBlock(BLOCK_SIZE,1,1);
total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize);
cudaDeviceSynchronize();
Моя память:
cudaMemcpy(hostOutput, deviceOutput, outputSize*sizeof(float), cudaMemcpyDeviceToHost);
И, наконец, мой окончательный расчет:
for (int counter = 1; counter < outputSize; counter++) {
hostOutput[0] += hostOutput[counter];
}
Любая помощь будет оценена.
входной параметр функции ядра 'int len', кажется, никогда не используется. – kangshiyin