2013-01-14 2 views
1

Я работаю над документом «Сокращение параллельных сокращений 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]; 
} 

Любая помощь будет оценена.

+1

входной параметр функции ядра 'int len', кажется, никогда не используется. – kangshiyin

ответ

5

Неверная конфигурация запуска ядра в следующей строке вашего кода.

total<<<dimBlock, dimGrid>>>(deviceInput, deviceOutput, outputSize); 

Первый аргумент конфигурации ядра - размер сетки, а второй аргумент - размер блока.

Вы должны делать это:

total<<<dimGrid, dimBlock>>>(deviceInput, deviceOutput, outputSize); 

perform error checking on CUDA Runtime function calls Всегда и проверить возвращаемые коды ошибок, чтобы получить причину сбоя программы.

Ошибка запуска вашего ядра в вашем текущем коде. Проверка ошибки на вызове cudaDeviceSynchronize привела бы вас к причине неправильных результатов.

+1

Хорошее место - это всегда *, что приведет к неправильным результатам. Предположение, которое я упомянул в моем ответе, только вызывает проблему для некоторых случаев ... – Matt

3

Код предполагает, что размер ввода кратен размеру блока. Если inputSize не кратен размеру блока, он будет считывать конец массива inputList.

Смежные вопросы