可以在 CUDA 中使用的数组大小是否有限制
Is there a limit on the size of array that can be used in CUDA?
编写了一个计算简单函数积分的程序。在测试它时,我发现如果我使用大小大于 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>=你从内核返回的元素数量而不进行处理。
- 如何找到大小'x'数组是否完全填充,在C++?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 在 constexpr 构造函数中初始化数组是否合法?
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 检查反向数组是否与原始数组相同
- 如何检查二维字符数组是否有空字
- 检查数组是否等于的最快方法?
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- 如何检查数组是否包含多个元素?
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- c ++ 如何断言 char 数组与否,检查 char 数组是否以 "0" 开头或包含"0"
- 下课时的数组是否可以正常工作?
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 在 C++17 中声明大小为 0 的数组是否合法
- 如果在执行过程中替换二进制文件,"const"数组是否驻留在内存中?
- 临时数组是否可能
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 当有多个查询时,检查某些子数组是否排序的有效方法是什么?
- 用于检查 char 数组是否仅包含允许的字符的函数
- 检查数组是否'right' (C++)