⚠️⚠️⚠️阅前提示⚠️⚠️⚠️
本文为转载,已取得原作者授权。
原文链接:https://zhuanlan.zhihu.com/p/599836142
原作者:知乎@林登万
本文中的“笔者”、“我”均指原作者。
编辑&校对&审核:我@i5_1240P
📖目录
📋前言
📋做个小实验
📑传统电源计划选择平衡
📑传统电源计划选择卓越性能
📋阶段性结论
📑异构电源计划
📋做个小研究
📋再次实验
📋结论
📋前言
随着英特尔12代酷睿Alder Lake的发布,目前已有两代酷睿处理器采用新型大小核架构。随之而来的问题是生产力软件在新架构下不适配。
例如:
1.Windows 11著名的前台任务用大核,后台任务用小核调度策略,我摸鱼时电脑也摸鱼。
2.困扰无数人的虚拟机调度策略。VMware Workstation 17在Windows 11下仍优先使用小核心(此蜜汁操作不知道是VMware适配太慢还是Windows调度策略故意为之,目前根据网友的反馈VirtualBox和Hyper-V似乎也有类似问题)。Gracemont核心孱弱的规格跑分还行,真跑虚拟机慢到出奇。
我一个动辄千瓦电源的桌面用户你跟我谈能效?谈省电?谈碳电量?
前排提示:很多云用户会让你用Process Lasso给程序绑定大核心,此举属于是和BIOS关小核心一样没有必要,例如13700KF,8P核+8E核共24线程的处理器难道我的程序只配用8P核16线程?剩下8个小核心放着不用?更别说13900KF,难道放着16个小核心不用?
📋做个小实验
目前网络上普遍认为微软仅在Windows 11下增加了对大小核的支持,建议使用大小核架构的Windows 10用户更新至Windows 11获得更好的支持,同时Windows 11要按如下方式设置电源计划才能获得对大小核的最佳支持。这到底是不是谣言呢?笔者将在最后的结论中揭晓。
📑传统电源计划选择平衡
观察任务管理器发现,电源计划平衡时的处理器速度在不断自动调整,负载轻时CPU频率也在降低。猜测原因为“最小处理器状态”选项在平衡模式下默认值为5%导致。
如此设置后老规矩,虚拟机跑个分先。
如此看来似乎也还能凑合用,把虚拟机挂后台五分钟再跑个分先。
结果和之前一样,只是这个CPU核心调用过于平均,性能降幅明显,理论上现代虚拟机的性能损耗在5%以内,这个成绩属实不理想。
那如果笔者把电源计划更改为卓越性能呢?
📑传统电源计划选择卓越性能
将电源计划更改为没有大小核时专业用户最爱的卓越性能模式。
观察任务管理器发现,电源计划卓越性能时的处理器速度尽可能维持在最大睿频。
虚拟机跑个分先
图穷匕见了属于是,这分数基本就是小核心跑出的。
如果笔者将虚拟机的vCPU数量修改到大于13700KF物理小核心的数量呢?
虚拟机Windows 10的CPU-Z成绩
可以看到,完全无视大核心。哪怕虚拟机拥有16个vCPU,在卓越性能电源模式下,虚拟机也紧着小核心使劲用。这你……实在是不当人。
📋阶段性结论
根据以上几个非常不严谨的小实验可以发现:
传统电源模式平衡+现代电源模式最高性能时,Windows 11对于Intel的大小核异构处理器的调度有一定的优化,但还是有优先能耗的行为。
传统电源模式卓越性能(无法调整现代电源模式)时,Windows 11对于Intel的大小核异构处理器的调度就是依托答辩。
Windows 11的传统电源模式影响系统的调度!但不能排除现代电源模式的影响。
笔者先假设Windows内核的调度算法大部分是固定的,是电源模式(传统和现代)给出的参数影响了Windows内核的调度。从实际测试来看是有影响的。
接着笔者翻阅了微软的文档,发现一些有意思的东西。
📑异构电源计划
这个异构非常的Interesting,这个异构是笔者想的那个异构吗?这个SchedulingPolicy是笔者想的那个SchedulingPolicy吗?
这个高性能处理和高效能处理器非常的眼熟,让我康康英文版。
这不就是Intel整的新活吗,P核,E核。好你个浓眉大眼的微软,调度策略居然藏起来不给看。让笔者想办法给你改一改。
📋做个小研究
经过一些资料的查阅,笔者发现早在多年前人们就想修改Windows的电源模式中的隐藏参数,为此诞生的QuickCPU等工具。通过科学的方法笔者顺利访问了QuickCPU的官网,软件功能很多,不想研究的可以往下浏览不使用安装软件的解决方案,想研究的可以下载康康,笔者之后会更新相关文章。https://coderbag.com/product/quickcpu
还有一个小工具:https://forums.guru3d.com/threads/windows-power-plan-settings-explorer-utility.416058/
由于是个人发布的作品,未开源,笔者未在宿主机上运行。虚拟机Windows 10中运行感觉还不错,程序只有不到100KB。笔者未深入使用。
笔者为了解决大小核问题所购买的Bitsum“PROCESS LASSO”的Wiki中提到了相关的说明Known Windows Power Subsystem GUIDs,但居然没有在这Bitsum的网站上找到修改电源计划的软件。而是只提供了他们修改好的Bitsum最高性能电源计划。好你个浓眉大眼的Bitsum连NT调度修改软件都做了,居然不做修改电源计划的软件,有钱没处花呀。
那笔者只能求助于微软的PowerCfg了,毕竟解铃还需系铃人。
通过PowerCfg列出隐藏的电源计划选项:
powercfg /Qh > PowerPlanSettingsHidden.txt
通过搜索发现这么几个隐藏选项是笔者关心的:
子组 GUID: 54533251-82be-4824-96c1-47b60b740d00 (处理器电源管理)
GUID 别名: SUB_PROCESSOR
……
电源设置 GUID: 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 (生效的异类策略)
GUID 别名: HETEROPOLICY
可能的设置索引: 000
可能的设置友好名称: 使用异类策略 0
可能的设置索引: 001
可能的设置友好名称: 使用异类策略 1
可能的设置索引: 002
可能的设置友好名称: 使用异类策略 2
可能的设置索引: 003
可能的设置友好名称: 使用异类策略 3
可能的设置索引: 004
可能的设置友好名称: 使用异类策略 4
当前交流电源设置索引: 0x00000000
当前直流电源设置索引: 0x00000000
……
电源设置 GUID: 93b8b6dc-0698-4d1c-9ee4-0644e900c85d (异类线程调度策略)
GUID 别名: SCHEDPOLICY
可能的设置索引: 000
可能的设置友好名称: 所有处理器
可能的设置索引: 001
可能的设置友好名称: 高性能处理器
可能的设置索引: 002
可能的设置友好名称: 首选高性能处理器
可能的设置索引: 003
可能的设置友好名称: 高效处理器
可能的设置索引: 004
可能的设置友好名称: 首选高效处理器
可能的设置索引: 005
可能的设置友好名称: 自动
当前交流电源设置索引: 0x00000005
当前直流电源设置索引: 0x00000005
……
电源设置 GUID: bae08b81-2d5e-4688-ad6a-13243356654b (异类短运行线程调度策略)
GUID 别名: SHORTSCHEDPOLICY
可能的设置索引: 000
可能的设置友好名称: 所有处理器
可能的设置索引: 001
可能的设置友好名称: 高性能处理器
可能的设置索引: 002
可能的设置友好名称: 首选高性能处理器
可能的设置索引: 003
可能的设置友好名称: 高效处理器
可能的设置索引: 004
可能的设置友好名称: 首选高效处理器
可能的设置索引: 005
可能的设置友好名称: 自动
当前交流电源设置索引: 0x00000005
当前直流电源设置索引: 0x00000005
……
电源设置 GUID: b28a6829-c5f7-444e-8f61-10e24e85c532 (SMT 线程启动策略)
GUID 别名: SMTUNPARKPOLICY
可能的设置索引: 000
可能的设置友好名称: 核心
可能的设置索引: 001
可能的设置友好名称: 每个线程的核心
可能的设置索引: 002
可能的设置友好名称: 循环配置
可能的设置索引: 003
可能的设置友好名称: 顺序
当前交流电源设置索引: 0x00000000
当前直流电源设置索引: 0x00000000
……
其中第一个生效的异类策略比较难理解,MSDN文档中也未找到相关内容,但笔者通过查看winnt.h头文件可以发现其定义和解释。
但是这个定义不足以让笔者理解异类策略0、1、2、3、4的意思,于是笔者通过搜索发现Intel在白皮书《348851-optimizing-x86-hybrid-cpus》里有这样一段说明。
"In this configuration, the optimum set of compute cores are unparked starting with the most performant cores first."
"In this configuration, based off utilization, a combination of most performant or most efficient cores are unparked first."
"In certain scenarios like low power envelope SKUs or better battery life goals, it can be more efficient to run low utilization work on cores with higher efficiency capability at efficient frequency. This policy is used in these scenarios in combination with optimal performance state engine settings."
这两端话提到了CPU计算核心的Parking、Unparked,那这个Parking、Unparked是什么意思呢?
通过微软MSDN文档笔者发现,针对Windows PPM有这样一段介绍:
可以看出影响的是核心休止引擎的策略,结合Intel的白皮书,笔者猜测需要高性能(极致性能)的用户只需要设置“使用异类策略 0”即可优先唤醒性能核(P核)执行负载,笔记本用户电池敏感的话可以设置“使用异类策略 4”。
接下来使用PowerCfg搞定隐藏的生效的异类策略、异类线程调度策略、异类短运行线程调度策略、SMT 线程启动策略:
powercfg-attributesSUB-GROUPGUID-ATTRIB_HIDE//显示电源计划选项
powercfg-attributesSUB-GROUPGUID+ATTRIB_HIDE//隐藏电源计划选项
笔者的Windows 11 22H2上是这样几行命令,其他版本GUID可能有所不同,可按照之前的步骤查看GUID。
powercfg -attributes SUB_PROCESSOR 7f2f5cfa-f10c-4823-b5e1-e93ae85f46b5 -ATTRIB_HIDE
powercfg -attributes SUB_PROCESSOR 93b8b6dc-0698-4d1c-9ee4-0644e900c85d -ATTRIB_HIDE
powercfg -attributes SUB_PROCESSOR bae08b81-2d5e-4688-ad6a-13243356654b -ATTRIB_HIDE
powercfg -attributes SUB_PROCESSOR b28a6829-c5f7-444e-8f61-10e24e85c532 -ATTRIB_HIDE
观察一下各种电源计划。
等等,巨硬所谓的适配大小核的Windows调度该不会是指“生效的异类策略”吧,你就按Intel白皮书给的"Value 0"和"Value 4"随便整了一下?(其实应该是做了不少工作,Intel的白皮书应该是根据Windows实际情况写的,二者应该合作完善了内核调度机制,但是觉得对于专业用户好没有诚意,居然不给调!)
免责猜测微软应该早在搞Windows Mobile/RT/ARM时就在NT内核加入了大小核异构架构调度机制,这点也许可以通过导出一下几个远古版本Windows电源计划和winnt.h头文件证实,所谓的Windows 10不支持大小核调度只有Windows 11支持应该是某种程度上的谣传,毕竟Intel白皮书《348851-optimizing-x86-hybrid-cpus》还是用Windows 10讲解的。
笔者也在Windows 10 22H2的电源策略中发现了这几个选项:
📋再次实验
笔者使用PowerCfg复制一份卓越电源,然后改名成极致性能:
PS C:\Users\BigPro> powercfg /L
现有电源使用方案 (* Active)
-----------------------------------
电源方案 GUID: 381b4222-f694-41f0-9685-ff5bb260df2e (平衡)
电源方案 GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (高性能)
电源方案 GUID: a1841308-3541-4fab-bc81-f71556f20b4a (节能)
电源方案 GUID: e9a42b02-d5df-448d-aa00-03f14749eb61 (卓越性能) *
PS C:\Users\BigPro> powercfg /DUPLICATESCHEME e9a42b02-d5df-448d-aa00-03f14749eb61
电源方案 GUID: 88e534eb-1a19-4116-a126-3aa8823f1216 (卓越性能)
PS C:\Users\BigPro> powercfg /CHANGENAME 88e534eb-1a19-4116-a126-3aa8823f1216 极致性能
调整生效的异类策略、异类线程调度策略、异类短运行线程调度策略。
切换到自定义的极致性能模式用虚拟机小小跑个分。
极致性能模式下虚拟机单核分数终于满足预期,观察核心调用也满足预期。
虚拟机大约实现了宿主机98%的性能(不严谨),满足预期了,VMware虚拟化小小一个损耗!
最后一个测试,将虚拟机vCPU数量调整至同宿主机核心数一致,观察超出P Cores时的调度策略是否符合预期。让我们调整一下虚拟机vCPU数量再使劲一个跑分。
对比之前Windows 11宿主机下24线程的分数,笔者发现24 vCPU的虚拟机也几乎实现了宿主机98%-99%性能!满足预期了,VMware虚拟化小小一个损耗!
这波只能说是专业用户大胜利!!!FKU碳电量!!!
📋结论
经过上述分析和实验,笔者认为Windows 10和Windows 11同样支持大小核,造成奇怪调度的原因就是生效的异类策略、异类线程调度策略、异类短运行线程调度策略这三个处理器电源管理选项,各位大小核生产力用户只需按前文所述内容分别将其调整至“使用异类策略 0”、“首选高性能处理器”、“首选高性能处理器”即可实现异构大小核处理器的完美体验。
至于游戏用户则有更多的约束,根据微软MSDN文档中的说法:
“GameMode配置文件在‘游戏模式’设置切换打开并且用户正在玩游戏时启用。你可以使用此配置文件在游戏模式下为你的设备微调处理器设置。”
游戏用户如本文设置后是否拥有和关闭小核心一致的体验,1%Low帧是否有提升或波动?因笔者精力有限暂不进行验证,有兴趣验证的可以私信笔者过程和结论,笔者将更新至文章中。
(全文完)