cuda - nvidia-smi volatile GPU 利用率解释?

标签 cuda nvidia gpgpu gpu

我知道 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 |
+-----------------------------------------------------------------------------+

最佳答案

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

它不会告诉您使用了多少个 SM,或者代码有多“繁忙”,或者它到底在做什么,或者它可能以什么方式使用内存。

使用微基准测试类型的练习可以毫无困难地验证上述主张(见下文)。

基于 Nvidia docs , 采样周期可能在 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 内核事件的报告描述。

关于cuda - nvidia-smi volatile GPU 利用率解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40937894/

相关文章:

c++ - 我可以在 CUDA 代码的内核部分使用 C++ 头文件吗?

performance - Matlab GPU加速用于加载大点云数据集

c++ - GPU 线程分歧的高级问题

gpgpu - 什么是 GPU 上的相干内存?

CUDA:为什么按位运算符有时比逻辑运算符快?

opencv - 是否可以直接从USB网络摄像头读取GPU内存

c++ - 在 CUDA 源文件上使用 clang-tidy

tensorflow - 内存使用指标 `nvidia-smi dmon` 与 `nvidia-smi` 之间有何差异

amazon-web-services - 类似于 Amazon Web Services Cluster GPU 实例的私有(private)云 GPU 虚拟化

synchronization - CUDA 线程围栏