Cuda内核 - 第二块无法启动?

时间:2013-12-08 15:19:21

标签: cuda

这是我的内核调用:

const size_t numBins = 1024;
const dim3 blockSize(512);
unsigned int * d_binHistogram, * d_cdf;
checkCudaErrors(cudaMalloc((void**) &d_binHistogram, sizeof(unsigned int)*numBins));
checkCudaErrors(cudaMemset(d_binHistogram, 0, sizeof(unsigned int)*numBins));
checkCudaErrors(cudaMalloc((void**) &d_cdf, sizeof(unsigned int)*numBins));
checkCudaErrors(cudaMemset(d_cdf, 0, sizeof(unsigned int)*numBins));
blellochScan<<<(numBins/512+1,1,1),blockSize,blockSize.x*sizeof(float)>>>(d_binHistogram, numBins, d_cdf);
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());

这是内核:

__global__ void blellochScan(const unsigned int* const d_bin, const size_t numBins,
                                  unsigned int* const d_cdf){
unsigned int i = blockIdx.x*blockDim.x+threadIdx.x;
unsigned int result = 0;
for(unsigned int j = 0; j<i; j++){
    result += d_bin[j];
}
d_cdf[i] = result; 
printf("%u %u\n", i, d_cdf[i]);
}

在输出中,从0到511只有i值,第二个块的512到1023之间没有i值。我做错了什么?

另外,我不确定内核启动blockSize.x*sizeof(float)中的第三个参数。我该如何确定在第三个参数中放入什么内容?

1 个答案:

答案 0 :(得分:0)

将来,请创建一个完整的,可编辑的示例,显示您要询问的问题并将其复制/粘贴到问题中。

网格尺寸计算出错:

(numBins/512+1,1,1)

将始终评估为1(最后一个逗号后面的值),因为您提供了逗号分隔的表达式列表,而不是用于创建dim3的参数。

内核启动中的第三个参数是要分配的共享内存的字节数。由于您没有在内核中使用共享内存,因此可以保留此参数。

由于您的垃圾箱数量可以被块大小整除,因此您可以进一步简化表达。

所以,你的内核调用应该是:

const size_t numBins(1024);
const size_t blockSize(512);
dim3 blocks(numBins / blockSize);
blellochScan<<<blocks, blockSize>>>(...);