GTX TITAN上的最大块数

时间:2014-10-31 13:55:48

标签: cuda nvidia

我试图在nvidia GTX TITAN显卡上使用CUDA计算傅里叶变换。达到卡片的一定数量时,我遇到了问题。

以下是我的卡片在使用cudaGetDeviceProperties时告诉我的内容:

  • maxThreadsPerBlock:1024
  • maxThreadsDim:1024 x 1024 x 64
  • maxGridSize:2147483647 x 65535 x 65535

以下是我用来调用内核函数的代码:

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时,此代码工作正常。

提前感谢您的回答。

1 个答案:

答案 0 :(得分:4)

问题解决了,我正在使用2.x架构的标志而不是3.5进行编译,因此2.x限制正在应用(在x维度上最大为65535块)。用compute_35,sm_35编译后,它运行了。

谢谢@talonmies。