相关:

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. 从0到1:CTFer成长之路网上平台的使用以及docker环境配置

    1.首先安装docker(这里在kali里演示) sudo su #以root身份运行 apt install docker.io #安装docker systemctl start docker # ...

  2. 安卓Camera-HAL显示值与比例

    安卓Camera-HAL显示值与比例 参考:https://blog.csdn.net/wang714818/article/details/78049649?utm_source=blogxgwz4 ...

  3. qt中的 connect 函数

    1.connect()函数实现的是信号与槽的关联. 注意:只有QO bject类及其派生的类才能使用信号和槽的机制 2.函数原型 static QMetaObject::Connection conn ...

  4. 嵌入式工程师进阶,基于AM64x开发板的IPC多核开发案例分享

    前 言 本文档主要说明AM64x基于IPC的多核开发方法.默认使用AM6442进行测试演示,AM6412测试步骤与之类似. 适用开发环境如下: Windows开发环境:Windows 7 64bit. ...

  5. 从PDF到OFD,国产化浪潮下多种文档格式导出的完美解决方案

    前言 近年来,中国在信息技术领域持续追求自主创新和供应链安全,伴随信创上升为国家战略,一些行业也开始明确要求文件导出的格式必须为 OFD 格式.OFD 格式目前在政府.金融.税务.教育.医疗等需要文件 ...

  6. 基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

    前言 公司项目是是微服务项目,网关是手撸的一个.net core webapi 项目,使用 refit 封装了 20+ 服务 SDK,在网关中进行统一调用和聚合等处理,以及给前端提供 swagger ...

  7. Django详细笔记

    django 学习 特点 快速开发 安全性高 可伸缩性强 URL 组成部分 URL: 同意资源定位符 一个URL由以下几部分组成 scheme://host:port/path/?query-stri ...

  8. SpringBoot排查自动装配、Bean、Component、Configuration配置类

    排除自动装配AutoConfiguration @SpringBootApplication( exclude = { DataSourceAutoConfiguration.class, Mybat ...

  9. LeetCode860. 柠檬水找零

    题目链接:https://leetcode.cn/problems/lemonade-change/description/ 题目叙述: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元.顾客排队购买你的 ...

  10. pandas无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported

    原因是最近xlrd更新到了2.0.1版本,只支持.xls文件.所以pandas.read_excel('xxx.xlsx')会报错. 可以安装旧版xlrd,在cmd中运行: pip uninstall ...