CUDA中可以使用的数组大小是否有限制?

问题描述:

编写一个计算简单函数积分的程序。当测试它时,我发现如果我使用了一个大于1000万个元素的数组,它会产生错误的答案。我发现一旦数组在CUDA内核中被操作,就会发生错误。 1000万以下的元素工作得很好,并产生了正确的结果。CUDA中可以使用的数组大小是否有限制?

是否存在可传输到GPU或根据GPU计算的元素数量限制?

P.S.使用包含浮动的C风格数组。

+0

数组有多大,以字节为单位? –

+0

您的GPU是否连接到显示器? – talonmies

您可以在CUDA中使用多种不同的内存。特别是,你有

  • 线性存储器(cuMemAlloc
  • 固定内存(cuMemHostAlloc
  • 零拷贝内存(cuMemAllocHost
  • 间距分配(cuMemAllocPitch
  • 纹理绑定到线性内存
  • 绑定到CUDA阵列的纹理
  • 纹理绑定到音高备忘录ry
  • ...和立方体贴图和曲面,我不会在这里列出。

每种内存都与自己的硬件资源限制相关联,其中许多内容可以通过使用cuDeviceGetAttribute找到。函数cuMemGetInfo返回设备上的空闲内存和总内存量,但由于对齐要求,分配1,000,000浮点数可能导致消耗大于1,000,000 * sizeof(float)个字节。您可以一次安排的块的最大数量也是一个限制:如果超过它,内核将无法启动(您可以使用cuDeviceGetAttribute轻松找到该数字)。您可以使用CUDA Driver API找出不同内存量的对齐要求,但对于一个简单的程序,您可以进行合理的猜测并检查分配函数的值,以确定分配是否成功。

您可以传输的字节数没有限制;使用异步功能,您可以将内核执行与内存复制重叠(只要您的卡支持此功能)。超过您可以调度的最大块数,或者消耗设备上可用的内存意味着您将不得不拆分任务,以便可以使用多个内核来处理它。

对于计算能力> = 3.0,最大网格尺寸为2147483647x65535x65535, 因此对于那些应该覆盖任何尺寸高达2147483647x1024 = 2.1990233e + 12的1-D数组。

10亿个元素数组绝对没问题。

1,000,000,000/1024 = 976562.5,并舍入到976563块。只要确保如果threadIdx.x + blockIdx.x * blockDim.x> =您从内核返回而未经处理的元素数量。