2016-12-02 111 views
17

我知道nvidia-smi -l 1会每秒钟给出GPU使用率(类似于以下内容)。不过,我希望能解释一下Volatile GPU-Util的真正含义。这是使用SMs总数超过总SM,或占用,或其他?nvidia-smi易失性GPU-利用率解释?

+-----------------------------------------------------------------------------+ 
| 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 | 
+-----------------------------------------------------------------------------+ 
+4

对于那些想知道,SM指流式多处理器,并且它说明[这里](https://stackoverflow.com/questions/3519598/streaming-multiprocessors-blocks-and-threads-cuda) – Davidmh

回答

21

它是a sampled measurement over a time period。在给定的时间段内,它会报告一个或多个GPU内核处于活动状态(即正在运行)的时间百分比。

它没有告诉你任何有关使用了多少个SM,或代码是多么“繁忙”,或者它究竟是在做什么,或者它以什么方式使用了内存。

上述权利要求(一个或多个)可以在没有太大困难使用microbenchmarking型运动进行验证(见下文)。

我不知道如何准确定义时间段,但由于它也是整体只是一个抽样测量(即nvidia-smi报告一个抽样测量的频率与您所查询的一样多),所以我认为它不应该是这样对于一般用法或对工具的理解很重要。时间段明显较短,如果指定了轮询时间间隔,则不一定与轮询时间间隔有关nvidia-smi。也可以使用微基准技术揭示采样时间段。

此外,单词“挥发性”不适用于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%的利用率。