相关:

CPU端多进程/多线程调用CUDA是否可以加速???

如何实现nvidia显卡的cuda的多kernel并发执行???

============================================

前言废话:

自己从接触CUDA开始算起至今已有近十年的历史,最初那还是在intel赛扬的那个年代。虽然接触的早但一直没有深入的了解CUDA的一些底层原理,对CUDA的基本应用也只是了解过一些简单的DEMO,后来CUDA运算变得比较冷门,如果不是搞异构超算的估计也不太会接触CUDA了。不过随着深度学习hot起来,cuda编程又有了新的浪潮,想想十多年前最早看的CUDA的demo代码就是全连接神经网络的训练代码,想想这也是神经网络再次带火了CUDA。

最近在看到了一个关于GPU的使用率的一个说明:https://zhuanlan.zhihu.com/p/346389176,突然想对这个GPU的使用率有个小的总结。

------------------------------------------------------------------------

引用 https://zhuanlan.zhihu.com/p/346389176中给出的GPU利用率的解释:

------------------------------------------------------------------------

根据上面对GPU使用率的解释,我们知道GPU的使用率就是计算一定周期时间内GPU是否被kernel函数占用。如果在这段时间内GPU一直被kernel函数占用,那么GPU的使用率为100%;如果在这段时间内有50%的时间有kernel在运行那么GPU的使用率为50% 。可以看到GPU的利用率是根据kernel在采样周期内运行的时长来计算的,并不是根据计算核心被使用的多少来计算的。了解GPU的CUDA原理的都知道一个kernel往往并不能利用整块GPU的所有流处理器,所以使用kernel占用的时间并不能完全体现出GPU的使用率。但是这不是说明现在所使用的GPU利用率的计算方法就有很大问题呢,其实也不尽然,这种GPU利用率也是有其无奈的地方的。GPU的kernel往往是独占一整块显卡的,也就是说如果没有开mps服务、没有写多kernel多队列并加参数编译的话一个时刻上只能运行一个kernel(CPU端多进程/多线程调用CUDA是否可以加速???),而如果计算采样周期内不同时刻下流处理器的使用个数也是在技术上难以实现的,也就是说GPU使用率的计算方法为啥采样如此不完善的计算方法主要是因为该种方法在技术可行。

知道了GPU利用率的计算方法我们也就知道了这样一个事情,那就是GPU利用率并不能完全体现出GPU的载荷情况,GPU利用率高的时候其实GPU的载荷未必高,但是GPU的载荷高的时候GPU的利用率必然高。

为了更好的体现出GPU的利用率和载荷的不匹配现象,给出一个轻载荷的代码:

const int N = 1 << 30;

__global__ void kernel(float *x, int n)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
for (int i = tid; i < n; i += blockDim.x * gridDim.x) {
x[i] = sqrt(pow(3.14159,i));
}
} int main()
{
const int num_streams = 8; cudaStream_t streams[num_streams];
float *data[num_streams]; for (int i = 0; i < num_streams; i++) {
cudaStreamCreate(&streams[i]); cudaMalloc(&data[i], N * sizeof(float)); // launch one worker kernel per stream
kernel<<<1, 32, 0, streams[i]>>>(data[i], N); // launch a dummy kernel on the default stream
kernel<<<1, 1>>>(0, 0);
} cudaDeviceReset(); return 0;
}

编译并执行:

export CUDA_VISIBLE_DEVICES=1

nvcc ./x.cu -o x

time ./x

可以看到这个cuda代码的kernel就是在执行一个32线程的计算任务,对于有几千流处理器的nvidia显卡来说这个计算任务是十分小的任务了,这里运行的环境为2070Super显卡,硬件配置:

可以看到2070super显卡共有2560个cuda cores,也就是有2560个流处理器,那么上面的代码运行起来的话其实整个GPU的运算载荷为32/2560=1/80,可以看到上面的代码运行起来载荷是如此的低,但是使用nvidia-smi 命令查看GPU的利用率就可以看到其数值为100% (如下图)。

---------------------------------------

上面的代码Demo说明的就是一个占GPU载荷1/80的cuda进程在nvidia-smi命令中显示出此时对GPU的利用率可以高达100% ,很显然GPU的利用率难以真实显示出GPU的载荷情况。

PS: 既然分析了GPU使用率难以完整体现出GPU的负载情况,那么有没有其他的方法来辅助呢,那就是分享一下个人的使用经验,在观察GPU使用率的同时也要注意观察其他的三个指标:风扇转速、显卡温度、供电水平(工作的功率也可以考虑)。 显卡的供电(功率)和温度是对显卡负载比较直观的体现,而且这种体现往往比看GPU使用率更加的靠谱,就比如上面的例子,从这几个辅助的指标上很容易看出显卡的负载并不像使用率100%显示的那么高。

---------------------------------------------

我们可以适当修改代码使其保持同样的负载但是缩小它的计算时间以减少显存占用,然后在同块显卡上同时运行两次这个代码:

代码:

const int N = 1 << 26;

__global__ void kernel(float *x, int n)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
for (int i = tid; i < n; i += blockDim.x * gridDim.x) {
x[i] = sqrt(pow(3.14159,i));
}
} int main()
{
const int num_streams = 8; cudaStream_t streams[num_streams];
float *data[num_streams]; for (int i = 0; i < num_streams; i++) {
cudaStreamCreate(&streams[i]); cudaMalloc(&data[i], N * sizeof(float)); // launch one worker kernel per stream
kernel<<<1, 32, 0, streams[i]>>>(data[i], N); // launch a dummy kernel on the default stream
kernel<<<1, 1>>>(0, 0);
} cudaDeviceReset(); return 0;
}

单个运行:

两个同时运行:

