这是我的内核调用:
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)
中的第三个参数。我该如何确定在第三个参数中放入什么内容?
答案 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>>>(...);