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

Igo*_*ren 5 c++ cuda visual-studio

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

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

PS 使用包含浮点数的 C 样式数组。

voi*_*ter 4

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

  • 线性存储器 ( cuMemAlloc)
  • 固定内存 ( cuMemHostAlloc)
  • 零拷贝内存 ( cuMemAllocHost)
  • 间距分配 ( cuMemAllocPitch)
  • 纹理绑定到线性内存
  • 纹理绑定到 CUDA 数组
  • 纹理绑定到音高记忆
  • ...还有立方体贴图和曲面,我不会在这里列出。

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

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