相关:

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. Vue学习:17.组件通信案例-记事本

    通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用.那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧. 实例:记事本(组件化) 实现功能 运用组件化思想,实现Vue学习:3.V标签 ...

  2. CUDA程序优化-1.基础介绍

    简介 本合集主要介绍我在开发分布式异构训练框架时的CUDA编程实践和性能优化的相关内容.主要包含以下几个部分: 介绍CUDA的基本概念和架构,帮助读者建立对CUDA的初步认识,包括硬件架构/CUDA基 ...

  3. 没有 Git,如何下载 Gitee 代码?

    目录 没有 Git,如何下载 Gitee 代码? 注册 Gitee 账号 下载代码压缩包 没有 Git,如何下载 Gitee 代码? 鉴于看我博客的人很多都是大学本科生.非 CS 专业,大部分人都不会 ...

  4. typroa破解

    Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大 ...

  5. IPTABLES管理

    iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具.iptables 工具运行在用户态,主要是设置各种规则.而 netfilter 则运行在内核态,执行 ...

  6. Linux Shell 常用命令 - 02篇

    系列文章: Linux Shell 常用命令 - 01篇 8. shell 中各种括号的作用 参考 https://www.jb51.net/article/123081.htm https://ww ...

  7. nodejs-mime类型

    mime是一个互联网标准,通过设定它就可以设定文件在浏览器的打开方式. mime使用方法: 使用mime模块查询文件的MIME类型: mime.getType('/path/to/file.txt') ...

  8. 建立Model

    直接使用Sequelize虽然可以,但是存在一些问题. 团队开发时,有人喜欢自己加timestamp: var Pet = sequelize.define('pet', { id: { type: ...

  9. PLSQL 编码设置

    1.先查询plsql编码格式 select userenv('language')from dual 2.新建用户变量,变量名=NLS_LANG,变量值,刚才sql查询的结果 保存后,重启plsql即 ...

  10. 云服务器从阿里云迁移到华为云,FTP服务器的一些设置处理

    由于一些特殊原因,计划从阿里云上把ECS服务器的相关资源资源迁移到华为云上,为了保险起见,先申请一个月的华为云ECS服务器进行测试,首先就是搭建FTP服务器进行文件的上传处理,在使用FileZilla ...