从总体上来说,Windows 10是一个好系统,虽然我们天天戏称它为“Bug 10”,但不可否认的是,从立项以来,开发团队就一直在努力为它加入新的功能,其中有不少是相当实用的,比如说,他们在1709这个大版本中,为任务管理器加入了GPU性能监控单元,用户可以通过任务管理器直观地看到目前的GPU占用率,比以往要开GPU-Z等程序方便了不少。但很多用户在实际使用的时候也发现了,这个针对GPU的性能监控好像不太准,我显卡在全力计算的时候,任务管理器里面的GPU占用率怎么这么低?

比如我开个挖矿程序,显卡的占用其实是满的,但左边GPU窗格中显示的占用率只有3%

为了找出答案,我们找到了当时引入这项新功能时,开发者的讲解Blog,由于是与图形相关的内容,这篇Blog被归入DirectX Developer Blog中。

首先开发者给我们讲述了任务管理器是怎么得知GPU的占用情况的。在Windows 10上面,GPU通过Windows Display Driver Model(WDDM,Windows显示驱动模型)抽象,它的核心——图形内核——负责抽象、管理和在所有进程分配GPU资源。它含有一个GPU事务器(VidSch)和一个视频内存管理器(VidMem),前者负责将GPU的各种引擎分配给想要使用它们的进程,并对访问进行仲裁和优先级排序,后者则是负责管理GPU可调用的内存——包括专用的显存和共享的系统内存。

任务管理器就是通过VidSch和VidMem回报的数据来计算GPU的使用情况的,这样一来,不管程序使用了什么API(DX、OpenGL、OpenCL,甚至CUDA、Mantle这种专有API都可以监控),它都能准确地收集GPU的占用情况,另外由于两者是实际负责分配GPU资源的,位于驱动层面,它们回报数据的精准度也要比很多第三方工具要高,使得任务管理器有很高的精度。

既然有很高的精度,那它为什么还是报不准我的GPU占用率呢?这就牵扯到另一个问题,GPU引擎。

现代GPU上除了有主要用于图形、通用计算的统一计算单元外,还会集成一些其他的电路,比如说,用于视频编解码的专用模块。它们之间的关系一般是并行的,GPU可以同时运行图形计算和视频编码任务,在驱动层面,这些不同的模块就被抽象为不同的Engine,也就是引擎,比如说一个典型的GPU可以有以下这些引擎:

在具体执行任务的时候,不同的任务会在不同的引擎上面执行,比如说我打游戏,就用到3D引擎;我用显卡加速Premiere Pro,就用到CUDA引擎;我用NVENC编码视频,就用到视频编码引擎。

一张RTX 2060显卡被系统抽象出的引擎

由于部分引擎之间有复用的关系,比如说3D引擎和CUDA引擎复用CUDA Cores进行计算,那么如果通过简单加法来计算占用率,那这个占用率就有可能会超过100%。开发团队也考虑过使用平均利用率来表示,但也不靠谱。那3D引擎不是被用的最多吗,就用它怎么样?也不太行,比如在视频引擎满载而3D引擎空载的情况下,它将会显示0%的占用率,也是不准确的。最终,开发团队选择将当前最为繁忙的引擎占用率作为GPU整体占用率的代表。

恩……博文说的很好,那么到今天为止这个功能上线也有一段时间了,其具体表现是怎样的呢?让我们看回顶上的那张图,在GPU的CUDA引擎满载的情况下,其左边的整体占用率仍然很低,显然是没有达到开发团队所说的。

我们又测试了一下别的情况,这里使用NVENC对视频进行编码,此时可以看到左边窗格中的GPU占用率又跑到了满载。

而在跑典型的3D应用程序的时候,它也很正常。

最后,我们尝试了OpenCL负载,这次任务管理器又能反映出CUDA引擎的占用率了。

如此看来,任务管理器GPU占用率的薛定谔情况可能是Windows 10的一个Bug所导致的,在大部分情况下,它都会反映负载最大引擎的占用率,但在某些情况下,它并不能够正确地显示当前最繁忙引擎的占用情况。

