相关:

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. mybatis insert foreach批量添加

    mybatis insert foreach批量添加 int insertSelectiveBatch(List<ImageDetailEntity> myList); //写法1 < ...

  2. 3年Java阿里跳字节的面试心得总结

    中厂->阿里->字节,成都->杭州->成都 系列文章目录和关于我 0.前言 笔者在不足两年经验的时候从成都一家金融科技中厂跳槽到杭州阿里淘天集团,又于今年5月份从杭州淘天跳槽到 ...

  3. Flash驱动控制--芯片擦除(SPI协议)

    摘要: 本篇博客具体包括SPI协议的基本原理.模式选择以及时序逻辑要求,采用FPGA(EPCE4),通过SPI通信协议,对flash(W25Q16BV)存储的固化程序进行芯片擦除操作. 关键词:SPI ...

  4. 虚拟机安装Linux CENTOS 07 部署NET8 踩坑大全

    首先下载centos07镜像,建议使用阿里云推荐的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603 ...

  5. Mysql 使用(二)

    1 启动: 2 net start mysql 3 4 进入: 5 mysql -uroot -pmysql 6 7 显示数据库: 8 show databases; 9 10 使用数据库: 11 u ...

  6. Linux 内核:设备树(3)把device_node转换成platfrom_device

    Linux 内核:设备树(3)把device_node转换成platfrom_device 背景 在上一节中讲到设备树dtb文件中的各个节点转换成device_node的过程(<dtb转换成de ...

  7. P6655 题解

    直接计数其实不好记,不如计数转期望. 令 \(f_i\) 表示点 \(i\) 成为制高点概率,不难发现期望就是 \(\sum f_i\). 根据定义对于 \(f\) 我们有如下转移 \(f_i = \ ...

  8. 如何在 Windows 使用 Podman Desktop 取代 Docker Desktop

    Podman Desktop 是 Docker Desktop 的免费替代品,是本地开发使用的另一个绝佳选择.它提供了类似的功能集,同时保持完全开源,让您避免使用 Docker 产品的许可问题.在本文 ...

  9. 如何计算QPS、PV和需要部署机器数量?

    基本概念 网站访问量的常用衡量标准:独立访客(UV) 和 综合浏览量(PV),一般以日为单位来计算. 独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客. 综合浏览量(PV) ...

  10. ES6拼接数组与小程序本地存储

    拼接数组 ES6扩展运算符[三个点(...)将一个数组转为用逗号分隔的参数序列] goodsList: [...goodsList, ...goods] 本地存储 // 把接口数据存入本地存储中 wx ...