Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

amd_gpu_watch

一个 Windows 下的命令行 GPU 监视器,UI 风格类似 nvtop:实时显示 GPU 利用率、显存占用、各引擎负载、历史曲线,以及按 GPU 占用排序的进程列表。

虽然名字叫 amd_gpu_watch,但底层使用 Windows 的 PDH 性能计数器 + DXGI,对 AMD / NVIDIA / Intel 的 GPU 都通用,不需要任何 GPU 厂商 SDK。

功能

跨厂商基础功能(PDH + DXGI,AMD / NVIDIA / Intel 都可用):

  • 多 GPU 适配器:每张卡独立显示利用率、VRAM、共享内存(默认隐藏软件渲染器 WARP 和空闲的重复适配器,--all 可显示全部)
  • 引擎细分:3D / Compute / Copy / VideoDecode / VideoEncode 等
  • 历史曲线:使用 Unicode 块字符渲染的 sparkline(利用率 & 显存)
  • 进程级视图:列出占用 GPU 的进程(PID、名称、所属用户、GPU%、CPU%、内存占用量、VRAM、共享内存)
  • 进程排序:可按 GPU% / CPU% / 内存 / VRAM 任意列排序,表头高亮当前排序列
  • 系统概览:进程表上方显示整机 CPU 与物理内存占用条(占用率 + 已用 / 总量),行尾附带实时趋势 sparkline
  • 暂停/冻结:随时定格当前画面便于观察或截图
  • 一次性快照:--once / --json 非交互输出单帧,方便脚本采集、日志与告警
  • 颜色编码:根据负载自动切换青/绿/黄/红
  • 自适应布局:进度条、历史曲线、进程表列宽随窗口大小实时伸缩,窄窗口下自动精简(USER 列在窄窗口自动隐藏)
  • 整帧原子刷新:使用 VT ?2026 同步输出,去除画面跳动
  • 键位:q / Esc / Ctrl+C 退出,p 暂停,g / c / m / v 切换排序,+ / - 调整刷新间隔

AMD 专属增强(ADLX 后端,与 Adrenalin 同源):

  • GPU Activity (SMU):覆盖 PDH 的整卡利用率,与 Adrenalin 数值一致
  • 温度三件套:Edge / Hotspot / VRAM(HBM/GDDR)/ Intake
  • 功耗:ASIC(GPU 自身)/ TBP(整卡板载)
  • 频率 & 电压:Core MHz / Memory MHz / Voltage V
  • 风扇:RPM + PWM 占空比 (%)

编译

只需 VS2022(默认查找 C:\msvsn2022)。

ADLX SDK 通过 git submodule 引入到 third_party/ADLX,所以克隆仓库时记得带 --recursive

git clone --recursive https://github.com/donghanbj/amd_gpu_watch.git
cd amd_gpu_watch
build.bat

如果已经 clone 过但忘了 --recursive,可以补一步:

git submodule update --init --recursive

不想要 AMD 专属指标(温度 / 功耗 / 频率 / 风扇)时,跳过 submodule 初始化即可, build.bat 检测不到 SDK 会自动以纯 PDH 模式编译。

或者构建调试版本:

build.bat debug

产物位于 build\amd_gpu_watch.exe

也可以使用 CMake:

cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

运行

build\amd_gpu_watch.exe
build\amd_gpu_watch.exe --interval 500
build\amd_gpu_watch.exe --once
build\amd_gpu_watch.exe --json > snapshot.json
build\amd_gpu_watch.exe --once --sort cpu

参数:

