在当今数字化飞速发展的时代,系统开发人员扮演着关键的角色,设计和开发各种应用程序和系统,以满足日益增长的技术需求。然而,尽管软件开发的创新不断推动着技术的前进,但许多开发人员却在硬件的核心领域——芯片技术上感到陌生。特别是在众多移动设备、嵌入式系统和服务器中,芯片的性能和架构对于软件的优化和性能至关重要。
遗憾的是,当前许多系统开发人员缺乏对芯片基础知识的深入了解,不清楚如何正确地解读和利用芯片的性能特性。其中一个常见的困惑是,如何理解和区分芯片中的大小核心架构,以及如何在不同负载情况下充分利用这些核心。
在本文中,我们将初步了解一下芯片的基础知识,特别是关注其中一个重要概念——大小核心。我们将以具体的例子,如天机900芯片,为案例,详细探讨其CPU架构和性能特点,帮助开发人员更好地理解如何看待和利用芯片中的大小核心。
芯片官网
以天机900为例:
在官网的介绍为:8核心,64位处理器, 大核主频 2.4GHz(2400 000), 小核心主频2Ghz(2000 000)。
通过官网介绍,是比较直接的了解,芯片厂商一般也会在对应的CPU节点中按照规范,写入具体的信息。
cpuinfo节点
一般芯片会在对应的标准节点proc/cpuinfo
中写入具体的编号信息,了解这些信息对于开发和调试应用程序时了解设备的硬件性能和特性非常有用。以下是一些常见的属性和其含义:
-
processor: 指示CPU的处理器编号。多核设备上,你会看到多个"processor"条目,每个对应一个CPU核心。
-
vendor_id: 表示CPU制造商的标识符,例如"ARM"或"Intel"。
-
cpu family: 描述CPU系列或家族的信息。
-
model: 指示CPU型号的标识符。
-
model name: 提供CPU型号的人类可读的描述。这通常包括CPU架构、型号和频率等信息。
-
stepping: 表示CPU步进的信息,通常用于指示CPU的特定版本。
-
microcode: 指示CPU微码版本的信息。
-
cpu MHz: 指示CPU的时钟频率,以兆赫兹(MHz)为单位。
-
cache size: 提供CPU缓存大小的信息,包括L1、L2和L3缓存。
-
physical id: 如果系统具有多个物理CPU,此属性标识物理CPU的编号。
-
siblings: 指示与当前CPU核心位于同一物理CPU上的兄弟核心数量。
-
core id: 如果系统支持超线程或多核心,此属性指示当前核心的编号。
-
cpu cores: 指示物理CPU上的核心数量。
-
flags: 列出了支持的CPU特性和指令集。这些特性对于开发者来说可能很重要,因为它们决定了应用程序能够利用的指令集。
-
bogomips: 衡量CPU性能的虚拟指标。这个值不是实际性能的准确度量,但可以用来比较不同CPU的性能。
-
Features: 通常在这里列出了CPU的特性,如浮点运算单元、NEON指令集(对于ARM架构)等。
在Android设备上,通过执行adb shell cat /proc/cpuinfo
能看到如下的信息:
processor : 0 // cpu0 小核心
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x2
CPU part : 0xd05 // Cortex-A55 架构
CPU revision : 0
// ... 省略 cpu[1-7] 信息
processor : 7 // cpu7 大核心
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x1
CPU part : 0xd41 // Cortex-A78 架构
CPU revision : 0
// 其他硬件信息
和服务器和嵌入式设备的信息可能有略微差异,但大致还是一样的。
-
cpu part: 描述CPU的部分号,它通常用于标识CPU系列或架构的具体变种。例如,在ARM架构中,不同的部分号代表不同的ARM核心变种。
-
cpu variant: 提供有关CPU变种的信息,通常与部分号一起使用以更具体地标识CPU。
-
cpu architecture: 提供CPU的架构信息,通常以数字或架构名称(如ARMv7或ARMv8)表示。
ARM核心的组成
ARM CPU 架构由以下几个关键组成部分构成:
-
指令集架构(ISA):ARM CPU 架构的核心是其指令集架构。ARM的指令集是RISC(精简指令集计算机)架构,这意味着它的指令集被设计得非常简洁,以提高执行效率。ARM的指令集包括了多个版本,如ARMv7、ARMv8等,每个版本具有不同的特性和扩展。
-
处理器核心:ARM处理器核心是CPU的核心部分,负责执行指令和算术运算。ARM提供了各种不同的处理器核心,从较简单的嵌入式核心到高性能的服务器核心。常见的ARM核心包括Cortex-A系列(用于应用处理)、Cortex-R系列(用于实时处理)和Cortex-M系列(用于嵌入式系统)。
-
寄存器文件:ARM CPU 包含一组寄存器,用于存储临时数据、地址和控制信息。这些寄存器通常包括通用寄存器、特殊用途寄存器(如程序计数器和状态寄存器)以及浮点寄存器(用于浮点运算)。
-
内存管理单元(MMU):MMU负责将虚拟内存地址映射到物理内存地址,并执行内存访问控制。它允许多个程序同时运行,每个程序都拥有自己的虚拟地址空间,提高了系统的安全性和稳定性。
CPU part
通过如上的节点信息可以看到
CPU part
这个属性对应的信息为CPU的核心的标准定义。
CPU part : 0xd05 // Cortex-A55 架构
- 以
0xd05
为例
如何通过 Part Num:0xd05
来查询到具体的核心信息呢? 我们可以通过 ARM 的官网,可以直接检索0xd05
,然后搜索结果中找到该核心对应的主ID寄存器(Main ID Register, MIDR) 相关的描述,比如 A55架构 核心的描述如下:
developer.arm.com/documentati…
通过主ID寄存器了解到对应的基本架构描述后,也可以找到对应A55的架构图:
developer.arm.com/Processors/…
要找到对应ARM核心架构,可以通过如下URL构造方式:
https://developer.arm.com/Processors/Cortex-{ARM架构名}
即cpu 0 - 3 为 Cortex-A55 架构,为小核心 cpu 4 - 7 为 Cortex-A78 架构,为大核心
手机设备的话,有一些属性也会对此有一些描述,比如dalvik.vm.isa.arm.variant
adb shell getprop | egrep "(ro.board|ro.product.cpu|arm.variant)"
[dalvik.vm.isa.arm.variant]: [cortex-a55]
[ro.board.platform]: [mt6877]
[ro.product.cpu.abi]: [arm64-v8a]
[ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: [arm64-v8a]
ARM Cortex-A55 介绍
通过如上核心架构信息后,如果有一些新出来的芯片,可以通过描述和架构一起了解,这种理解会更为深刻。 ARM Cortex-A55 是 ARM 架构中的一种低功耗、高性能的 64 位处理器核心。它是 ARMv8-A 架构的一部分,通常用于移动设备、嵌入式系统和物联网设备等领域。以下是 ARM Cortex-A55 处理器核心的主要特点:
-
架构: Cortex-A55 使用 ARMv8-A 64 位指令集架构,支持 64 位应用程序和操作系统。它也兼容 ARMv7-A 32 位架构,可以运行 32 位应用程序。
-
性能: Cortex-A55 是 ARM 的低功耗、高效能处理器核心之一。它旨在提供良好的性能和能效平衡,适用于多种应用场景。
-
多核支持: Cortex-A55 可以以多核方式运行,允许多个核心在同一芯片上并行执行任务,提高了多线程应用程序的性能。
-
低功耗: 这个核心设计注重节能,通常用于需要延长电池寿命的移动设备。它具有精细的电源管理功能,可以动态调整电压和频率,以在需要时提供更高的性能,而在不需要时降低功耗。
-
Out-of-order 执行: Cortex-A55 支持乱序(Out-of-order)执行,这意味着它可以在不按指令顺序执行的情况下提高指令执行的效率。
-
浮点性能: Cortex-A55 支持浮点运算,可以用于处理需要浮点运算的应用程序,如图形处理和科学计算。
-
安全性: 这个核心还支持 ARM 的 TrustZone 技术,用于增强系统的安全性。
-
缓存: Cortex-A55 通常会与高速缓存一起使用,包括 L1、L2 和 L3 缓存,以提高访问内存的速度。
CPU主频相关信息
一般芯片会组成多种核心,通过了解芯片的核心架构后,在通过查看不同核心对应的最大主频,主频越大,说明单位时间内可计算量越大,通过对比CPU的主频,也能区分出大小核心。
- Cortex-A55 架构, cpu0 小核心的主频
# 支持的主频范围
➤ adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
2000000 1903000 1800000 1703000 1600000 1503000 1407000 1310000 1260000 1150000 1053000 980000 900000 740000 650000 500000
# 最大主频
➤ adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
2000000
# 最小主频
➤ adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
500000
即最大主频对应宣传页面中的 Up to 2GHz
- Cortex-A78 架构, cpu7 大核心的主频
# 支持的主频范围
➤ adb shell cat /sys/devices/system/cpu/cpu7/cpufreq/scaling_available_frequencies
2400000 2320000 2240000 2150000 2000000 1900000 1800000 1660000 1540000 1430000 1300000 1140000 1040000 910000 740000 650000
# 最大主频
➤ adb shell cat /sys/devices/system/cpu/cpu7/cpufreq/cpuinfo_max_freq
2400000
# 最小主频
➤ adb shell cat /sys/devices/system/cpu/cpu7/cpufreq/cpuinfo_min_freq
650000
即最大主频对应宣传页面中的 Up to 2.4GHz
主ID寄存器(Main ID Register, MIDR)
Linux 启动加载过程中,会将 MIDR(Main ID Register)中的信息加载到寄存器中,MIDR 为内核驱动提供CPU核心的相关的标识信息,包括设备的CPU实现厂商的标识ID(cpu implementer) 和 CPU重构ARM架构的标识ID(cpu variant)等,MIDR 是一个 32 位寄存器,是标识寄存器功能组的一部分。 该寄存器是只读的,结构如下:
-
实现该架构的编号(Implementer), [31:24]
- 0x41 ASCII character 'A' - 表示该CPU架构的实现为 ARM
-
Variant, [23:20] cpu的变体编号
- 0x1 r1p0.
-
Architecture, [19:16]
- 0xF Defined by ID registers.
-
PartNum, [15:4] 主要部件的编号
- 0xd03
Cortex-A53
core - 0xD05
Cortex-A55
core. - 0xD0A
Cortex-A75
core. - 0xD41
Cortex-A78
core
- 0xd03
-
Revision, [3:0] the minor revision number of the core.
- 0x2 r1p2.
- 0x1 r3p1.
- 0x0 r1p0.
以如下 8 核心的CPU架构为例,通过查看 cpu part
可以发现组成结构为: cpu processor 0-3 是Cortex-A55
,CPU 4-7,如下图中 Systrace 中就是按照这个排列的
ARM Cortex-A55是一个基于ARMv8.2-A64位指令集架构设计的中央处理器以及ARM内核。由安谋控股旗下剑桥设计中心的剑桥团队设计。ARM Cortex-A55拥有两条超标量乱序执行解码流水线[2]。 zh.m.wikipedia.org/zh/ARM_Cort…
ARM Cortex-A75是一個基於ARMv8.2-A64位指令集架構設計的中央處理器以及ARM內核。由安謀控股旗下索菲亞設計中心的索菲亞團隊設計。ARM Cortex-A73擁有三條超純量亂序執行解碼流水線[1] zh.m.wikipedia.org/zh/ARM_Cort…
- 其他芯片示例
mt6765:由 8个 cortex-a53 核心组成,最大2.3GHz信息
CPU 负载
- uptime
08:26am up 7 min, 2 users, load average: 0.17, 0.16, 0.12
# load average:0.17, 0.16, 0.12。
# 最近1分钟、5分钟和15分钟的平均负载为0.17、0.16和0.12。
CPU温度
在现代计算机系统和移动设备中,芯片温度管理是一个至关重要的方面。CPU(中央处理器)是这些设备的心脏,负责执行计算任务,而它的温度可以对系统的性能、稳定性和寿命产生深远的影响。
读取手机CPU信息获取温度,我们需要获取的是手机CPU内核(thermal)的信息,CPU温度数据通常存储在/sys
目录下的特定文件中。通过读取这些文件,用户和开发人员可以轻松地获取CPU温度的实时数据。
CPU温度的重要性在于以下几个方面:
- 性能管理:高温度可能导致CPU降频,以避免过热。了解CPU温度可以帮助开发人员优化应用程序,以在高负载情况下减少热量产生。
- 稳定性:过高的温度可能导致系统崩溃或不稳定。通过监控温度,可以及早发现并解决潜在的热问题。
- 寿命:长期高温操作可能缩短CPU的寿命。通过保持适当的温度管理,可以延长硬件的使用寿命。
- 能效:在适度温度下工作的CPU通常更能保持高效率。因此,了解并维护适当的温度对于能效至关重要。
应用开发
在早期的NDk开发中,系统CPU调度在【userspace】用户模式下,可以自行定义调度的方式,通过调用大核来处理运算逻辑,提高运算速度,但是到了现在,CPU相关调度也一直在变化,基本很难有应用操作的空间,Android操作系统会根据当前设备的负载和性能需求来动态管理CPU核心的使用,也是为了优化系统性能和电池寿命。
然而,如果你希望在应用程序中实现一些与CPU核心切换相关的优化或控制,你可以考虑以下几种方法:
-
线程优化: 使用多线程来执行应用程序中的不同任务。Android提供了Thread类和AsyncTask类等工具来管理线程。Android会根据系统负载和可用核心来分配线程的执行。你可以使用线程池来管理线程,以便更好地控制任务的执行。
-
CPU亲和性: 在某些情况下,你可以尝试设置线程的CPU亲和性,以指定线程在特定核心上执行。但请注意,这需要特定的权限,并且不是在所有设备上都可用。要使用CPU亲和性,你可以使用
Process.setThreadAffinityMask()
方法。 -
NDK开发: 如果你有特殊的性能需求,可以考虑使用Android NDK(Native Development Kit)来开发一些原生代码。这样,你可以更精细地控制线程和CPU核心的使用。
-
性能分析工具: 使用Android Studio等性能分析工具来监视应用程序的性能,并根据监测结果进行优化。这些工具可以帮助你了解应用程序在不同核心上的执行情况,并找出潜在的性能瓶颈。
总之,Android应用程序通常不需要直接控制CPU核心的切换,因为操作系统会根据需要自动处理。你可以通过合理的多线程设计和性能优化来确保你的应用在不同设备上都能够高效运行。如果你有特殊的性能需求,可以考虑使用一些高级技术来更精细地控制CPU核心的使用。
参考
- Arm Cortex-A75 内核技术参考手册 r3p1
- ARM Cortex-A55 内核技术参考手册 r1p0
- Arm® Cortex-A78 Core Technical Reference Manual
- How L1 and L2 CPU Caches Work, and Why They’re an Essential Part of Modern Chips
- baijiahao.baidu.com/s?id=171981…
- www.geeksforgeeks.org/whats-diffe…
- www.lighterra.com/papers/mode… kernel.googlesource.com/pub/scm/lin…