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

CUDA内核执行的内存需求是什么?,cuda,gpu,gpgpu,Cuda,Gpu,Gpgpu,我正在gpu上使用CUDA执行320*320数组乘法。我观察到使用的内存量是固定的,但没有计算在内。例如,在640*640数组乘法中,考虑到每个元素占用4个字节,我们在代码中有3个这样的数组,应该消耗大约5 MB的GPU内存。但当我用nvidia smi命令检查它时,它显示消耗了53MB。这48MB是未知的。同样的情况也适用于1200*1200或任何其他可能的大小。CUDA驱动程序维护许多设备内存分配,包括但不限于 本地存储器 大小=(用户指定的每个线程的lmem大小+驱动程序指定的系统调用堆

我正在gpu上使用CUDA执行320*320数组乘法。我观察到使用的内存量是固定的,但没有计算在内。例如,在640*640数组乘法中,考虑到每个元素占用4个字节,我们在代码中有3个这样的数组,应该消耗大约5 MB的GPU内存。但当我用nvidia smi命令检查它时,它显示消耗了53MB。这48MB是未知的。同样的情况也适用于1200*1200或任何其他可能的大小。

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

  • 本地存储器
    • 大小=(用户指定的每个线程的lmem大小+驱动程序指定的系统调用堆栈)*多处理器计数*MaxThreadsPerMultiprocessor
    • 示例-15 SM GK110
      • 15多处理器
      • 2048最大线程多处理器
      • 每个线程2048字节(cudaLimitStackSize)
      • 系统调用堆栈的每个线程512字节
      • 大小=15*2048*(2048+512)=78643200字节
  • Printf-FIFO
  • Malloc堆
  • 恒定缓冲区
    • 驱动程序为每个流分配多个常量缓冲区。这些用于传递启动配置和启动参数、模块常量和常量变量。PTX手册中有关于恒定缓冲区的附加信息
  • CUDA动态并行缓冲区
  • 驱动程序延迟这些缓冲区的创建,直到必要时。这通常意味着内存分配将在启动内核的一个API调用中完成

    第1项、第2项和第3项可以通过以下方式进行一定程度的控制:


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

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

  • 本地存储器
    • 大小=(用户指定的每个线程的lmem大小+驱动程序指定的系统调用堆栈)*多处理器计数*MaxThreadsPerMultiprocessor
    • 示例-15 SM GK110
      • 15多处理器
      • 2048最大线程多处理器
      • 每个线程2048字节(cudaLimitStackSize)
      • 系统调用堆栈的每个线程512字节
      • 大小=15*2048*(2048+512)=78643200字节
  • Printf-FIFO
  • Malloc堆
  • 恒定缓冲区
    • 驱动程序为每个流分配多个常量缓冲区。这些用于传递启动配置和启动参数、模块常量和常量变量。PTX手册中有关于恒定缓冲区的附加信息
  • CUDA动态并行缓冲区
  • 驱动程序延迟这些缓冲区的创建,直到必要时。这通常意味着内存分配将在启动内核的一个API调用中完成

    第1项、第2项和第3项可以通过以下方式进行一定程度的控制:


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

    我只计算了数组乘法程序的统计数据。未知数据正在增长?使用320x320矩阵执行计算时使用的总内存是多少?它是50MB。其中,阵列的总大小约为1.2MB。我假设CUDA内核必须使用这个48MB来存储指令和代码。出于好奇,我们可以运行一个内核为空的代码并检查内存使用情况。并在无任何运行时检查GPU内存使用情况,如果GPU用于显示笔记本电脑或计算机的屏幕,则可能会使用或保留48MB用于显示。如果要使用nvidia smi,只需在启动之前或之后添加CPU断点,或调用getc,system(“暂停”),或者在代码中添加一个定时循环。我只计算了数组乘法程序的统计数据。未知的数据在增长吗?使用320x320矩阵执行计算时使用的总内存是多少?它是50MB。其中,阵列的总大小约为1.2MB。我假设CUDA内核必须使用这个48MB来存储指令和代码。出于好奇,我们可以运行一个内核为空的代码并检查内存使用情况。并在无任何运行时检查GPU内存使用情况,如果您的GPU用于显示笔记本电脑或计算机的屏幕,则可能会使用或保留48MB用于显示。如果您要使用nvidia smi,只需在启动之前或之后添加CPU断点,或调用getc、system(“暂停”),或在代码中添加计时循环。