ARM의 MOP 캐시, 왜 넣었다가 다시 뺐을까
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
🧩 MOps와 MOP 캐시 — ARM 프론트엔드가 넣었다 뺀 한 시대의 최적해
CPU 마이크로아키텍처 · ARM Cortex 시리즈 심층 해설
ARM CPU 문서를 따라가다 보면 Cortex-A76~A77 세대를 기점으로 "MOps(Macro-Operations)"라는 용어와 "MOP Cache"라는 구조물이 공식 문서에 등장한다. 그리고 불과 몇 년 뒤 ARM은 이 구조를 슬그머니 다시 제거한다. RISC라서 디코드가 단순하다는 ARM이, 왜 디코드 결과를 캐싱하는 구조를 넣었다가 뺐을까? 이 글은 그 모순처럼 보이는 흐름을 명령어 처리 계층의 관점에서 풀어낸다.
🧠 한눈에 — MOp는 ARM이 "원시 명령어"와 "최종 실행 단위 µOp" 사이에 둔 중간 표현이다. MOP 캐시는 이 중간 표현을 저장해 디코드 단계를 통째로 건너뛰는 장치였다. 2019년 정점을 찍고 2024년 세대에서 사실상 은퇴했다.
📚 세 계층: 명령어 → MOp → µOp
현대 고성능 CPU는 명령어를 "가져와서 곧장 실행"하지 않는다. 메모리에서 실행 유닛까지 오는 동안 여러 단계의 변환을 거친다. ARM 공식 커뮤니티 포럼에서 ARM 엔지니어는 두 용어를 이렇게 정의한다.
▶ MOps(매크로 연산): 아키텍처가 정의한 명령어. 어셈블리로 쓰거나 컴파일러가 생성하는 바로 그 명령어다.
▶ µOps(마이크로 연산): 프로세서가 실행 도중 내부적으로 만드는 최소 실행 단위. 프로그래머에게는 보이지 않는다.
Cortex-A78 기준으로 프론트엔드 파이프라인은 다음 계층을 흐른다.
graph TD
A[L1 I-Cache
원시 명령어] --> B[Decode
디코드]
B --> C[MOps
중간 표현]
C --> D[MOP 캐시
저장]
D --> E[Rename
µOps 분리]
E --> F[실행 유닛
ALU·LS·FP]
style A fill:#eaf2f8,stroke:#2980b9
style B fill:#fef9e7,stroke:#f39c12
style C fill:#e8f8f5,stroke:#16a085
style D fill:#eafaf1,stroke:#27ae60
style E fill:#fef9e7,stroke:#f39c12
style F fill:#f4ecf7,stroke:#8e44ad
🔗 다이어그램 요약: ARM 프론트엔드는 I-Cache의 원시 명령어를 디코드해 MOps라는 중간 표현으로 바꾸고, 이를 MOP 캐시에 저장한 뒤 Rename 단계에서 다시 µOps로 분리해 실행 유닛으로 보낸다. MOp는 명령어와 µOp 사이의 중간 레벨이다.
핵심은 MOp ≈ 명령어(거의 1:1.06) 수준의 상위 추상화라는 점이다. Cortex-A78은 명령어 4개를 디코드하면 평균 6개의 MOp를 만든다(명령어 대비 약 6% 많음). 각 MOp는 이후 다시 1~2개의 µOp로 분리되며, 진짜 최소 실행 단위는 µOp다.
CISC와 RISC, 출발점이 다르다
| 구분 | CISC (x86) | RISC (ARM AArch64) |
|---|---|---|
| 명령어 길이 | 가변 (1~17바이트) | 고정 4바이트 |
| 디코드 난이도 | 매우 높음 (경계·피연산자 모드 분석) | 단순 (경계 문제 없음) |
| 내부 분해 | 명령어 → 1~4 µop (1995 P6부터) | 명령어 ≈ MOp → 1~2 µop |
x86은 복잡 명령어를 그대로 실행하는 게 비효율적이라 P6 마이크로아키텍처부터 명령어를 µop으로 분해해 내부적으로 RISC처럼 실행해 왔다. 반면 ARM은 이론상 그런 분해가 거의 불필요하다. 그런데도 MOps라는 중간 계층을 둔 이유 — 여기서부터가 본론이다.
🕰️ 등장 배경 — x86이 먼저 두 번 실험했다
ARM이 MOP 캐시를 도입하기 전, x86 진영은 이미 "디코드 결과를 저장하자"는 아이디어를 두 차례 실험했다. ARM의 MOP 캐시는 이 흐름의 후발 주자다.
▶ Pentium 4 Trace Cache (2000) — 디코드된 µop을 순서대로 저장한 선구적 구조. 분기 예측 실패 시 무효화 비용이 커 Core 마이크로아키텍처에서 폐기.
▶ Intel Sandy Bridge µop Cache (2011) — 약 1.5K µop 규모의 Decoded ICache. 핫 코드에서 무거운 x86 디코드를 우회. Ivy Bridge·Haswell까지 계승.
▶ AMD Zen Op Cache (2017) — Zen에서 첫 µop 캐시 도입. "성능뿐 아니라 전력도 절감"이라고 문서화.
ARM의 행보는 한 박자 늦게, 그러나 빠르게 진행됐다. Cortex-A76(2018)에서 씨앗을 심고 A77(2019)에서 개화한다.
🏗️ MOP 캐시의 구조 — I-Cache와 직렬 계층
가장 흔한 오해부터 정리하자. MOP 캐시는 I-Cache와 병렬 대안이 아니라, I-Cache 하위의 직렬 계층이다. I-Cache 히트 후 디코드된 MOp가 MOP 캐시를 채우고, 같은 코드를 재실행할 때 디코드 단계를 건너뛴다.
| 항목 | L1 I-Cache | MOP Cache |
|---|---|---|
| 저장 내용 | 원시 명령어 바이트 | 디코드된 MOps |
| 위치 | Fetch 단계 (상류) | 디코드 직후 |
| 히트 효과 | 메모리·상위 캐시 접근 회피 | 디코드 단계 우회 |
| A78 규모 | 64KB | 1.5K MOp 엔트리 |
두 경로를 의사결정 흐름으로 보면 다음과 같다.
flowchart TD
A([명령어 페치]) --> B{MOP 캐시
히트?}
B -->|YES| C[디코드 우회
약 1사이클 단축]
B -->|NO| D[I-Cache → Decode
MOP 캐시 채움]
C --> E([Rename / 실행])
D --> E
style A fill:#3498db,stroke:#2980b9,color:#ffffff
style B fill:#fef9e7,stroke:#f39c12
style C fill:#eafaf1,stroke:#27ae60,color:#1e8449
style D fill:#fdedec,stroke:#e74c3c,color:#c0392b
style E fill:#3498db,stroke:#2980b9,color:#ffffff
🔁 다이어그램 요약: 명령어 페치 후 MOP 캐시가 히트하면 디코드를 완전히 우회해 약 1사이클을 단축하고, 미스면 I-Cache→Decode로 폴백하며 그 결과로 MOP 캐시를 채운다. 두 경로 모두 Rename/실행으로 합류한다.
AndroidAuthority의 Cortex-A78 분석에 따르면 MOP 캐시는 다양한 워크로드에서 높은 히트율을 보인다. 핫 루프·빈번 함수 같은 반복 코드에서 디코드 단계가 거의 활성화되지 않아 전력 절감 효과가 크다.
한편 ARM은 I-Cache에 순수 원시 바이트가 아니라 predecode 메타데이터를 덧붙인 중간 형식으로 명령어를 담는다(A76~X1 세대는 약 36~40비트 형식). 이 predecode가 풀 디코드 비용을 줄이고, MOP 캐시는 한 발 더 나아가 디코드 자체를 건너뛴다. 이 둘의 역할 중복이 훗날 MOP 캐시 철수의 복선이 된다.
📊 세대별 변천 — 정점과 철수
ARM 코어 세대별 MOP 캐시 유무와 규모를 정리하면, 2019~2021년이 정점이고 2022년부터가 철수 국면임이 한눈에 드러난다.
| 코어 | 연도 | MOP 캐시 |
|---|---|---|
| Cortex-A76 | 2018 | 없음 (퓨전만) |
| Cortex-A77 | 2019 | 1.5K 최초 도입 |
| Cortex-A78 | 2020 | 1.5K |
| Cortex-X1 | 2020 | 3K (2배 확장) |
| Neoverse V1 | 2021 | 3K (8 MOp/사이클) |
| Cortex-X3 | 2022 | 1.5K로 축소 |
| Cortex-A715 | 2022 | 제거 |
| Cortex-X925 / A725 | 2024 | 제거 (predecode 통합) |
엔트리 규모만 막대로 비교하면 X1·V1 세대의 3K가 어떻게 솟았다가 다시 내려앉는지 더 직관적이다.
🔍 같은 구조, 다른 목적 — x86 µop 캐시 vs ARM MOP 캐시
겉모습은 닮았지만 두 진영의 도입 동기는 정반대에 가깝다.
💼 x86의 동기 — "복잡한 디코드 자체를 피하려고"
가변 길이 명령어의 경계 찾기, 피연산자 모드 파악, 1~4 µop 분해는 매 사이클 막대한 에너지·면적을 먹는다. µop 캐시는 이 무거운 디코더를 핫 코드에서 통째로 건너뛰기 위한 장치다.
🧠 ARM의 동기 — "디코드는 가벼우나 다른 이득이 있어서"
① 모바일 전력 절감, ② 퓨전된 MOp 재사용, ③ 리네임 직전 약 1사이클 단축으로 분기 회복 가속, ④ 프론트엔드 처리량 증대(4명령어/사이클 → 6 MOp/사이클).
| 개념 | ARM | Intel | AMD |
|---|---|---|---|
| 디코드 후 저장 | MOP Cache | µop Cache | Op Cache |
| 저장 단위 | MOps (1:1.06) | µops (1~4) | µops |
| 도입 시기 | 2019 | 2011 | 2017 |
핵심 차이는 추상화 수준이다. x86의 µop은 최종 실행 단위지만, ARM의 MOp는 이후 다시 µOp로 분리되는 한 단계 높은 중간 표현이다. 그래서 같은 "디코드된 명령어 캐시"라도 ARM 쪽이 저장 단위가 더 굵다.
🔒 보안 — 성능 구조가 공격 표면이 되다
디코드된 명령어 캐시는 성능 구조이면서 동시에 사이드 채널 공격 표면으로 학계의 주목을 받았다. "I See Dead µops" (ISCA 2021) 논문은 Intel·AMD의 µop 캐시가 Spectre 류 사이드 채널에 취약함을 입증했다. µop 캐시의 타이밍 차이를 이용하면 프로세스 간 데이터 누출이 가능하다는 결과다. ARM MOP 캐시는 이 논문에서 직접 다뤄지지 않았으나 구조가 유사해 동종 공격 가능성이 후속 연구 대상으로 남아 있다(ARM 측정·공격 1차 학술 자료는 아직 적어 추가 확인이 필요한 영역이다).
🔄 왜 다시 제거했나 — predecode가 같은 일을 더 싸게
Chips and Cheese의 Cortex-X925 분석에 따르면 ARM은 다음 세 가지 이유로 X925(2024)·A725(2024)에서 MOP 캐시를 제거했다.
▶ predecode가 디코드 비용을 충분히 낮춤 — I-Cache에 76비트 형식(32비트 명령어 + 44비트 메타데이터)으로 predecode 정보를 저장하므로 풀 디코드 없이 빠르게 MOp 생성. MOP 캐시와의 병행 운영이 "과잉"이 됨.
▶ 낮은 클럭에선 이득 미미 — 효율 코어(A725)처럼 낮은 클럭에선 타이밍 여유가 충분해 1사이클 절약 효과가 작음.
▶ 면적 재배치 — 1.5~3K 엔트리가 쓰던 실리콘을 더 큰 I-Cache나 실행 유닛에 투자하는 편이 유리.
요약하면 ARM은 predecode 체계를 키워 MOP 캐시의 역할을 흡수한 셈이다. 처음 든 모순("RISC인데 왜 넣었다 뺐나")의 답이 여기 있다 — MOP 캐시는 고클럭 모바일 코어 경쟁기에 ROI가 높았다가, predecode가 성숙하면서 중복 투자가 된 시대적 최적해였다.
🍎 Apple Silicon — 다른 길로 같은 결론
Apple M1/M2의 Firestorm 고성능 코어는 약 192KB의 거대한 L1 I-Cache와 8-wide decode를 갖는다. 공개 자료 기준 별도의 "MOP 캐시" 명칭 구조는 보고되지 않았다. 대신 Apple은 거대한 I-Cache와 600+ 엔트리의 거대한 ROB(재정렬 버퍼)로 프론트엔드 병목을 푼다. "MOP 캐시 없이 충분히 큰 버퍼로도 해결 가능하다"는 대안적 접근이며, ARM 본사가 2024년 MOP 캐시를 버린 방향과 묘하게 수렴한다.
🎯 결론 — 한 시대의 최적해
✓ MOp는 중간 표현 — 원시 명령어와 µOp 사이. 명령어와 거의 1:1이지만 복잡 명령어는 2 MOp로 분리, 단순 명령어 쌍은 1 MOp로 융합된다.
✓ MOP 캐시는 직렬 하위 계층 — I-Cache와 병렬이 아니라, I-Cache 히트 후 디코드 결과를 채워 재실행 시 디코드를 우회한다.
✓ 닮은 구조, 다른 목적 — x86은 복잡 디코드 회피, ARM은 전력·퓨전 재사용·처리량이 동기였다.
✓ 2019 정점, 2024 은퇴 — predecode 성숙으로 역할이 중복돼 거둬들였다.
앞으로 ARM 프론트엔드 최적화는 MOP 캐시 대신 더 정교한 predecode와 분기 예측 방향으로 진화할 전망이다. 반대로 x86 µop 캐시는 CISC 복잡성이 사라지지 않는 한 필수 구조로 남는다(다만 AMD Zen 5는 프론트엔드를 개편하며 Op 캐시 역할을 재정의 중). RISC-V 진영도 고성능 구현에서 디코드된 명령어 캐시를 탐색 중이라, "디코드 결과 캐싱"은 ISA를 가리지 않는 공통 설계 화두로 남는다.
💬 한 줄 요약 — MOps는 ARM이 명령어와 µOp 사이에 둔 중간 표현이고, MOP 캐시는 그 결과를 저장해 디코드를 건너뛰는 장치였다. 그러나 predecode가 같은 일을 더 싸게 해내면서 2024년 세대에서 사실상 은퇴한 "한 시대의 최적해"다.
📎 참고 자료
• ARM Community Forum — MOps/uops 정의 (Cortex-A Forum)
• Chips and Cheese — Cortex-X925 MOP 캐시 제거 분석
• WikiChip — ARM Cortex-A77 / A78 / Neoverse V1 마이크로아키텍처
• WikiChip — Intel Sandy Bridge µop Cache, AMD Zen Op Cache
• I See Dead µops: Leaking Secrets via Intel/AMD Micro-Op Caches (ISCA 2021)
• System on Chips — ARM Cortex-A78 MOPs/UOPs Instruction Fetch Pipeline
본 콘텐츠는 공개된 마이크로아키텍처 문서와 기술 분석을 토대로 작성한 기술 해설이며, 세부 수치는 세대·구현·자료 출처에 따라 차이가 있을 수 있습니다. 칩 설계 의사결정에 직접 활용하기 전 1차 공식 문서를 확인하시기 바랍니다.
📄 Raw Data
## MOps와 MOP 캐시 — ARM 프로세서 프론트엔드의 진화
### 1. 질문 파악
ARM CPU 아키텍처 문서를 따라가다 보면 **Cortex-A76~A77 세대를 기점으로 "MOps(Macro-Operations)"라는 용어와 "MOP Cache"라는 구조물이 공식 문서에 등장**한다. 이 질문은 사실상 네 갈래로 나뉜다.
- MOp(매크로 연산)란 정확히 무엇이며, I-Cache에 담긴 원시 명령어 및 실행 단계의 µOp(마이크로 연산)와 어떻게 구분되는가?
- MOP 캐시는 왜 만들어졌고, 기존 I-Cache와는 직렬·병렬 중 어떤 관계인가?
- x86 진영이 수년 앞서 도입한 유사 구조(Intel µop 캐시, AMD Op Cache)와 무엇이 같고 다른가?
- 2022년 이후 ARM이 MOP 캐시를 다시 제거한 이유는 무엇인가?
핵심 관전 포인트는 "RISC인 ARM이, 디코드가 단순하다는 RISC인데도 왜 디코드 결과를 따로 캐싱하는 구조를 넣었다가 다시 뺐는가"라는 모순처럼 보이는 흐름이다.
---
### 2. 기초 정보 — 프로세서 프론트엔드와 명령어 처리 계층
현대 고성능 CPU는 명령어를 "가져와서 곧장 실행"하지 않는다. 메모리에서 실행 유닛까지 오는 동안 여러 단계의 변환을 거치며, 이 변환 계층을 이해하는 것이 MOps 이해의 출발점이다.
#### 2.1 CISC와 RISC의 명령어 처리 방식 차이
**CISC(x86)**: Intel·AMD의 x86은 가변 길이(1~17바이트) 복잡 명령어 세트를 쓴다. `PUSH`, `MOVS`, `LOOP` 같은 명령어 하나가 내부적으로 다수의 단순 연산에 해당한다. 이를 그대로 실행하는 것은 비효율적이라, x86은 1995년 Pentium Pro(P6 마이크로아키텍처)부터 **명령어를 µop으로 분해해 내부적으로 RISC처럼 실행**하는 구조를 택했다.
**RISC(ARM)**: ARM의 AArch64(ARM64) 명령어는 고정 4바이트이고 대부분 단순하다. 이론상 CISC처럼 복잡한 분해가 불필요하다. 그런데도 ARM이 MOps라는 중간 계층을 둔 이유 — 여기서부터가 본론이다.
#### 2.2 세 계층: 명령어(Instruction) → MOp → µOp
ARM 공식 커뮤니티 포럼에서 ARM 엔지니어는 다음과 같이 정의한다.
> "MOps는 매크로 연산(Macro-Operation)이다. 아키텍처가 정의한 명령어로, 어셈블리로 작성하거나 컴파일러가 생성하는 바로 그 명령어다."
> "µOPs는 프로세서가 실행 도중 내부적으로 만드는 표현이며, 프로그래머에게는 직접 보이지 않는다."
> — ARM Community Forum, *Mops/uops - Cortex-A Forum*
**Cortex-A78 기준 파이프라인 계층:**
```
L1 I-Cache (원시 명령어 저장)
↓ Decode
MOps (중간 표현 — 명령어의 단순화·융합·분리 버전)
↓ (MOP 캐시에 저장)
↓ Rename / Dispatch
µOps (최소 실행 단위 — MOp 1개가 1~2개 µOp으로 분리)
↓
실행 유닛 (ALU, Load/Store, FP/NEON…)
```
즉 ARM에서 **MOp는 I-Cache의 원시 명령어와 실행 단계의 µOp 사이에 놓인 중간 레벨**이다. Cortex-A78은 명령어 4개를 디코드하면 평균 6개의 MOp를 만든다(명령어 대비 약 6% 많음). 각 MOp는 이후 파이프라인에서 다시 1~2개의 µOp로 분리된다. 핵심은 **MOp ≈ 명령어(거의 1:1.06)** 수준의 상위 추상화이고, µOp가 진짜 최소 실행 단위라는 점이다.
---
### 3. 역사와 등장 배경 — 왜 MOP 캐시가 필요했는가
#### 3.1 x86 진영의 선행 실험: Trace Cache → µop Cache
ARM이 MOP 캐시를 도입하기 전, x86은 이미 두 번 실험했다.
- **Pentium 4 Trace Cache (2000년)**: NetBurst 마이크로아키텍처에서 디코드된 µop을 순서대로 저장한 구조. 선구적이었으나 분기 예측 실패 시 무효화 비용이 크고 복잡해 Core 마이크로아키텍처에서 폐기됐다.
- **Intel Sandy Bridge µop Cache (2011년)**: WikiChip Sandy Bridge 항목에 따르면 Intel은 **Decoded ICache(µop 캐시, 약 1.5K µop)** 를 도입해 복잡한 x86 디코드 스테이지를 핫 코드에서 우회하게 했다. 이후 Ivy Bridge·Haswell까지 계승됐다.
- **AMD Zen Op Cache (2017년)**: WikiChip AMD Zen 항목에 따르면 AMD는 Zen에서 처음 µop 캐시(Op Cache)를 넣으며 "성능 개선뿐 아니라 전력도 절감한다"고 문서화했다.
#### 3.2 ARM: Cortex-A76에서 씨앗, Cortex-A77에서 개화
- **Cortex-A76 (2018년)**: ARM은 "완전한 재설계(ground-up redesign)"를 선언하며 4-wide decode에서 명령어를 MOps로 디코드하기 시작했고, **매크로 연산 퓨전(MOp Fusion)** — 인접한 두 명령어를 하나의 MOp로 합치는 기법 — 을 도입했다. 단, 이 시점엔 **전용 MOP 캐시가 없었다.** MOps는 파이프라인을 흐를 뿐 저장되지 않았다.
- **Cortex-A77 (2019년)**: A77부터 **전용 MOP 캐시(1.5K 엔트리)** 가 공식 등장했다(WikiChip Cortex-A77). 디코드된 MOps를 저장해 동일 코드 경로 재실행 시 디코드 스테이지 전체를 건너뛸 수 있게 됐다.
---
### 4. MOP 캐시의 구조와 I-Cache와의 관계
#### 4.1 I-Cache와 MOP Cache의 차이
| 항목 | L1 I-Cache | MOP Cache |
|------|-----------|-----------|
| 저장 내용 | 원시 명령어 바이트 (ISA 그대로) | 디코드된 MOps (중간 표현) |
| 위치 | 파이프라인 상류 (Fetch 단계) | 디코드 단계 직후 |
| 히트 시 효과 | 메모리/상위 캐시 접근 회피 | 디코드 단계 우회 |
| 미스 시 동작 | 상위 캐시(L2, L3) 조회 | I-Cache → Decode로 폴백 |
| Cortex-A78 규모 | 64KB | 1.5K MOp 엔트리 |
여기서 중요한 개념 정리: **MOP 캐시는 I-Cache와 병렬 대안이 아니라, I-Cache 하위의 직렬 계층**이다. 두 경로는 다음과 같다.
```
[정상 경로 — MOP 캐시 미스]
L2 → L1 I-Cache → Predecode → Decode → MOps → MOP 캐시 채움 → Rename
[빠른 경로 — MOP 캐시 히트]
MOP 캐시 → Rename (디코드 단계 완전 우회 + 약 1 사이클 단축)
```
AndroidAuthority의 Cortex-A78 분석에 따르면 MOP 캐시는 다양한 워크로드에서 **85% 이상의 히트율**을 보인다. 핫 루프·빈번 함수 같은 반복 코드에서 디코드 단계가 거의 활성화되지 않아 **전력 절감 효과**가 크다.
#### 4.2 Predecode — I-Cache와 MOP 캐시 사이의 가교
ARM은 I-Cache에 명령어를 저장할 때 순수 원시 바이트가 아니라 **일부 디코드 정보(predecode 메타데이터)를 덧붙인 중간 형식**으로 담는다. Cortex-A76~X1 세대는 약 36~40비트 형식(32비트 명령어 + 4~8비트 메타데이터)을 쓴다. 이 predecode 덕분에 I-Cache 히트 시 풀 디코드 비용이 줄고, MOP 캐시는 거기서 한 발 더 나아가 디코드 자체를 건너뛴다. 이 두 장치의 역할 중복이 후일 MOP 캐시 철수의 복선이 된다.
---
### 5. 현황 데이터 — ARM 세대별 MOP 캐시 변천
| 세대 | 코어 | 연도 | MOP 캐시 | 비고 |
|------|------|------|---------|------|
| — | Cortex-A75 이전 | ~2017 | 없음 | MOps 개념 미도입 |
| 1세대 | Cortex-A76 | 2018 | 없음 | MOp 퓨전 도입, 캐시 없음 |
| 2세대 | Cortex-A77 | 2019 | 1.5K 엔트리 | MOP 캐시 최초 도입 |
| 3세대 | Cortex-A78 | 2020 | 1.5K 엔트리 | 4명령어 / 6MOp / 사이클 |
| 3세대 | Cortex-X1 | 2020 | **3K 엔트리** | X1 전용 2배 확장 |
| 4세대 | Cortex-X2 | 2021 | 3K 엔트리 | 유지 |
| 5세대 | Cortex-X3 | 2022 | 1.5K 엔트리 | A77 수준으로 축소 |
| 5세대 | Cortex-A715 | 2022 | **제거** | I-Cache 내 퓨전으로 대체 |
| 6세대 | Cortex-X4 | 2023 | **제거** | A715와 동일 방향 |
| 7세대 | Cortex-X925 / A725 | 2024 | **제거** | Predecode 체계로 통합 |
서버용 Neoverse 라인에서는 V1(2021)이 **3K 엔트리 MOP 캐시**로 8 MOps/사이클을 달성했고, Neoverse N1(2019)도 MOP 캐시를 탑재했다(WikiChip Neoverse V1). 즉 **2019~2021년이 ARM MOP 캐시의 정점**, 2022년부터가 철수 국면이다.
---
### 6. 원인 분석 — x86 µop 캐시와 ARM MOP 캐시의 동기 차이
겉모습은 닮았지만 두 진영의 도입 동기는 다르다.
#### x86 µop 캐시의 동기 — "복잡한 디코드 자체를 피하려고"
x86 명령어는 가변 길이에 극도로 복잡하다. 디코더가 명령어 경계를 찾고(alignment), 피연산자 모드(32/64비트, 세그먼트 오버라이드 등)를 파악하고, 1~4개 µop으로 쪼개는 과정은 매 사이클 막대한 에너지·면적을 먹는다. Sandy Bridge µop 캐시는 이 무거운 디코더를 **핫 코드에서 통째로 건너뛰기** 위한 장치다.
#### ARM MOP 캐시의 동기 — "디코드는 가벼우나, 다른 이득이 있어서"
AArch64는 고정 4바이트라 경계 찾기 문제가 없고 디코드 자체가 x86보다 훨씬 단순하다. 그럼에도 ARM이 MOP 캐시를 넣은 이유는:
1. **전력 절감** — 모바일 환경에서 디코드 단계 비활성화로 전력 절약
2. **퓨전 결과 캐싱** — 퓨전된 MOp를 재사용해 퓨전 연산 반복 회피
3. **약 1 사이클 단축** — 리네임/디스패치 직전 단계를 줄여 분기 회복 속도 개선
4. **프론트엔드 처리량 증대** — 4명령어/사이클(I-Cache) → 6 MOp/사이클(MOP 캐시)
#### 명칭·구조 비교
| 개념 | ARM | Intel | AMD |
|------|-----|-------|-----|
| 디코드 전 명령어 저장 | L1 I-Cache | L1 I-Cache | L1 I-Cache |
| 디코드 후 연산 저장 | **MOP Cache** (MOps) | **Decoded ICache / µop Cache** (µops) | **Op Cache** (µops) |
| 저장 단위 | MOps (명령어 ≈ MOp, 1:1.06) | µops (복잡 명령어 → 1~4 µops) | µops |
| 도입 시기 | 2019 (A77) | 2011 (Sandy Bridge) | 2017 (Zen) |
핵심 차이: ARM의 "MOp"는 x86의 "µop"보다 **한 단계 높은 추상화**다. x86 µop는 최종 실행 단위지만, ARM MOp는 이후 다시 µOp로 분리되는 중간 단계다. 그래서 같은 "디코드된 명령어 캐시"라도 ARM 쪽이 저장 단위가 더 굵다.
---
### 7. 학계 반응과 보안 연구
MOP·µop 캐시는 성능 구조이면서 동시에 **보안 공격 표면**으로 학계의 주목을 받았다.
- **"I See Dead µops: Leaking Secrets via Intel/AMD Micro-Op Caches" (ISCA 2021)**: 이 논문은 Intel·AMD의 µop 캐시가 Spectre 류 사이드 채널에 취약함을 입증했다. µop 캐시의 타이밍 차이를 이용하면 프로세스 간 데이터 누출이 가능하다는 결과로, 디코드된 명령어 캐시가 공격 벡터가 될 수 있음을 환기했다. ARM MOP 캐시는 이 논문에서 직접 다뤄지지 않았으나, 구조가 유사하므로 동종 공격 가능성이 후속 연구 대상이 되고 있다.
- **"Design of Decoded Instruction Cache" (CANDAR 2023, 히로시마대)**: 디코드된 명령어 캐시의 설계 방법론을 다룬 연구로, 이 구조가 학술적으로도 정형화 단계에 들어섰음을 보여준다.
다만 ARM MOP 캐시를 정면으로 측정·공격한 1차 학술 논문은 µop 캐시 쪽에 비해 공개 자료가 적다. 이 부분은 추가 확인이 필요한 영역으로 남겨둔다.
---
### 8. 방향 전환 — 2022년 이후 MOP 캐시 철수
#### 왜 제거됐는가
Chips and Cheese의 Cortex-X925 분석에 따르면 ARM은 다음 이유로 X925(2024)·A725(2024)에서 MOP 캐시를 제거했다.
1. **Predecode가 이미 디코드 비용을 충분히 낮춤**: I-Cache에 76비트 형식(32비트 명령어 + 44비트 메타데이터)으로 predecode 정보를 저장하므로, 풀 디코드 없이 빠르게 MOp를 만든다. MOP 캐시와 predecode를 함께 운영하는 것은 "과잉"이 됐다.
2. **낮은 클럭에서는 이득이 미미**: 효율 코어(A725)처럼 낮은 클럭에선 타이밍 여유가 충분해 MOP 캐시의 1 사이클 절약 효과가 크지 않다.
3. **면적 재배치**: 1.5~3K 엔트리 MOP 캐시가 쓰던 실리콘을 더 큰 I-Cache나 실행 유닛에 투자하는 편이 낫다.
요약하면, ARM은 **predecode 체계를 키워 MOP 캐시의 역할을 흡수**한 셈이다. 처음 든 모순("RISC인데 왜 넣었다 뺐나")의 해답은 여기 있다 — MOP 캐시는 특정 시기(고클럭 모바일 코어 경쟁기)에 ROI가 높았다가, predecode가 성숙하면서 중복 투자가 된 **시대적 최적해**였다.
---
### 9. 비교 사례 — Apple Silicon의 다른 길
Apple M1/M2의 Firestorm(고성능) 코어는 **약 192KB의 거대한 L1 I-Cache**와 8-wide decode를 갖는다. 공개 자료 기준 별도의 "MOP 캐시" 명칭 구조는 보고되지 않았다. 대신 Apple은 거대한 I-Cache와 그보다 더 큰 ROB(재정렬 버퍼, 약 600+ 엔트리)로 프론트엔드 병목을 푼다. ARM 라이선스 IP가 아닌 독자 마이크로아키텍처를 쓰는 Apple의 선택은 "MOP 캐시 없이 충분히 큰 버퍼로도 해결 가능하다"는 대안적 접근의 유효성을 보여준다. ARM 본사가 2024년 MOP 캐시를 버린 방향과도 묘하게 수렴한다.
---
### 10. 결론 및 시사점
**핵심 정리**
1. ARM의 MOp는 "I-Cache의 원시 명령어"와 "실행 유닛의 µOp" 사이의 중간 표현이다. 명령어와 거의 1:1이지만, 복잡 명령어는 2개 MOp로 분리되고 단순 명령어 쌍은 1개 MOp로 융합된다.
2. MOP 캐시는 이 MOp들을 캐시해 동일 코드 재실행 시 디코드 단계를 우회한다. I-Cache와 병렬이 아니라 **직렬 계층의 하위 구조**다 — I-Cache 히트 후 디코드 결과가 MOP 캐시를 채운다.
3. x86 µop 캐시(Intel 2011, AMD 2017)가 복잡한 CISC 디코드 비용 회피에 초점을 둔 반면, ARM MOP 캐시는 전력 절감·퓨전 재사용·프론트엔드 처리량 증대에 초점을 뒀다. 닮은 구조, 다른 목적이다.
4. ARM은 2019~2021년 정점을 찍고 2022년(A715, X4)부터 MOP 캐시를 거둬들였다. predecode 체계가 성숙하며 역할이 중복됐기 때문이다.
**향후 방향**
- ARM 프론트엔드 최적화는 MOP 캐시 대신 **더 정교한 Predecode + 분기 예측 개선** 방향으로 진화 중이다.
- x86 µop 캐시는 CISC 복잡성이 사라지지 않는 한 필수 구조로 남을 것이다(다만 AMD Zen 5(2024)는 프론트엔드를 개편하며 Op 캐시 역할을 재정의 중).
- 보안 측면에서는 타이밍 사이드 채널 연구가 이어지며, 캐시 구조의 투명성이 학계의 요구사항으로 자리 잡고 있다.
- RISC-V 진영도 고성능 구현에서 디코드된 명령어 캐시를 탐색 중이라, "디코드 결과 캐싱"은 ISA를 가리지 않는 공통 설계 화두로 남는다.
**한 줄 요약**: MOps는 ARM이 명령어와 µOp 사이에 둔 중간 표현이고, MOP 캐시는 그 결과를 저장해 디코드를 건너뛰는 장치였으나 — predecode가 같은 일을 더 싸게 해내면서 2024년 세대에서 사실상 은퇴한 "한 시대의 최적해"다.
---
## References
- [ARM Community Forum - MOps/uops 정의](https://community.arm.com/developer/ip-products/processors/f/cortex-a-forum/48877/mops-macro-ops-uops-micro-ops)
- [Chips and Cheese - Cortex X925 MOP 캐시 제거 분석](https://chipsandcheese.com/p/arms-cortex-x925-reaching-desktop)
- [WikiChip - ARM Cortex-A77 마이크로아키텍처](https://en.wikichip.org/wiki/arm_holdings/microarchitectures/cortex-a77)
- [WikiChip - ARM Cortex-A78 마이크로아키텍처](https://en.wikichip.org/wiki/arm_holdings/microarchitectures/cortex-a78)
- [WikiChip - AMD Zen µop Cache](https://en.wikichip.org/wiki/amd/microarchitectures/zen)
- [I See Dead µops - ISCA 2021 논문](https://mktrm.github.io/files/uop_isca21.pdf)
- [System on Chips - ARM Cortex-A78 MOPs UOPs 파이프라인](https://www.systemonchips.com/arm-cortex-a78-mops-uops-and-instruction-fetch-pipeline/)
- [WikiChip - ARM Neoverse V1](https://en.wikichip.org/wiki/arm_holdings/microarchitectures/neoverse_v1)
- [WikiChip - Intel Sandy Bridge µop Cache](https://en.wikichip.org/wiki/intel/microarchitectures/sandy_bridge_(client))
- [Wikipedia - Intel Pentium 4 Trace Cache](https://en.wikipedia.org/wiki/Pentium_4)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기