C++ CUDA中可使用的阵列大小是否有限制?

C++ CUDA中可使用的阵列大小是否有限制?,c++,visual-studio,cuda,C++,Visual Studio,Cuda,编写了一个计算简单函数积分的程序。在测试它时,我发现如果我使用一个大于1000万个元素的数组,它会产生错误的答案。我发现,一旦数组在CUDA内核中被操作,错误似乎就会发生。1000万及以下元素工作良好,产生了正确的结果 对于可以传输到GPU或在GPU上计算的元素数量是否有大小限制 p.S.使用包含浮点数的C样式数组 CUDA可以使用多种不同类型的内存。特别是,你有 线性存储器(cummalloc) 固定内存(cuMemHostAlloc) 零拷贝内存(cuMemAllocHost) 音高分配(

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

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


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是否连接到显示器?