一个 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 Releasebuild\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 专属增强) 的混合架构。
| 信息 | 数据源 | 备注 |
|---|---|---|
| 整卡 / 进程 GPU 利用率 | \GPU Engine(*)\Utilization Percentage |
按 LUID 聚合到适配器(取各引擎最大值),按 PID 聚合得到进程 GPU% |
| 进程显存 | \GPU Process Memory(*)\Dedicated Usage / Shared Usage |
按 LUID 聚合得到适配器总使用量 |
| 引擎细分 | PDH 实例名里的 engtype_* |
3D / Compute / Copy / VideoDecode / VideoEncode … |
| 显存总量 | IDXGIAdapter1::GetDesc1 的 DedicatedVideoMemory |
|
| 适配器名 / LUID | IDXGIAdapter1::GetDesc1 的 Description & AdapterLuid |
|
| 进程名 | OpenProcess + QueryFullProcessImageNameW |
无权限的进程显示 <unknown> |
| 进程 CPU% | GetProcessTimes(内核+用户时间差 / 墙钟差 / 逻辑核数) |
统计两次刷新之间的平均占用,跨所有核归一化到 0..100 |
| 进程内存占用量 | GetProcessMemoryInfo 的 WorkingSetSize |
显示进程实际占用的物理内存(工作集)字节数 |
| 进程所属用户 | OpenProcessToken + GetTokenInformation(TokenUser) + LookupAccountSidW |
无权限时显示 -,结果按 PID 缓存 |
| 系统内存占用率 | GlobalMemoryStatusEx 的 dwMemoryLoad |
进程表上方的 System RAM 条,含已用 / 总量 |
| 系统 CPU 占用率 | GetSystemTimes((内核+用户-空闲) / (内核+用户)) |
统计两次刷新之间的整机平均占用,进程表上方的 System CPU 条 |
| 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 / 老型号上输出会自然简化。
- 通过 Windows Console Virtual Terminal Processing(
ENABLE_VIRTUAL_TERMINAL_PROCESSING)启用 ANSI 控制码 - 使用
▏▎▍▌▋▊▉█做亚字符精度进度条 - 使用
▁▂▃▄▅▆▇█做历史曲线 sparkline - 整帧组装成单一 buffer,配合 VT
?2026h/l(Synchronized Output)一次性提交,杜绝画面跳动 - 使用
?1049备用屏幕缓冲,退出后终端不留痕迹
仓库已经把 ADLX SDK 通过 git 克隆到 third_party/ADLX,build.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 完全一致,个别驱动可能在
调用某个指标接口时崩溃。为此做了两层保护:
- SEH(
__try/__except):包住 ADLX 的初始化与取数,能拦下发生在当前线程的访问违规, 自动关闭 ADLX 后端、退回纯 PDH 模式。 - 崩溃哨兵(crash guard):有些驱动会在
amdadlx64.dll自己的后台线程里崩溃,这种跨线程 崩溃进程内无法捕获。因此在调用 ADLX 前会先在%TEMP%\amd_gpu_watch_adlx.crashguard写一个标记 并刷盘,只有完整跑完一轮 ADLX 采样后才删除。若下次启动发现标记还在,说明上次 ADLX 把进程搞崩了, 于是自动跳过 ADLX、以纯 PDH 模式运行。即:在这类机器上首次运行可能崩一次,之后会自愈。
想强制重试 ADLX 用 --adlx(会清除哨兵);想彻底不用 ADLX 用 --no-adlx。
- ADLX 没有 per-process GPU 接口,"哪个进程在吃 GPU" 必须靠 PDH(即任务管理器同源数据)
- ADLX 只支持 AMD GPU;PDH 后端对 NVIDIA / Intel 也能用
- 因此架构上以 PDH 为主干、ADLX 做 AMD 专属增强 —— 两边对齐到同一份
AdapterInfo
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)。