nvidia-smi 显存瞬时利用率说明?

106

我知道nvidia-smi -l 1每秒会给出GPU使用情况(类似于以下内容)。但是,我需要解释一下Volatile GPU-Util的真正含义。这是指已使用的SM数与总SM数之比,还是占用率,或者是其他什么?

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.48                 Driver Version: 367.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K20c          Off  | 0000:03:00.0     Off |                    0 |
| 30%   41C    P0    53W / 225W |      0MiB /  4742MiB |     96%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla K20c          Off  | 0000:43:00.0     Off |                    0 |
| 36%   49C    P0    95W / 225W |   4516MiB /  4742MiB |     63%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    1      5193    C   python                                        4514MiB |
+-----------------------------------------------------------------------------+

34
对于那些想知道的人,SM指的是流处理器(Streaming Multiprocessor),它在这里解释了。 - Davidmh
7
“Volatile” 来自顶部一行,比如“Volatile Uncorr. ECC”,听起来像是一个严重的内存错误。在上面的输出中,您没有发现这种错误。 - Tomasz Gandor
2个回答

102

这是一个时间段内的样本测量。对于给定的时间段,它报告了一个或多个GPU内核处于活动状态(即运行)的时间百分比。

它并不告诉你有多少SM被使用,代码有多“繁忙”,或者它确切地在做什么,以及以何种方式可能正在使用内存。

上述声明可以使用微基准测试类型的练习(见下文)很容易验证。

根据Nvidia 文档,样本周期可能介于1秒和1/6秒之间,具体取决于产品。但是,周期对于如何解释结果并没有太大影响。

此外,“Volatile”一词与nvidia-smi中的此数据项无关。您误读了输出格式。

这是一个支持我的说法的微不足道的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

const long long tdelay=1000000LL;
const int loops = 10000;
const int hdelay = 1;

__global__ void dkern(){

  long long start = clock64();
  while(clock64() < start+tdelay);
}

int main(int argc, char *argv[]){

  int my_delay = hdelay;
  if (argc > 1) my_delay = atoi(argv[1]);
  for (int i = 0; i<loops; i++){
    dkern<<<1,1>>>();
    usleep(my_delay);}

  return 0;
}

在我的系统上,当我运行上述代码并带上命令行参数100时,nvidia-smi会报告99%的利用率。当我带上命令行参数1000运行它时,nvidia-smi会报告约83%的利用率。当我带上命令行参数10000运行它时,nvidia-smi将报告约9%的利用率。尽管这个答案侧重于GPU内核,但我最近注意到,例如当正在运行cudaMemcpy操作(且没有其他操作)时,nvidia-smi也会报告非零GPU利用率。因此,上述描述应被视为针对CUDA内核活动的报告描述。

有没有一种方法可以获取度量指标,例如使用了多少个SM,或者SM有多“繁忙”? 是否有任何NVML API调用未显示在nvidia-smi中,可以帮助暴露这些信息? - Kira
谢谢,你能简要解释一下这段代码在做什么吗? - undefined

11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接