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

时间:2012-05-03 00:31:20

标签: c++ visual-studio cuda

编写一个计算简单函数积分的程序。在测试它时,我发现如果我使用的是大小超过1000万个元素的数组,那就会产生错误的答案。我发现当在CUDA内核中操作数组时,似乎发生了错误。 1000万元素以下工作正常,并产生了正确的结果。

可以传输到GPU或在GPU上计算的元素数量是否有大小限制?

P.S。使用包含浮点数的C样式数组。

2 个答案:

答案 0 :(得分:3)

CUDA可以使用许多不同类型的内存。特别是,你有

  • 线性记忆(cuMemAlloc
  • 固定内存(cuMemHostAlloc
  • 零拷贝记忆(cuMemAllocHost
  • 音高分配(cuMemAllocPitch
  • 纹理绑定到线性记忆
  • 纹理绑定到CUDA阵列
  • 纹理绑定到音高记忆
  • ...以及立方体贴图和曲面,我不会在此列出。

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

您可以传输的字节数没有限制;使用异步函数,您可以将内核执行与内存复制重叠(前提是您的卡支持此功能)。超出您可以安排的最大块数或消耗设备上的可用内存意味着您必须拆分任务,以便可以使用多个内核来处理它。

答案 1 :(得分:0)

对于计算能力> = 3.0,最大网格尺寸为2147483647x65535x65535, 因此,对于任何应该涵盖任何尺寸的一维数组,最高可达2147483647x1024 = 2.1990233e + 12.

10亿个元素阵列绝对没问题。

1,000,000,000 / 1024 = 976562.5,最高可达976563块。只要确保如果threadIdx.x + blockIdx.x * blockDim.x> =您从内核返回的元素数量没有处理。