CUDA内核执行的内存要求是什么?

时间:2014-04-04 11:10:52

标签: cuda gpu gpgpu

我在gpu上使用CUDA执行320 * 320阵列乘法。我观察到使用了固定数量的内存,这是不明确的。例如在640 * 640阵列乘法中,考虑到每个元素占用4个字节,并且我们在代码中有3个这样的数组,应该消耗大约5 MB的GPU内存。但是当我用nvidia-smi命令检查时,它显示我消耗了53MB。这48 MB是下落不明的。对于1200 * 1200或任何其他可能的尺寸,情况也是如此。

1 个答案:

答案 0 :(得分:4)

CUDA驱动程序维护许多设备内存分配,包括但不限于

  1. 本地记忆
    • Size =(用户指定的每个线程的lmem大小+驱动程序指定的syscall堆栈)* MultiprocessorCount * MaxThreadsPerMultiprocessor。
    • 示例 - 15 SM GK110
      • 15多处理器
      • 2048 MaxThreadsPerMultiprocessor
      • 每个线程2048个字节(cudaLimitStackSize)
      • syscall stack每个线程512字节
      • SIZE = 15 * 2048 *(2048 + 512)= 78,643,200字节
  2. Printf FIFO
  3. Malloc Heap
  4. 恒定缓冲区
    • 驱动程序为每个流分配多个常量缓冲区。这些用于传递启动配置和启动参数,模块常量和常量变量。 PTX手册提供了有关常量缓冲区的其他信息。
  5. CUDA动态并行缓冲区
  6. 驱动程序会在必要时推迟创建这些缓冲区。这通常意味着内存分配将在其中一个API调用中完成,以启动内核。

    可以通过cudaDeviceSetLimit在某种程度上控制第1,2和3项。

    项目4随着分配的流数量和加载的模块线性增长。在每个体系结构的不同点,驱动程序将启动别名流常量缓冲区以限制资源分配。