三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

RyzenAdj 功耗调节上手教程:3 个核心参数,搞定 AMD 笔记本的降频与续航

RyzenAdj 功耗调节上手教程:3 个核心参数,搞定 AMD 笔记本的降频与续航

RyzenAdj 功耗调节上手教程:3 个核心参数,搞定 AMD 笔记本的降频与续航

【免费下载链接】RyzenAdjAdjust power management settings for Ryzen APUs项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj

同样一颗 AMD Ryzen 处理器,在评测机里能长时间跑满功耗,在你的笔记本上却"开场 30 秒就蔫了"——帧数掉、风扇狂转、温度贴着 90℃ 打转。这往往不是散热不行,而是固件出厂时把功耗管理策略写得太保守。RyzenAdj 正是这样一款开源命令行工具:它直接与处理器内部的电源管理单元对话,改写那张决定功耗上限的电源管理表(PM Table),把"限速"的主动权交还给你。

先算一笔账:不调功耗,你的 Ryzen 亏在哪

把 CPU 想象成一位被教练(固件)设了保守心率上限的运动员。心率一到阈值就强制降速,哪怕体能还有富余。你的 Ryzen 也是一样:出厂策略为了照顾最差的散热模具、最高的环境温度,往往把上限压得比硬件真实能力低一截。

不调整,你会持续损失三样东西:

  • 长时间负载下的性能:打游戏、视频渲染超过几分钟,功耗墙一触即发,频率从 4GHz 级别一路跳水,帧数跟着坐过山车。
  • 按需省电的机会:移动办公时功耗策略不会自动收紧,电池被"空烧",续航白白缩水。
  • 对硬件的掌控感:明明是自己花钱买的机器,功耗怎么分配却由固件说了算。

而调整之后,你能拿回这三样:持续满载的稳定性能、插电/拔电两套可切换的策略、以及一套透明可见的参数表。更重要的是,RyzenAdj 的所有修改都只在运行时生效,重启自动复原——这既是它的局限(需要配合自动化),也是它的护身符:调坏了,重启就回到出厂状态,几乎没有不可逆风险。

最小可行路径:一条命令确认你的 CPU 支不支持

动手之前先"体检",这是整个流程里最关键的一步。终端里执行:

ryzenadj -i

它会打印出 CPU Family、SMU BIOS 接口版本、PM Table 版本,以及一张当前全部限值和实时读数的对照表,大致长这样(数值因机型而异):

CPU Family: Phoenix Point PM Table Version: 1e0f600 | Name | Value | Parameter | |---------------------|-----------|--------------------| | STAPM LIMIT | 28.000 | stapm-limit | | STAPM VALUE | 19.231 | | | PPT LIMIT FAST | 42.000 | fast-limit | | PPT VALUE FAST | 30.150 | |

💡 注意单位:-i里显示的功率以为单位,而命令行参数以毫瓦为单位。写参数时 45W 要写成 45000,别少写一个零。

跑通这一条命令,说明你的机器能正常访问电源管理单元,后面的一切才有意义。

Windows 上 3 分钟跑起来

Windows 用户直接用预编译版本,不需要装任何编译环境:

  1. 把仓库win32目录下的ryzenadj.exe连同WinRing0x64.sys驱动和几个 DLL 放在同一个文件夹里。
  2. 右键以管理员身份打开命令提示符,切换到该目录。
  3. 执行ryzenadj.exe -i,看到上面的输出即代表成功。

⚠️ 驱动文件必须和 exe 同目录,缺了WinRing0x64.sys会直接初始化失败。

Linux 版怎么装

Linux 用户需要自己编译,好在依赖很简单:

# 安装编译依赖(Debian/Ubuntu 系) sudo apt install build-essential cmake libpci-dev # 克隆并编译 git clone https://gitcode.com/gh_mirrors/ry/RyzenAdj cd RyzenAdj mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make sudo cp ryzenadj /usr/local/bin/

编译完成后用sudo ryzenadj -i验证。Linux 上有两条访问底层硬件的通道:优先尝试ryzen_smu内核模块,找不到才回退到/dev/mem(依赖 libpci)。如果你的内核出于安全考虑禁用了/dev/mem,安装ryzen_smu模块即可,注意它需要 0.1.7 及以上版本;开了 Secure Boot 的话,还得用mokutil导入 DKMS 生成的密钥。

三个核心玩法:从"会用"到"会调"

玩法一:读懂 STAPM 与 PPT,先会调"三档功耗"

一句话讲清原理:CPU 的功耗上限分三层管理——PPT FAST(瞬时上限)管爆发,PPT SLOW(平均上限)管一段时间的均值,STAPM(持续上限)管长期累积。真正让游戏半小时后降频的,通常是最后一档。可以理解成"三个水龙头配一个大水箱":前面两个决定短时流量,水箱容量决定你究竟能跑多久。

一段可复制的操作:先把三档统一抬到一个略高于默认的档位试试,比如某台默认 45W 的机器:

