我试图在nvidia GTX TITAN显卡上使用CUDA计算傅里叶变换。达到卡片的一定数量时,我遇到了问题。
以下是我的卡片在使用cudaGetDeviceProperties时告诉我的内容:
以下是我用来调用内核函数的代码:
cudaDeviceProp prop;
cudaGetDeviceProperties(&prop, 0);
unsigned int threads = prop.maxThreadsPerBlock;
unsigned int max_blocks = prop.maxGridSize[0];
unsigned int blocks = (pixel_size + threads - 1) / threads;
// Hardware limit
if (blocks > max_blocks)
blocks = max_blocks;
kernel_function <<<blocks, threads>>>(pixel_size);
内核代码:
__global__ void kernel_function(unsigned int pixel_size)
{
unsigned int index = blockIdx.x * blockDim.x + threadIdx.x;
while (index < pixel_size)
{
// Treatment here
index += blockDim.x * gridDim.x;
}
}
其中pixel_size是我想要转换的图像块的像素大小。
所以threads
总是等于1024,这就是我想要的。每当blocks
低于或等于65535,那么我的代码工作正常。但是当blocks
达到65535以上的值时,我得到的结果是无意义的,完全是随机的。那么在一维问题中我可以拥有的最大块数是多少?我在前面的代码中假设它是2147483647?我做错了什么?
我觉得我对我的块数使用了错误的硬件限制,因为当我将它设置为65535时,此代码工作正常。
提前感谢您的回答。
答案 0 :(得分:4)
问题解决了,我正在使用2.x架构的标志而不是3.5进行编译,因此2.x限制正在应用(在x维度上最大为65535块)。用compute_35,sm_35编译后,它运行了。
谢谢@talonmies。