1709 ltsb 内存占用_有问有答:任务管理器里面的GPU占用率到底是怎么算的?相关推荐

  1. 占用率_有问有答:任务管理器里面的GPU占用率到底是怎么算的?

    从总体上来说,Windows 10是一个好系统,虽然我们天天戏称它为"Bug 10",但不可否认的是,从立项以来,开发团队就一直在努力为它加入新的功能,其中有不少是相当实用的,比如 ...

  2. 1709 ltsb 内存占用_腾讯游戏学院专家分析:Unity在移动设备的GPU内存机制

    导语 CPU和GPU是共享一份内存的吗?腾讯游戏学院专家Donald将在本文尝试以一张贴图纹理的虚拟内存占用为例,解答一些内存方面的问题.本篇主要分析iOS系统,后续会更新安卓篇. 开发手机游戏时,常 ...

  3. 1709 ltsb 内存占用_我的手机内存明明是8G,为什么用的时候只有4G?求解。

    展开全部 原因以bai下 1.内存8G是指整个ROM存储器空间du大小,而不zhi是可用dao空间大小.很多智能内手机,系统文件都会占用容部分存储空间, 2.为了给顾S4内置了安卓操作系统和很多创新功 ...

  4. 1709 ltsb 内存占用_一次C++伪“内存泄漏”的排查之旅

    前段时间做一个需求,需要用到一个本地词典文件.该词典原始文件超过2G,在服务启动的时候加载到内存中,并且保持词典数据的热加载,也就是不停服更新词典数据到服务进程的内存中. 之前有同事在其他项目中有热更 ...

  5. 1709 ltsb 内存占用_「正点原子STM32Mini板资料连载」第三十二章 内存管理实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十二章 内存管理实验 上一章,我 ...

  6. 什么软件测试显卡占用率,到底多少才算够 GTA5显存占用情况测试

    1GTA5显存情况占有测试 自由.不羁.快意恩仇.做想做却又不敢做的事,甚至是尽情舒展自己阴暗的一面,这就是GTA V当中所描绘的世界.也许其中的洛圣都并不真实存在,但R星所缔造的这片世界却又是那么的 ...

  7. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  8. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?

    上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...

  9. python减小内存占用_如何将Python内存占用缩小20倍?

    当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...

最新文章

  1. Android onConfigurationChanged 收不到回调
  2. AI芯片评测如何与时俱进?地平线提出全新MAPS评测方法,帮助用户理解AI芯片性能...
  3. 嵌入式系统的知识体系、学习误区及学习建议
  4. Struts1 中的 global-forward
  5. android之实现各个组件点击事件处理
  6. 【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
  7. java - 菱形输出
  8. leetCode 题 - 100. 相同的树
  9. 史上最简单MySQL教程详解(基础篇)之SQL语句以及预留关键字介绍
  10. linux自建git仓库
  11. 实战篇-六十六行完成简洁的Rss输出类
  12. Go语言之高级篇beego框架之模型(Models)
  13. mapxtreme 论坛_会议纪要 | 取栓论坛 云端论剑 大梗死核心取栓专场 精华回顾
  14. 用户增长因果推断概念
  15. (实战)[自动驾驶赛车-中国联赛]-合集
  16. 【U8+】win10/11系统注册用友U8硬加密
  17. 如何根据业务需求来选择合适的代理IP
  18. shell小知识总结
  19. 第三部分:(主从)复合句——第三章:状语从句
  20. 《使用MAVEN+SSM+Ajax+shiro+MySql开发在线商场详解(4)》

热门文章

  1. 远程教育教师教与学经验总结
  2. 肺结节公开数据集(LIDC-IDRI)
  3. VisionPro 常用控件的说明 C# 开发
  4. java jce_JCE - 懒懒的呐喊 - 博客园
  5. 为什么要重新运营以前的公众号呢?
  6. 控制教程 —— 介绍篇:8.基于Simulink为火车系统建模
  7. MATLAB Simulink中Scope数据导入到工作区
  8. 计算机网络学习心得(一)
  9. 【算法学习】马尔可夫过程及经典例题讲解(含代码实现)
  10. 电路板中的各种“地”