可以看到虽然上面的代码运算时kernel只使用了1/80的CUDA CORES,但是由于kernel一直处于运行状态,因此GPU的使用率为100%,同时由于每个进程的kernel在没有mps服务情况下都是排队执行的,因此两个进程运行CUDA的时间为单个进程运行的两倍。

============================================

参考:

https://zhuanlan.zhihu.com/p/346389176

NVIDIA显卡的利用率“Volatile GPU Util"是什么???的更多相关文章

  1. windows如何查看nvidia显卡(GPU)的利用率和温度

    windows如何查看nvidia显卡(GPU)的利用率和温度 nvidia-smi 只要在文件夹C:\Program Files\NVIDIA Corporation\NVSMI里找到文件nvidi ...

  2. docker 使用 Nvidia 显卡

    docker19.03读取NVIDIA显卡 作者: 张首富 时间: 2019-09-06 w x: y18163201 前言 2019年7月的docker 19.03已经正式发布了,这次发布对我来说有 ...

  3. Laptop Ubuntu16.04/14.04 安装Nvidia显卡驱动

    笔记本型号 机械革命(MECHREVO)深海泰坦X6Ti-S(黑曜金)15.6英寸 CPU型号 i5-7300HQ 内存 8G 硬盘容量 128SSD+1T机械硬盘 显卡 GeForce GTX 10 ...

  4. docker挂载NVIDIA显卡运行pytorch

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃   写在前面: 请参考之前的文章安装好CentOS.NVIDIA相关驱动及软件.docker及 ...

  5. ubuntu14.04安装、NVIDIA显卡驱动安装及CUDA8.0、Cudnn5.1的环境搭建

    安装环境:hp-Z440工作站.64位Ubuntu14.04(64位Ubuntu16.04).Cuda8.0.Cudnn5.1.Nvidia GeForce GT 705.Tesla K40c 本文可 ...

  6. Ubuntu出现卡logo、卡住、黑屏无法正常启动、屏幕和键盘背光无法调节等一系列问题?可能是NVIDIA显卡驱动没装好

    也不知道是幸运还是不幸,我从一开始接触ubuntu就遇到这一系列的问题, 而且一直没有一个彻底解决的办法,搞得我无比头疼,也害得我重装了无数遍系统... 国际惯例,只按照个人习惯和喜好来写,对某些人来 ...

  7. ubuntu 禁用自带的nouveau显卡驱动,安装NVIDIA显卡驱动

    下载显卡驱动 进入Nvidia的官网,找到对应GTX 750显卡的Linux 64-bit 的驱动程序,然后下载 当点击下载链接后,发现浏览器一直在加载那个*.run文件,很久都加载不完.这时将浏览器 ...

  8. ubuntu16.04安装Nvidia显卡驱动、CUDA8.0和cudNN V6

    Nvidia显卡驱动安装 在ubuntu搜索框输入 软件更新,打开 "软件和更新" 对话框,在 附加驱动里选择系统检测到的Nvidia驱动,应用更改,重启系统: 安装完成之后查看G ...

  9. Kali-linux安装并配置NVIDIA显卡驱动

    显卡驱动程序就是用来驱动显卡的程序,它是硬件所对应的软件.驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息.有了此信息,计算机就可以与设备进行通信.驱动程序是硬件厂商根据操作系统编写 ...

  10. ubuntu 16.04安装nVidia显卡驱动和cuda/cudnn踩坑过程

    安装深度学习框架需要使用cuda/cudnn(GPU)来加速计算,而安装cuda/cudnn,首先需要安装nvidia的显卡驱动. 我在安装的整个过程中碰到了驱动冲突,循环登录两个问题,以至于最后不得 ...

随机推荐

  1. 字符串— trim()、trimStart() 和 trimEnd()

    在今天的教程中,我们将一起来学习JavaScript 字符串trim().trimStart() 和 trimEnd(). 01.trim() 学习如何使用 JavaScript  trim()方法从 ...

  2. uni-app apple store 上传新版本审核被拒绝 Guideline 5.1.1

    - Legal - Privacy - Data Collection and Storage We noticed that your app requests the user's consent ...

  3. Django项目实现分页返回,结合forloop实现编号递增

    需要导入Paginator包 from django.core.paginator import Paginator 实现步骤: 需要设置每页大小 需要获取每页的页码, 查询对应的数据,提供给Pagi ...

  4. 大数据面试吹牛草稿V2.0

    面试吹牛之前先打个草稿! 各位面试官好! 我叫 xxx,毕业于 xxx,之前在 xxx 公司待了 1 年多,期间⼀直从事的是 IT 行业,刚开始的时候做的是 Java 开发后来转岗到大数据方向做大数据 ...

  5. Java常用的十大开源工具类库总结

    以下是个人总结的Java常用的十大开源工具类库,根据具体需求和项目,可以选择合适的工具类库来提高开发效率.1. Apache Commons:Apache Commons是一个开源的工具类库,提供了大 ...

  6. PyTorch程序练习(二):循环神经网络的PyTorch实现

    一.RNN实现 结构原理 代码实现 import torch import torch.nn as nn class RNN(nn.Module): def __init__(self, input_ ...

  7. css 选择器优先级?

    !important > 行内样式(比重1000)> ID 选择器(比重100) > 类选择器(比重10) > 标签(比重1) > 通配符 > 继承 > 浏览 ...

  8. VUE手稿1

  9. PLSQL 无法查询带中文的WHERE条件

    今天遇到一个坑爹的问题,plsql无法查询带where条件的语句,是因为plsql中Oracle的客户端字符集和服务器上的不一样造成的,需要新增系统环境变量,特意记录下解决办法. 第一步:查询服务器上 ...

  10. Mybatis 总结ResultMap的复杂对象查询

    association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...