Cortex-A53 是顺序执行的还是乱序执行的?
CA53 是顺序执行(in-order)的流水线。
The Cortex-A53 processor is Arm’s first Armv8-A processor aimed at providing power-efficient 64-bit processing. It features an
in-order
, 8-stage,dual-issue
pipeline, and improved integer, Neon, Floating-Point Unit (FPU) and memory performance.
CA53既然是顺序执行的流水线,那么还需要 memory barrier 做什么用?
顺序流水线
指的是处理器按照它们在内存中出现的顺序发出指令(issue
)。下一条指令不会早于上一条指令发出。 dual-issue pipeline
意味着处理器可以同时发出2条指令。
乱序流水线
指的是处理器可以不按照指令在内存中的顺序发出(issue
)指令。
简单而言,一条指令的执行需要经过取指(fetch
)、解码(decode
)、发出(issue
)。每条指令按照内存中的顺序解码(decode
),并按序存储在指令解码缓冲区中(即中央窗口(?
))。但是从解码缓冲区中的提取(即发出(issue
))可能不是按顺序进行的。
对于顺序流水线
,是按序发出的,但是对于乱序流水线
,可能就不是按序发出的了。
所以,不管是顺序还是乱序,指的都是issue
的顺序。
fetch
decode
issue
内存访问顺序
(memory ordering
)指的是内存访问的顺序。即使在顺序流水线
中,多条指令按序发出内存请求,但是响应请求的顺序却可能是不同的。
举个例子:
LDR x1, [x2]
LDR x3, [x4]
ADD x5, x3, x3
在顺序流水线
中,这些指令是按序发出。即,第二行指令不会在第一行指令之前发出;第三行指令也不会在第二行指令之前发出。如果支持 multi-issue pipeline,则某些指令可能同时发出,但也不会提前于前面的指令发出。
第二条LDR
指令与第一条LDR
指令无依赖性,假设读取x2
所指向的内存地址发生cache miss
,这条指令执行的就会比较久,此时第二条LDR
指令就不必等到第一条LDR
指令执行完就可以开始执行(issue
),此为“内存乱序
”。而第三行的ADD
指令依赖于前一条LDR
,所以它必须要等到前一条指令完成之后才可以执行。
在 cache miss 的情况下,内存乱序
可以极大地改善系统性能。
内存屏障
(memory barrier
)是为了防止某些不符合预期的内存乱序。
上图也很好地说明了顺序流水线中的乱序执行,MOV
指令访问R1
所指向的内存耗时较久,ADD
指令无需等到MOV
指令执行完,直接进入E
(Execution
,或者叫Issue
)阶段。可见乱序执行节省了流水线停顿(Pipeline Stall
)的时间。
Reference
- Cortex-A53简介
- Barriers in in-order cores like cortex-A53, A7
- CPU乱序执行原理
- Out-of-Order Architectures
- Pipeline and out-of-order instruction execution optimize performance