ARMv8-A架构和处理器
ARMv8-A架构
ARMv8‑A 架构是针对应用程序配置文件的最新一代 ARM 架构。 ARMv8 这个名称用于描述整体架构,现在包括 32 位执行状态和 64 位执行状态。它引入了使用 64 位宽寄存器执行的能力,同时保持与现有 ARMv7 软件的向后兼容性。
ARMv8‑A 架构引入了许多更改,可以设计出性能显着提高的处理器实现:
-
大物理地址(Large physical address) 这使处理器能够访问超过 4GB 的物理内存。
-
64 位虚拟寻址(64-bit virtual addressing) 这使虚拟内存超出 4GB 限制。这对于使用内存映射文件 I/O 或稀疏寻址的现代桌面和服务器软件很重要。
-
自动事件信号(Automatic event signaling) 这可以实现节能、高性能的自旋锁
-
更大的寄存器文件(Larger register files) 31 个 64 位通用寄存器可提高性能并减少堆栈使用。
-
高效的 64 位立即生成(Efficient 64-bit immediate generation) 对文字池的需求较少
-
较大的 PC 相对寻址范围(Large PC-relative addressing range) 一个 +/‑4GB 的寻址范围,用于在共享库和与位置无关的可执行文件中进行有效的数据寻址。
-
额外的 16KB 和 64KB 翻译颗粒(Additional 16KB and 64KB translation granules) 这降低了翻译后备缓冲区(TLB) 未命中率和页面遍历深度。
-
新的异常模型(New exception model) 这降低了操作系统和管理程序软件的复杂性。
-
高效的缓存管理理(Efficient cache management) 用户空间缓存操作提高了动态代码生成效率。使用数据缓存零指令快速清除数据缓存。
-
硬件加速密码学(Hardware-accelerated cryptography) 提供 3 到 10 倍更好的软件加密性能。这对于小粒度解密和加密非常有用,因为太小而无法有效地卸载到硬件加速器,例如 https。
-
加载‑获取、存储‑释放指令(Load-Acquire, Store-Release instructions) 专为 C++11、C11、Java 内存模型而设计。它们通过消除显式内存屏障指令来提高线程安全代码的性能。
-
NEON 双精度浮点高级 SIMD(NEON double-precision floating-point advanced SIMD) 这使得 SIMD 矢量化能够应用于更广泛的算法集,例如科学计算、高性能计算(HPC) 和超级计算机。
ARMv8‑A 处理器属性
ARMv8‑A 处理器
Cortex-A53
Cortex‑A53 处理器是一款中档、低功耗处理器,在单个集群中具有一到四个内核,每个内核都有一个L1 缓存子系统、一个可选的集成 GICv3/4 接口和一个可选的 L2 缓存控制器。
Cortex‑A53 处理器是一款非常节能的处理器,能够支持 32 位和 64 位代码。
SCU 是 "System Cache Unit"(系统缓存单元): 用于管理和控制多核处理器系统中的 L2缓存 的关键组件之一。
- 协调缓存一致性: 在多核处理器系统中,不同核心可能同时访问相同的内存区域。SCU 负责确保各个核心之间的缓存一致性。
- 缓存控制: SCU 可以用于控制缓存的工作模式,如使能或禁用缓存、设置缓存大小和缓存行的方式等。
- 性能优化: SCU 也可以用于优化缓存性能。例如,它可以通过缓存预取(cache prefetching)来提前加载可能被访问的数据,以减少访问延迟。
- 能源效率: SCU 还可以与功耗管理技术结合使用,以帮助降低系统的能源消耗。
ACP(Accelerator Coherency Port): ACP 是一个处理器内部组件,用于处理器核心与加速器之间的高速数据传输和一致性管理。它通常用于处理器与外部加速器(如图形处理器、数字信号处理器等)之间的通信。
Cortex‑A53 处理器具有以下特性:
- 有序的八级流水线。
- 通过使用分层时钟门控、电源域和高级保留模式来降低功耗。
- 通过重复执行资源和双指令解码器提高双发能力。
- 功耗优化的二级缓存设计可提供更低的延迟并在性能与效率之间取得平衡。
Cortex-A57
Cortex‑A57 处理器具有以下特性:
-
乱序,15+阶段流水线。
-
省电功能包括路径预测、标记减少和缓存查找抑制。
-
通过重复执行资源增加峰值指令吞吐量。具有本地化解码、3 宽解码带宽的功率优化指令解码。
-
性能优化的 L2 缓存设计使集群中的多个核心可以同时访问 L2。
ARMv8寄存器
AArch64执行状态提供了32个 64 位通用寄存器,每个AArch64 64位通用寄存器(X0-X31)也具有32位(W0-W31)形式。如下所示:
其他的特殊寄存器
SPSR寄存器
N 负数标志位,如果结果为负数,则N=1;如果结果为非负数,则N=0。
Z 零标志位,如果结果为零,Z=1,否则Z=0。
C 进位标志位
V 溢出标志位
向量寄存器
A64指令集
<prefix><op><flag><suffix> Vd.T, Vn.T, Vm.T <cond>
prefix:
- Q:饱和度转换
- D:运算结果加倍
- H:运算结果减半
- R:四舍五入
- S:有符号整数
- U:无符号整数
- F:浮点数
- P:多项式系数
op:
- 算术和逻辑运算。
- 移动和位移操作。(注意ASR算数右移操作,保留符号位,用于有符号整数)
- 符号和零扩展的指令。
- Bit和bitfield操作。
- 有条件比较和数据处理。
suffix:
- P:成对计算
- V:归约
- H:运算结果,每通道取高半部分
- L:运算结果位数扩大
- W:操作数一个位数大,一个位数小
- N:运算结果位数减小
- 2:对寄存器高半部分进行计算
flag:
- S:更新标志位,如 ADDS
cond: 条件码
建议开发时使用intrinsics开发,内联函数可以实现跨平台