一种基于机型定制的FEAS方案

本文转载自酷安@zyy2005
校对删改:二次寒树

一、正文

 在使用asoul时偶然发现相同负载下超大核占用略低时功耗更低,表明潘多拉自带FEAS的大核和中核频率对应关系(下简称频率表)对于7+2以及其他8+类似物而言并不是最优解(显然这一负载下把大核降一档频率能在提供足够性能是功耗更低)。那么,如何为特定处理器定制频率表?

 开始之前,我们需要对FEAS工作原理有一定了解。FEAS从系统接口读取帧率的变化状况,并根据帧率的升降控制CPU频率,帧率低了,说明当前频率能提供的算力不够,就升频,反之降频。但是CPU通常是三丛集的,到底升/降哪(几)个丛集的频率呢?FEAS给出的方案是建立一个频率表,表内有40(最新潘多拉为26)个性能档位,每个档位拥有固定的三个丛集的频率值,各个核心频率按从高到低排列,对应提供的性能也因此从高到低排列(比如说第一档可能是大核2.9G,中核2.5G,小核1.8G;第二档也许是2.8 2.4 1.7这样),需要升/降频的时候,就按照这个表的频率变,这也是为什么FEAS的特征是中大核联动。

 我们要改的就是这个频率表,那么这个频率表要怎么改呢?这里需要感谢许多大佬对FEAS的分析,尤其是pzqqt的个人博客。我们以潘多拉为例定位到附加模块的 kernel_modules/perfmgr.ko 文件,扔进IDA里面反汇编,我们可以看到,这个频率表是由三个数组 cpufreq_big/mid/little 存储的

 (由于还没学过汇编,也不大了解IDA这个软件,对着计算器敲半天才看出来这东西是没正确识别成应有的格式,图中mid数组的第一个频率应该是0x29E500即2745600Hz)

 我们把这些数组对应到16进制视图中就是这一片00 xx xx 00的部分(每个00 ①② ③④ 00应该读为0x③④①②00,写入时候当然也一样),想要改频率表,只需要随便找个HEX编辑器,一个个改这一片的值即可。(具体值建议用la系统工具箱看精确到hz的频率值,填成Excel表,然后用Excel的dec2hex函数批量转十六进制)

 (找hex编辑器内位置小技巧,看编辑器右侧的文本部分,找一大堆间歇变化的规则符号就行,不一定要像我一样反汇编折腾一通,MT管理器的HEX功能要会员,没会员的用别的)

 我们现在已经知道怎么改频率表了,那么要改成什么值才能有更优的效果呢?对于骁龙8+类似物,比较保守的小改办法是把中高频每一档位的大核频率调到不高于中核。(解释:X2能效比A710确实高,但这是在相同功耗的条件下,而相同频率X2的功耗要高A710不少,个人测试SPEC浮点443.milc测试发现2.4G的A710跟1.8G的X2功耗和性能较为接近)而我采用了较为激进的方法,直接从头建立中大核频率表。

 (一开始,我用简单的数学方法确定理论上把性能对功耗的导数相同的大中核频率绑一起作为一档有最好的表现,并用SPEC测单核性能功耗拟合曲线计算了一套频率表,但实际上由于多核利用效率和测试误差等等问题,似乎效果不好)

 我使用GPU GFLOPS(andSPECmod似乎不能调用多个核心)的CPUmix2全核心单烤模式,每次测试去掉调度用scene自定义频率+performance调速器锁死频率,固定180s后读取测试,反复测试3次,有误差大的数据重测的方式,先测试最低一档也就是最低频率下的性能及功耗,为105/1.79W。然后大核升一档,测得118/1.9W,就以118附近作为目标分数,修改中大核频率,测试哪个频率组合在达到类似分数时功耗最低,这样就是第二低的档位,以此类推,测出所有档位的值,然后把原频率表差不多中大核频率对应的小核频率值一个个抄过来(不测小核是因为实在不好测,而且FEAS对小核控制几乎无效,所以留着不动甚至错位问题也不大),输进Excel表格,批量转十六进制,然后用hex编辑器填回perfmgr.ko对应部分,塞回附加模块,就完成了对该机型定制。

二、模块

 由于测试匆忙,而且测试方式并不是很准也不是很接近实际游戏(GFLOPS本身只是个烤机软件),建议根据游戏实测情况修改测的不准的地方并希望能反馈在评论区。

 目前仍待解决问题:①测试方式并不准确②asoul等线程分配工作不太正常

 0322版附加模块 骁龙7+2 专改版(8+勉强能用但是游戏极限性能锁大核3.0中核2.5),模块基于0322版附加模块,根据处理器大核和中核的能效修改perfmgr中的频率表,期望以此获得比原版的通用配置更低的功耗。

 目前仍是早期版本,部分场景可能不如原版,是否要使用请自行测试,遇到表现不如原版的情况也欢迎带scene帧率记录图在评论区反馈,有空也许会进行优化(没空鸽了也是有可能的)。模块与asoul适配不佳偶尔抽风,建议仅搭配scene调度开核心分配使用。 与asoul等适配请自测,各核心的负载均衡(没有摸鱼的核)且高(75%左右)为佳,目前A3C版本asoul配置文件0还不错,除了小核时不时摸鱼。

ps:此模块7+gen2最优,后续更新请到酷安


123云盘 提取码dgew


文章目录