5

ARM Cortex-A77微架构

 2 years ago
source link: https://iamywang.github.io/2021/arm-micro/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x01 A77架构图

1.png

指令执行流程

取指令(L1指令缓存 and 分支预测) -> 译码(4路 译码为MOP) -> 指令分派(MOP转为µOP) -> 指令发射(不同的队列) -> 执行(乱序)

0x02 前端(Front-end)

取指(Instruction Fetch)

取指单元包括:64KB 4路组相联L1指令缓存,全相联L1指令TLB,1.5K 4路L0 MOP缓存,动态分支预测器(BPU)。每个周期,从L1指令缓存中获取最多32个字节。指令获取与分支预测器协同工作,以确保指令流不断准备好被获取。返回堆栈(Return Stack),在分支上存储地址和指令集状态,在返回时返回堆栈将弹出。

L1指令缓存支持可选的奇偶校验保护,并实现了一个伪LRU缓存替换策略,同时有一个来自L2缓存的256位读取接口,每个周期最多有16个字节可以从共享的L2缓存转移到L1指令缓存中。

分支预测单元的任务是保持指令流输入,它与指令获取脱钩,能够提前运行并与指令获取并行以隐藏分支预测延迟。可预测指令包括条件分支、无条件分支、与过程调用和返回指令相关的间接分支、A32和T32状态之间切换的分支;不可预测指令包括异常返回指令(如ERET)。BPU利用一个64个Entry的micro-BTB和一个更小的64个Entry的nano-BTB等三个部分来减小延迟。

译码(Instruction Decode)

译码单元支持A32、T32和A64指令集,同时也支持每个指令集中的ASMID和浮点指令。指令获取后,每个周期最多有4条32位指令或者8条16位指令被送到译码队列(Decode Queue)。在译码操作的每个周期中,最多可以有4条指令被译码成相对MOP,平均来说,MOP的数量比指令多6%。在这个操作中总共涉及两个周期,一个用于对齐,一个用于译码。

0x03 执行引擎(Execution Engine)

2.png

重命名(Rename)

寄存器重命名单元执行寄存器重命名。从前端来看,每个周期最多接收6个MOP用于重命名,A77具有处理多达160条指令的能力,ARM公司认为增加大约10%的重排缓冲区会使性能提高1~1.25%。MOP会被分解成µOP(微操作)并被安排执行,µOP会比MOP多大约20%。

指令分派(Dispatch)

译码后的指令会被分发到对应的发射队列,即µOP被送到指令发射模块,并且会被排在八个独立的发射队列中(共有120个条目)。每个周期最多处理6个MOP,每个周期最多可以分派10个µOP,对每种类型的µOP同时分派的数量有以下限制:

流水线单元 符号 限制(微操作)
Branch 0/1、Integer single Cycle 0/1 B、S 4
Integer single/multicycle 0/1 M 4
Integer multicycle 0 M0 2
Load/Store 0/1 L 4
Store data 0/1 D 4
FP/ASIMD 0 V0 2
FP/ASIMD 1 V1 2

如果在给定的周期内,所需要分派的µOP超过了限制,那么将会按照oldest to youngest age-order顺序分派(类似FIFO)。

在ARM处理器的软件优化手册中,将汇编指令分为以下类型进行分析执行所需的时钟周期以及占据的流水线单元:

Branch instructions,Arithmetic and logical instructions,Move and shift instructions,Divide and multiply instructions,Saturating and parallel arithmetic instructions,Miscellaneous data-processing instructions,Load instructions,Store instructions,FP data processing instructions,FP miscellaneous instructions,FP load instructions,FP store instructions,ASIMD integer instructions,ASIMD floating-point instructions,ASIMD miscellaneous instructions,ASIMD load instructions,ASIMD store instructions,Cryptography extensions,CRC。

发射(Issue)

指令发射单元控制译码后的µOP何时被分配到执行流水线上,它包括用于存储待分配到执行流水线的指令发射队列。指令发射的宽度是12路并且是乱序发射的,即每个周期最多执行12个µOP(10个到执行单元,2个到存储数据点)。发射队列可以分为三个类别:整数发射(Integer)、浮点数发射(FPU)和存取单元发射(LSU)。

执行(Execute)

整数执行单元,执行算术和逻辑数据运算操作。

矢量执行单元,执行ASIMD和浮点数运算操作。也可以执行加密操作。

指令组 指令
Branch 0/1 分支µOP
Integer single Cycle 0/1 整数ALU运算µOP
Integer single/multicycle 0/1 整数移位、乘法、除法,CRC,绝对差求和µOP
Load/Store 0/1 加载、存储地址生成和特殊内存µOP
Store data 0/1 存储数据µOP
FP/ASIMD 0 ASIMD ALU、misc、整数乘法,FP转换、misc、加法、乘法、除法、平方根,存储数据,加密µOP
FP/ASIMD 1 ASIMD ALU、misc、移位,FP misc、加法、乘法,存储数据,加密µOP

0x04 内存子系统(Memory Subsystem)

L1 Instruction Memory System

L1指令存储器系统向译码单元提供指令流,为了提高性能和减小功耗,采用了动态分支预测和指令缓存。其中包括:分支目标缓冲区(BTB),保存以前所做分支的目标地址;分支方向预测器,使用以前的分支历史;返回栈(Return Stack),嵌套子程序返回地址的栈;静态分支预测器;间接分支预测器。

L1 Data Memory System

L1数据存储器系统执行加载和存储指令,加载-使用延迟最快为4个周期。它还为内存一致性请求提供服务。存储/加载单元(LSU)包括:64KB 4路组相联L1数据缓存(每32位数据可选的ECC保护),全相联L1数据TLB(支持4KB、16KB、64KB、2MB和512MB页面大小)。

L2 Memory System

L2存储器系统为L1缓存(数据缓存、指令缓存)未命中的情况提供服务,L2严格包括L1数据缓存,不包括L1指令缓存,加载-使用延迟最快为9个周期。L2存储器系统包括:8路组相联L2缓存,大小可配置为128KB,256KB或512KB,每64位数据可选的ECC保护;关联DynamIQ共享单元(DSU)的接口,可在实施时配置为同步或异步操作。

L3 Cache

L3缓存由所有内核共享,可配置的大小为2 MB到4 MB,加载-使用延迟为26到31个周期。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK