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

Is there a limit on the size of array that can be used in CUDA?

本文关键字:数组 是否 有限制 CUDA      更新时间:2023-10-16

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

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

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

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

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

每种内存都与其自己的硬件资源限制相关联,您可以使用 cuDeviceGetAttribute 找到其中的许多限制。该函数cuMemGetInfo返回设备上的可用内存量和总内存量,但由于对齐要求,分配1,000,000浮点数可能会导致消耗超过 1,000,000 * sizeof(float) 个字节。您可以一次调度的最大块数也是一个限制:如果超过它,内核将无法启动(您可以使用 cuDeviceGetAttribute 轻松找到此数字(。您可以使用 CUDA 驱动程序 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>=你从内核返回的元素数量而不进行处理。