为什么即使我只创建了 1 字节数据,GPU 使用量却达到了 200 MB?

Wor*_*fer 1 cuda

我在 RTX 3060 和 RTX 3080 Ti 中运行以下代码。通过使用nvidia-smi,我发现RTX 3060和RTX 3080 Ti的真实GPU使用量分别为105MB和247MB。但我的 GPU 中只有 1 字节数据。为什么是这样?为什么基本 GPU 使用率不同?

// compiled with nvcc -O3 show_basic_gpu_usage.cu -o show_basic_gpu_usage
#include <unistd.h>
#include <iostream>


int main(){


  int run_count = 100;

  int * ddd;
  cudaMalloc(&ddd, 1);      // 1 byte
  
  for (int i = 0; i < run_count; i++){
  
    sleep(1);
    printf("%d\n" , i);

  }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*lla 5

在 GPU 上运行 CUDA 程序需要类似操作系统的东西,这与在主机系统 CPU 上编写的典型程序的运行方式不同,CPU 也需要操作系统。

在 CUDA 中,该 GPU 操作系统通常称为“CUDA 运行时”或“CUDA 驱动程序”。CUDA 运行时为 GPU 执行各种管理和内务处理,并且需要(CPU 内存和)GPU 内存来完成这些工作。其中一些要求与您的代码的实际用途无关,其中一些可能会根据您的代码的用途而有所不同。

此“开销”的内存要求可能因多种因素而异:

  • 您正在使用的确切 CUDA 版本和 GPU 驱动程序版本
  • GPU 类型/架构
  • 主机操作系统
  • GPU内存总量
  • 您的代码链接或加载哪些内核和库
  • 多个 GPU 对 CUDA 运行时是否可见
  • (相关)其他消费者是否正在使用 GPU 内存,例如显示驱动程序
  • 以及可能的其他因素

对于这种开销,每个 GPU 使用数百兆字节是很常见的。此开销不包括您的程序可能分配的开销。一种 GPU 类型与另一种 GPU 类型之间存在差异也很常见。由于影响因素多种多样,没有任何方法可以准确预测所使用的开销量。