参数 说明
-i, --interval <ms> 刷新间隔,默认 1000ms,最小 250ms
--all 显示全部 DXGI 适配器,包括软件渲染器和空闲的重复适配器
--no-adlx 禁用 AMD ADLX 后端,只用跨厂商的 PDH/DXGI 数据
--adlx 强制启用 ADLX 并清除崩溃哨兵(ADLX 崩溃后会自动禁用,用此重试)
--once 采样一帧后以纯文本输出并退出(非交互,适合脚本)
--json 采样一帧后以 JSON 输出并退出
--sort <col> 一次性模式的排序列:gpu / cpu / mem / vram(默认 gpu
-h, --help 显示帮助

交互键位:

按键 说明
q / Esc / Ctrl+C 退出
p 暂停 / 恢复画面
g / c / m / v 按 GPU% / CPU% / 内存 / VRAM 排序进程
+ / - 增大 / 减小刷新间隔

第一帧会等待大约 1s 用于性能计数器采样窗口。--once / --json 会自动采样两次以得出 CPU 占用率。

实现说明

整体是 PDH + DXGI(跨厂商主干)+ ADLX(AMD 专属增强) 的混合架构。

PDH + DXGI(跨厂商)

信息 数据源 备注
整卡 / 进程 GPU 利用率 \GPU Engine(*)\Utilization Percentage 按 LUID 聚合到适配器(取各引擎最大值),按 PID 聚合得到进程 GPU%
进程显存 \GPU Process Memory(*)\Dedicated Usage / Shared Usage 按 LUID 聚合得到适配器总使用量
引擎细分 PDH 实例名里的 engtype_* 3D / Compute / Copy / VideoDecode / VideoEncode …
显存总量 IDXGIAdapter1::GetDesc1DedicatedVideoMemory
适配器名 / LUID IDXGIAdapter1::GetDesc1Description & AdapterLuid
进程名 OpenProcess + QueryFullProcessImageNameW 无权限的进程显示 <unknown>
进程 CPU% GetProcessTimes(内核+用户时间差 / 墙钟差 / 逻辑核数) 统计两次刷新之间的平均占用,跨所有核归一化到 0..100
进程内存占用量 GetProcessMemoryInfoWorkingSetSize 显示进程实际占用的物理内存(工作集)字节数
进程所属用户 OpenProcessToken + GetTokenInformation(TokenUser) + LookupAccountSidW 无权限时显示 -,结果按 PID 缓存
系统内存占用率 GlobalMemoryStatusExdwMemoryLoad 进程表上方的 System RAM 条,含已用 / 总量
系统 CPU 占用率 GetSystemTimes((内核+用户-空闲) / (内核+用户)) 统计两次刷新之间的整机平均占用,进程表上方的 System CPU 条

ADLX 接口对应表(AMD 专属,默认启用)

TUI 显示 ADLX 接口 备注
GPU Util(覆盖 PDH) IADLXGPUMetrics::GPUUsage SMU 视角的整卡 Activity,与 Adrenalin 一致
Thermals · Edge IADLXGPUMetrics::GPUTemperature die 温度
Thermals · Hotspot IADLXGPUMetrics::GPUHotspotTemperature junction 最高温
Thermals · VRAM IADLXGPUMetrics2::GPUMemoryTemperature HBM/GDDR 颗粒温度(部分卡支持)
Thermals · Intake IADLXGPUMetrics::GPUIntakeTemperature 进风口(移动 GPU 多见)
Power · ASIC IADLXGPUMetrics::GPUPower GPU 自身功耗
Power · TBP IADLXGPUMetrics::GPUTotalBoardPower 整卡板载功耗
Clocks · Core IADLXGPUMetrics::GPUClockSpeed MHz
Clocks · Mem IADLXGPUMetrics::GPUVRAMClockSpeed MHz
Clocks · Volt IADLXGPUMetrics::GPUVoltage mV → V 自动转换
Fan · RPM IADLXGPUMetrics::GPUFanSpeed
Fan · % IADLXGPUMetrics3::GPUFanDuty PWM 占空比
备用 VRAM 用量 IADLXGPUMetrics::GPUVRAM 当 PDH 没采到时用 ADLX 兜底

显示时未上报的字段会被自动隐藏,所以同一份代码在桌面卡 / 移动 APU / 老型号上输出会自然简化。

TUI 渲染

  • 通过 Windows Console Virtual Terminal ProcessingENABLE_VIRTUAL_TERMINAL_PROCESSING)启用 ANSI 控制码
  • 使用 ▏▎▍▌▋▊▉█ 做亚字符精度进度条
  • 使用 ▁▂▃▄▅▆▇█ 做历史曲线 sparkline
  • 整帧组装成单一 buffer,配合 VT ?2026h/lSynchronized Output)一次性提交,杜绝画面跳动
  • 使用 ?1049 备用屏幕缓冲,退出后终端不留痕迹

ADLX 后端如何启用 / 关闭

仓库已经把 ADLX SDK 通过 git 克隆到 third_party/ADLXbuild.bat 会自动检测 third_party\ADLX\SDK 并开启 ADLX 后端,不需要任何额外配置。如需指向自定义 SDK 路径, 设置环境变量 ADLX_SDK 即可(指向包含 ADLXHelper\Windows\Cpp\ADLXHelper.h 的 SDK 根目录):