ryzenadj --stapm-limit=52000 --fast-limit=54000 --slow-limit=52000 -i

一句预期效果:长时负载下 STAPM VALUE 能贴着 LIMIT 走而不是早早触发降频,游戏一小时帧数曲线不再"跳水"。

玩法二:温度墙与皮肤温度,两个"保险丝"各管什么

一句话讲清原理tctl-temp是 CPU 内部温度上限,超过就降频保护芯片;apu-skin-temp是机壳表面温度上限,管的是你摸到的地方烫不烫、电池会不会过热。前者保护硬件,后者保护体验,两个是独立的保险丝。

一段可复制的操作:散热好的游戏本可以放开内部温度墙,同时给皮肤温度留点余量:

ryzenadj --tctl-temp=93 --apu-skin-temp=55 -i

一句预期效果:高负载不再频繁触墙猛降频,同时键盘面不至于烫得放不住手。

玩法三:插电拔电双策略与核显最低频率

一句话讲清原理--power-saving--max-performance是两个"隐藏开关",模拟固件在拔电/插电时切换整套行为的逻辑;min-gfxclk则给核显设一个最低频率,避免画面忽快忽慢或核显空转耗电。

一段可复制的操作:插电打游戏时用性能模式,拔电办公时换省电模式,顺便压住核显:

# 插电场景 ryzenadj --max-performance --min-gfxclk=400 # 拔电场景 ryzenadj --power-saving --min-gfxclk=300

一句预期效果:插电时核显输出稳定不卡帧,拔电后空载功耗下降,办公场景续航明显变耐扛。

避坑清单:新手最容易踩的 6 个坑

  • 不要照抄别人的参数,而是先-i记下自己的默认值。每台机器的散热、供电、模具都不一样,别人 55W 稳如狗,你的机器可能 45W 就触顶。默认值就是你的安全基准线。
  • 不要一次性改一堆参数,而是每次只动 1-2 个并观察。参数之间有耦合,全改一遍出了问题你根本不知道是哪条引起的。
  • 不要一上来就拉满,而是小步试探。建议以默认值为基准,每次增加 3000-5000mW,跑十分钟负载看温度再决定要不要继续。
  • 不要指望设置永久生效,而是配一套自动值守。不少 OEM 电源管理软件会在你调整后覆盖回去。Windows 用户可以先把参数写进win32/readjustService.ps1,再运行win32/installServiceTask.bat注册成计划任务(任务名叫AMD\RyzenAdj);Linux 用户可以用 systemd 服务或定时任务定期重写。
  • 不要碰强制超频与电压参数,日常调校根本用不到它们。oc-clkoc-voltenable-oc这类"硬核"参数只对特定新架构开放且风险高,功率温度之外的领域不值得新手涉足。
  • 不要把报错当损坏。输出not supported on this familynot supported on this SMU,通常只是说明你的机型不支持该参数,改别的即可,机器毫发无损。此外,部分品牌笔记本自带性能控制中心,和 RyzenAdj 同时存在可能互相覆盖,二选一更省心。

再进一步:从手动调参到自动值守

手动命令适合试验,长期使用则需要自动化。项目仓库里已经准备好了两个可以直接抄作业的示例:

  • examples/readjust.py演示了"监控 + 自动重写"的思路:它每 3 秒刷新一次电源表,一旦发现 fast limit 被其他软件改回默认值,就立刻重新应用你预设的参数组合。用ctypes加载libryzenadj动态库即可,Windows 和 Linux 通用。
  • examples/pmtable-example.py则把整张 PM Table 的实时数值以每秒一次的频率刷在终端里,配合--dump-table参数使用,适合想深入观察每个偏移量变化的高级用户。

如果你想把自己的程序接进来,头文件lib/ryzenadj.h就是完整说明书:init_ryzenadj()初始化句柄,set_stapm_limitset_tctl_temp这类函数对应每一个可调参数,返回值 0 表示成功,-1/-3/-4 分别代表家族不支持、SMU 不支持、被 SMU 拒绝。从 Raven 第一代移动锐龙到 Phoenix、Strix Point 等新架构,支持的家族都列在这个头文件的枚举里,先查自己的 CPU 属于哪一代再下手。

写在最后

回到开头的场景:那颗"开场 30 秒就蔫了"的 Ryzen,其实从来没有变弱,只是被人为设了一道多余的闸门。RyzenAdj 的价值不是把参数拉满,而是让你知道闸门在哪、怎么开、开多大由你的散热和需求说了算。

今天的行动清单只有两步:先跑一次ryzenadj -i完成"体检",再挑一个参数(建议从--stapm-limit开始)小幅上调感受差异。等找到适合自己的数值组合,再把它写进自动化脚本,让每一次开机都自动应用。性能不是玄学,是一张看得见的表。

【免费下载链接】RyzenAdjAdjust power management settings for Ryzen APUs项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表