C++ CUDA中可使用的阵列大小是否有限制?
编写了一个计算简单函数积分的程序。在测试它时,我发现如果我使用一个大于1000万个元素的数组,它会产生错误的答案。我发现,一旦数组在CUDA内核中被操作,错误似乎就会发生。1000万及以下元素工作良好,产生了正确的结果 对于可以传输到GPU或在GPU上计算的元素数量是否有大小限制C++ CUDA中可使用的阵列大小是否有限制?,c++,visual-studio,cuda,C++,Visual Studio,Cuda,编写了一个计算简单函数积分的程序。在测试它时,我发现如果我使用一个大于1000万个元素的数组,它会产生错误的答案。我发现,一旦数组在CUDA内核中被操作,错误似乎就会发生。1000万及以下元素工作良好,产生了正确的结果 对于可以传输到GPU或在GPU上计算的元素数量是否有大小限制 p.S.使用包含浮点数的C样式数组 CUDA可以使用多种不同类型的内存。特别是,你有 线性存储器(cummalloc) 固定内存(cuMemHostAlloc) 零拷贝内存(cuMemAllocHost) 音高分配(
p.S.使用包含浮点数的C样式数组 CUDA可以使用多种不同类型的内存。特别是,你有
- 线性存储器(
)cummalloc
- 固定内存(
)cuMemHostAlloc
- 零拷贝内存(
)cuMemAllocHost
- 音高分配(
)cumeAllocPictch
- 绑定到线性内存的纹理
- 绑定到CUDA数组的纹理
- 绑定到音调记忆的纹理
- …以及立方体贴图和曲面,我将不在此列出
cuDeviceGetAttribute
找到。函数cuMemGetInfo
返回设备上的可用内存量和总内存量,但由于对齐要求,分配1000000
浮动可能导致消耗的字节数超过1000000*sizeof(float)
。您可以一次调度的最大块数也是一个限制:如果超过它,内核将无法启动(您可以使用cuDeviceGetAttribute
轻松找到这个数字)。您可以使用CUDA驱动程序API找出不同内存量的对齐要求,但是对于一个简单的程序,您可以进行合理的猜测并检查分配函数的值,以确定分配是否成功
您可以传输的字节数没有限制;使用异步函数,您可以将内核执行与内存复制重叠(前提是您的卡支持这一点)。超过您可以调度的最大块数,或消耗设备上的可用内存,意味着您必须拆分任务,以便使用多个内核来处理它。对于计算能力>=3.0,最大网格尺寸为2147483647x65535x65535, 因此,对于一个应涵盖尺寸高达2147483647x1024=2.1990233e+12的任何一维阵列 10亿个元素阵列绝对不错
100000000/1024=976562.5,并四舍五入到976563块。只需确保如果threadIdx.x+blockIdx.x*blockDim.x>=未经处理从内核返回的元素数。数组有多大(以字节为单位)?GPU是否连接到显示器?