set ADLX_SDK=D:\sdk\ADLX
build.bat

如果想完全禁用 ADLX、回到纯 PDH 跨厂商模式:运行时加 --no-adlx 即可(无需重编译); 构建时也可以临时改名 SDK 目录或把 ADLX_SDK 指向一个不存在的路径。

运行时 ADLXHelper 会动态加载 amdadlx64.dll(AMD 驱动自带)。如果当前机器上没有 AMD GPU 或没装驱动,ADLX 后端会自动降级,不影响 PDH 数据 —— 编译产物拷到任意 Windows 机器都能用。

amdadlx64.dll 的版本由本机 AMD 驱动决定,未必与编译所用的 ADLX SDK 完全一致,个别驱动可能在 调用某个指标接口时崩溃。为此做了两层保护:

  1. SEH(__try/__except:包住 ADLX 的初始化与取数,能拦下发生在当前线程的访问违规, 自动关闭 ADLX 后端、退回纯 PDH 模式。
  2. 崩溃哨兵(crash guard):有些驱动会在 amdadlx64.dll 自己的后台线程里崩溃,这种跨线程 崩溃进程内无法捕获。因此在调用 ADLX 前会先在 %TEMP%\amd_gpu_watch_adlx.crashguard 写一个标记 并刷盘,只有完整跑完一轮 ADLX 采样后才删除。若下次启动发现标记还在,说明上次 ADLX 把进程搞崩了, 于是自动跳过 ADLX、以纯 PDH 模式运行。即:在这类机器上首次运行可能崩一次,之后会自愈。

想强制重试 ADLX 用 --adlx(会清除哨兵);想彻底不用 ADLX 用 --no-adlx

为什么不全部用 ADLX

  • ADLX 没有 per-process GPU 接口,"哪个进程在吃 GPU" 必须靠 PDH(即任务管理器同源数据)
  • ADLX 只支持 AMD GPU;PDH 后端对 NVIDIA / Intel 也能用
  • 因此架构上以 PDH 为主干、ADLX 做 AMD 专属增强 —— 两边对齐到同一份 AdapterInfo

显示效果(启用 ADLX 时)

GPU 0: AMD Radeon RX 6800 XT  [luid_0x00000000_0x000111AA_phys_0]
  GPU Util       [█████████ ]  60.1%
  VRAM           [████      ]  25.0%   4.0 GB / 16.0 GB
  Shared Mem     1.2 GB / 16.0 GB
  Thermals       Edge 62°C  Hotspot 78°C  VRAM 70°C  Intake 25°C
  Power          ASIC 145.2 W  TBP 180.5 W
  Clocks         Core 2400 MHz  Mem 2000 MHz  Volt 1.025 V
  Fan            1820 rpm  45%
  Engine 3D      [████████  ]  60.0%
  Engine Compute [██        ]  20.0%
  Util history   ▁▂▃▅▆▇█▇▆▅▃▂▁
  VRAM history   ▂▃▃▄▄▅▅▅▄▄▃▂▂

  System CPU     [████      ]  38.7%  ▂▃▅▆▇█▆▅▃▂
  System RAM     [███       ]  35.2%   11.3 GB / 32.0 GB  ▃▃▄▄▅▅▄▄▃▃
──────────────────────────────────────────────────────────────────
  PID    Name            User        GPU%     CPU%    MEM          VRAM         Shared
   1234  game.exe        alice       45.0%    18.5%   1.98 GB       3.0 GB        128 MB
   5678  chrome.exe      alice       12.0%     4.3%   980 MB        900 MB         50 MB

USER 列仅在终端足够宽时显示;窗口较窄时会自动隐藏以保证其余列不换行。

已知限制

  • 进程列表只显示当前用户有权打开句柄的进程名(其他进程显示 <unknown>)。需要看全部时请用 管理员命令行运行。
  • PDH 利用率按 100ns 时钟比率累计;瞬时尖峰会被一秒窗口平滑,这是 Windows 性能计数器本身的 特性,与本程序无关。
  • 不启用 ADLX 时无法读取温度 / 频率 / 风扇 / 功耗。开启 ADLX 后这些指标可见但仍受 AMD 驱动 当时上报的范围限制(部分老型号或低功耗 APU 不会上报全部字段,未上报的字段会显示为 0)。

About

A nvtop-style GPU monitor for Windows (PDH + DXGI; optional ADLX backend for AMD-specific metrics)

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages