高通平台实测情况分享的第二篇。
上一篇验证驱动栈和设备树绑定,这篇继续分享实测的另一个指标温控cpufreq。
引言
实测的两台设备跑了同一套负载和采样脚本:
- 第五代骁龙8至尊版(SM8850)(Canoe,Android 16 userdebug,kernel 6.17 mainline)。
- 高通跃龙IQ-9075 EVK(QCS9075,Ubuntu 24.04.4,kernel 6.8.0-1080-qcom)。
我们发现第五代骁龙8至尊版平台SM8850为密闭壳内被动散热,IQ-9075 EVK 开放空气加大散热片。同一段压测代码,两种散热与功耗策略,降频行为完全不同。
1. 两台机器的 CPU 拓扑
环境:IQ-9075 EVK(QCS9075,HTP V73,
soc_model=77),Ubuntu 24.04.4。
IQ-9075:8 核 Cortex-A78C r0p2,两个 cpufreq policy 各管 4 核,频率表完全相同(1267.2–2361.6 MHz,14 档),governor 为 schedutil。同构分簇,没有大小核之分。
SM8850:8 核 Oryon 自研核(CPU implementer 0x51,part 0x002),两簇:
| policy | 核 | 频率范围 | 档位 | governor |
|---|---|---|---|---|
| policy0 | cpu0-5 | 384 – 3628.8 MHz | 28 档 | walt |
| policy6 | cpu6-7 | 768 – 4396.8 MHz | 28 档 | walt |
6+2 布局,大核簇频率上限 4.4GHz。governor 是 walt(Window Assisted Load Tracking),高通自研,替代了 schedutil。温区 88 个,IQ-9075 是 62 个。CPU 相关温区按核拆到 cpu-0-x-y / cpu-1-x-y 粒度。
SM8850 设备截图(设备信息与 8 核同 part 0x002、implementer 0x51):
/proc/cpuinfo里 8 个核 part 全为 0x002、implementer 0x51(Qualcomm),从 CPU part 分不出大小核,cpufreq policy 的频率上限(3628.8 对 4396.8 MHz)才是区分依据。自研核不走 ARM 的 part 编号体系,按 part 值区分簇的做法在这颗芯片上不成立。
负载程序是同一段纯浮点循环(sqrt 迭代,-O2),taskset 绑核;采样每秒记录各 policy 的scaling_cur_freq和代表温区。两台机器脚本逻辑一致,只有 policy 数和温区编号不同,SM8850 采 zone24(cpu-1-0-0)、zone17(cpullc-1-0)、zone47(ddr);IQ-9075 采 zone1(cpu-1-0-0)、zone10(soc-therm)、zone14(xo-therm)、zone11(nsp)。
SM8850 的一个读数陷阱:cpu-hw-trip-0/1两个温区恒定显示 105000,那是硬件跳闸阈值不是实测温度,可以忽略。
IQ-9075:全核满载 120 秒,零降频
每段负载之间空转冷却,起始温度 42-43°C。
| 场景 | policy0 均值 | policy4 均值 | soc-therm 起→止 | cpu 温区峰值 |
|---|---|---|---|---|
| 空闲 60s | 1483 MHz | 1469 MHz | 42.6 → 42.7°C | 41.9°C |
| 单线程 60s | 2362 MHz | 1498 MHz | 42.7 → 42.8°C | 42.3°C |
| 全核 120s | 2357 MHz | 2362 MHz | 42.8 → 43.8°C | 45.5°C |
全核段 120 次采样,policy0 只有一次低于满频,出现在负载启动瞬间。policy4 全程钉在 2361.6 MHz。CPU 温区峰值 45.5°C,距 105°C 的 passive trip 还有约 60°C 余量。全部 cooling device 的cur_state全程为 0。A78C 全核满载的热负荷,在开放散热下推不到温控线。
SM8850:13 秒开始降频,稳态砍掉四成
同样的三段负载,结果完全不同。
| 场景 | policy0 均值 | policy6 均值 | cpu-1-0-0 起→止 | 峰值 |
|---|---|---|---|---|
| 空闲 60s | 3629 MHz | 883 MHz | 36.6 → 36.3°C | 42.4°C |
| 单线程 60s | 3629 MHz | 1027 MHz | 35.5 → 40.5°C | 43.2°C |
| 全核 120s | 3545 MHz | 3124 MHz | 48.6 → 65.2°C | 97.7°C |
全核段大核簇(policy6)的降频时间线:
| 时间 | freq6 | cpu-1-0-0 | cpullc-1-0 |
|---|---|---|---|
| 10s | 4397 MHz(满频) | 69.9°C | 73.8°C |
| 20s | 3974 MHz | 78.0°C | 82.2°C |
| 30s | 3648 MHz | 83.4°C | 88.0°C |
| 50s | 2880 MHz | 90.3°C | 94.9°C |
| 57-110s | 2669 → 2438 MHz | 90.3-96.9°C | 94.6-97.6°C |
负载加上后 10 秒内温度就从 48°C 冲到 70°C,第 13 秒出现第一次降频(4397 → 4339),随后按温度阶梯式回落,一分钟内大核从 4.4GHz 压到 2.67GHz,降幅 39%。之后在 2438-2669 MHz 区间稳住,温度稳在 90-97°C。小核簇 policy0 只从 3629 降到 3398-3514(降幅 3-6%),温控优先保小核,砍大核,符合「大核单位频率发热远高于小核」的调控逻辑。
实机采样片段(8 线程 taskset 绑核起压,随后每 5 秒一行):
这一段记录的是压到 40 秒后的收尾阶段:p6 从 3129.6 MHz 两步落到 2668.8 MHz 后稳住不动,而 cpu 温区仍在 86.9 → 91.5°C 缓升。频率不再降,说明此时已进入用户态温控选定的稳态工作点,降频量刚够让温升趋缓。
一个值得注意的细节:降频发生时 cpu 温区读数 90-97°C,低于 zone24 的 passive trip 105°C,内核 thermal 框架的 cooling device(cpufreq-cpu0/cpufreq-cpu6)cur_state全程为 0。也就是说这不是内核 trip 触发的降频,设备上跑着thermal-engine-v2和android.hardware.thermal-service.qti两个用户态温控服务,按更保守的策略(大概率以 skin 温区为主控)提前介入。内核 sysfs 里看不到降温动作的执行者。
两个用户态服务在跑(pid 1753 / 29888),而cpufreq-cpu0 cur=0 max=27、cpufreq-cpu6 cur=0 max=28,27/28 级降频档位一级都没启用。排查手机温控问题时只盯 trip point 和 cooling device,会找错方向。
对照
| 项 | 跃龙IQ-9075 EVK | 第五代骁龙8至尊版(参考机) |
|---|---|---|
| CPU | 8× A78C 同构 | 6+2 Oryon |
| 全核 120s 稳态频率 | 2362 MHz(满频) | 大核 2438-2669 / 小核 3398-3514 MHz |
| 大核降幅 | 0% | 39-45% |
| 首次降频时间 | 未发生 | 13s |
| CPU 温区峰值 | 45.5°C | 97.7°C |
| 降频执行者 | — | 用户态 thermal-engine-v2 |
两台设备的满载热负荷在触到温控线前能否被散掉,拆开看有两个因素叠加:
- 一是芯片功耗,SM8850 的 Oryon 大核冲 4.4GHz,单位时间发热高于 A78C @2.36GHz;
- 二是散热条件,IQ-9075 EVK 开放空气加大散热片,手机是密闭壳内被动散热。结果就是 IQ-9075 全核满载 120 秒 CPU 只到 45.5°C,距 105°C 的 passive trip 还有 60°C 余量。
对部署的含义:跑分或推理时延测试在 SM8850 这类设备上必须区分「冷机首帧」和「热机稳态」两种状态。大核稳态频率只有峰值的 55-61%,持续负载吞吐按冷机数据估算会高估近一倍;IQ-9075 EVK 上不存在这个问题。判断一台设备是否需要分开测,办法就是满载跑两分钟,看scaling_cur_freq有没有回落。
方法上的注意点
采样脚本里压测时长设为dur+5,比采样窗口长 5 秒,避免最后一秒负载先退出、频率回落污染数据。SM8850 全核段最后一个采样点 freq6=883 是负载已结束的正常回落,不计入稳态。
IQ-9075 空闲段 policy0 均值略高于 policy4,是后台服务(ssh、systemd)落在 cpu0-3 所致,两簇频率表相同,无性能差异。SM8850 空闲段 policy0 钉在满频 3629 也是同类现象(后台服务调度),walt 在轻载下倾向把任务集中到小核簇高频档运行。看空闲段的频率均值不能推断簇的性能差异,得看负载段。
两台设备都只在室温下测。IQ-9075 EVK 的「不降频」结论受散热条件保护:装进带外壳的产品形态,行为会向 SM8850 靠拢。负载类型也影响结果——本篇用的纯浮点循环主要压 CPU,若换成 GPU 或 NPU 重载(实际推理场景),功耗分布不同,降频时间线也会不同。