CPU Architecture

CPU アーキテクチャ完全概要ガイド

1. はじめに

1.1 CPUとは

CPU(Central Processing Unit:中央演算処理装置)は、コンピュータの「頭脳」にあたるハードウェアであり、プログラムの命令を解釈し実行する役割を担う。現代のあらゆるデジタルデバイス——スマートフォン、ラップトップ、サーバー、組み込み機器、スーパーコンピュータ——の中核をなす部品である。

CPUは基本的に以下のサイクルを繰り返すことで動作する:

[フェッチ (Fetch)]     → メモリから次の命令を取得
      ↓
[デコード (Decode)]    → 命令を解釈し、実行方法を決定
      ↓
[実行 (Execute)]       → 演算ユニットで命令を実行
      ↓
[メモリアクセス (Memory)] → 必要に応じてメモリの読み書き
      ↓
[ライトバック (Write Back)] → 結果をレジスタに書き戻し

1.2 本記事の目的

本記事では、現代のCPUアーキテクチャを包括的に解説し、特に以下の3つの主要なISA(Instruction Set Architecture:命令セットアーキテクチャ)を詳細に比較する:

  • x86/x86-64: Intel/AMDが中心のCISCアーキテクチャ。PC・サーバー市場を支配
  • ARM (AArch64): ARM社が設計するRISCアーキテクチャ。モバイル・組み込みの王者
  • RISC-V: オープンソースのRISCアーキテクチャ。急速に成長する新勢力

1.3 ISAの役割

ISA(命令セットアーキテクチャ)は、ソフトウェアとハードウェアの間の「契約」である。具体的には以下を定義する:

  • 使用可能な命令の種類と形式
  • レジスタの数とサイズ
  • メモリアドレッシングモード
  • データ型と操作
  • 割り込みと例外の処理方法
  • I/Oの仕組み
┌──────────────────────────────────────┐
│           アプリケーション             │
├──────────────────────────────────────┤
│       OS / システムソフトウェア        │
├──────────────────────────────────────┤
│    ISA(命令セットアーキテクチャ)      │  ← ソフトウェアとハードウェアの境界
├──────────────────────────────────────┤
│     マイクロアーキテクチャ             │  ← ISAの実装方法
├──────────────────────────────────────┤
│        論理回路 / ゲート              │
├──────────────────────────────────────┤
│       トランジスタ / 物理層           │
└──────────────────────────────────────┘

同じISAでも異なるマイクロアーキテクチャで実装できる。例えば、x86 ISAはIntelのAlder LakeとAMDのZen 4という全く異なるマイクロアーキテクチャで実装されているが、同じx86プログラムが両方で動作する。

1.4 CISC vs RISC の歴史

CPUアーキテクチャの歴史は、CISCとRISCの対立と融合の歴史でもある。

CISC(Complex Instruction Set Computer)

  • 1970年代〜:複雑で多機能な命令を持つ設計思想
  • 1つの命令で複雑な処理を行える(メモリ間演算等)
  • 命令長が可変(1バイト〜15バイト等)
  • 代表例:x86, VAX, 68k

RISC(Reduced Instruction Set Computer)

  • 1980年代〜:単純で均一な命令を持つ設計思想
  • 各命令は1クロックで実行可能(理想的には)
  • 固定長命令(通常32ビット)
  • ロード/ストア・アーキテクチャ(メモリ操作は専用命令のみ)
  • 代表例:ARM, MIPS, RISC-V, SPARC, PowerPC

現代では、この境界は曖昧になっている。x86プロセッサは内部でCISC命令をRISC的なマイクロオペレーション(μops)に分解して実行しており、ARMもバージョンアップとともに命令セットが複雑化している。

特性CISCRISC
命令の複雑さ高い低い
命令長可変固定(通常32bit)
命令数多い(数百〜数千)少ない(数十〜数百)
レジスタ数少ない多い
メモリアクセス命令内で直接ロード/ストアのみ
パイプライン複雑シンプル
コード密度高い低い(RISC-Vの圧縮命令で改善)
デコーダの複雑さ高い低い
消費電力高い傾向低い傾向

2. CPUの基本アーキテクチャ

2.1 CPUの内部構成

現代のCPUは以下の主要コンポーネントで構成される:

┌────────────────────────────────────────────────────────────┐
│                        CPU コア                             │
│                                                            │
│  ┌──────────────┐  ┌──────────────┐  ┌───────────────┐   │
│  │ 命令フェッチ  │→│  命令デコーダ  │→│ リネーミング/   │   │
│  │  ユニット     │  │              │  │ ディスパッチ   │   │
│  └──────────────┘  └──────────────┘  └───────┬───────┘   │
│                                               │            │
│  ┌───────────────────────────────────────────────────────┐ │
│  │              実行ユニット群                             │ │
│  │  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌──────┐          │ │
│  │  │ ALU │ │ ALU │ │ FPU │ │ AGU │ │ 分岐  │          │ │
│  │  │  1  │ │  2  │ │     │ │     │ │ ユニット│         │ │
│  │  └─────┘ └─────┘ └─────┘ └─────┘ └──────┘          │ │
│  └───────────────────────────────────────────────────────┘ │
│                                                            │
│  ┌─────────────┐  ┌──────────────┐                        │
│  │ レジスタファイル│ │ リオーダバッファ│                      │
│  └─────────────┘  └──────────────┘                        │
│                                                            │
│  ┌──────────────────────────────────────────────────┐     │
│  │             キャッシュ階層                          │     │
│  │  ┌────────┐  ┌────────┐                          │     │
│  │  │L1 I-Cache│ │L1 D-Cache│  (各コア専用, 32-64KB) │     │
│  │  └────────┘  └────────┘                          │     │
│  │  ┌──────────────────┐                            │     │
│  │  │   L2 Cache        │  (各コア専用, 256KB-2MB)   │     │
│  │  └──────────────────┘                            │     │
│  └──────────────────────────────────────────────────┘     │
│                                                            │
├────────────────────────────────────────────────────────────┤
│  ┌──────────────────────────────────────────────────┐     │
│  │   L3 Cache (共有, 8MB-256MB)                      │     │
│  └──────────────────────────────────────────────────┘     │
├────────────────────────────────────────────────────────────┤
│  ┌───────────┐  ┌───────────┐  ┌────────────────┐        │
│  │ メモリ     │  │ PCIe      │  │ その他I/O      │        │
│  │ コントローラ│ │ コントローラ│ │ コントローラ    │        │
│  └───────────┘  └───────────┘  └────────────────┘        │
└────────────────────────────────────────────────────────────┘

2.2 パイプライン

パイプラインは、命令処理を複数のステージに分割し、各ステージを同時に実行することでスループットを向上させる技術である。

古典的5段パイプライン(RISC)

クロック:  1    2    3    4    5    6    7    8
命令1:   IF   ID   EX   MEM  WB
命令2:        IF   ID   EX   MEM  WB
命令3:             IF   ID   EX   MEM  WB
命令4:                  IF   ID   EX   MEM  WB

IF  = Instruction Fetch(命令フェッチ)
ID  = Instruction Decode(命令デコード)
EX  = Execute(実行)
MEM = Memory Access(メモリアクセス)
WB  = Write Back(書き戻し)

現代のプロセッサでは、パイプラインは15〜30+段に深化している:

プロセッサパイプライン段数
ARM Cortex-A538段
ARM Cortex-A7813段
Apple M4 (Pコア)推定16-18段
Intel Raptor Lake (Pコア)推定20+段
AMD Zen 5推定19段

2.3 スーパースカラ実行

スーパースカラプロセッサは、1クロックサイクルで複数の命令を同時にディスパッチ・実行する:

                  ┌──── ALU 1 ────→ 結果1
命令ウィンドウ ────┼──── ALU 2 ────→ 結果2
                  ├──── FPU  ────→ 結果3
                  ├──── AGU  ────→ メモリアクセス
                  └──── BRU  ────→ 分岐結果

ディスパッチ幅(1サイクルあたりの最大命令数):
- ARM Cortex-A55:  2命令
- ARM Cortex-A78:  4命令
- Apple M4 (Pコア): 8-10命令
- AMD Zen 5:       6命令
- Intel Raptor Lake (Pコア): 6命令

2.4 アウトオブオーダー実行

プログラム順序に関係なく、データ依存性が解決された命令から実行する手法。性能向上の主要な手段の一つ:

プログラム順序:           実行順序(OoO):
1. LOAD R1, [addr1]      1. LOAD R1, [addr1]    ← メモリ待ち
2. ADD R2, R1, #1        3. MUL R4, R3, R5      ← R1に依存しない
3. MUL R4, R3, R5        4. SUB R6, R3, #2      ← R1に依存しない
4. SUB R6, R3, #2        2. ADD R2, R1, #1      ← R1のロード完了後
5. STORE [addr2], R2     5. STORE [addr2], R2   ← R2の計算完了後
アーキテクチャリオーダバッファサイズ
ARM Cortex-A78160エントリ
Apple M4 (Pコア)推定600+エントリ
AMD Zen 5448エントリ
Intel Raptor Lake (Pコア)512エントリ

2.5 分岐予測

条件分岐の結果を予測し、予測に基づいて投機的に命令を実行する。予測ミスの場合、投機的に実行した命令は破棄される。

if (condition) {
    // パスA
} else {
    // パスB
}

分岐予測器 → 「パスAが実行される」と予測
           → パスAの命令を投機的にフェッチ・実行開始
           → 条件の評価結果が出る
              ├── 予測正解 → そのまま続行(ペナルティなし)
              └── 予測ミス → パスAの結果を破棄、パスBを再フェッチ
                             (10〜30サイクルのペナルティ)

現代のプロセッサの分岐予測精度は97〜99%以上に達する。主な予測手法:

  • BTB(Branch Target Buffer): 分岐先アドレスのキャッシュ
  • BHT(Branch History Table): 分岐の履歴パターン
  • TAGE予測器: 複数の履歴長を使用する高精度予測器
  • ニューラル分岐予測: 機械学習ベースの予測(Samsung, AMD等で使用)
  • ループ検出器: ループの反復回数を学習

2.6 キャッシュ階層

┌──────────────────────────────────────────────────────┐
│ CPU コア                                              │
│  ┌─────────────┐   レイテンシ   サイズ               │
│  │ レジスタ     │   ~0.3ns      数KB                 │
│  └──────┬──────┘                                     │
│  ┌──────┴──────┐                                     │
│  │ L1 Cache    │   ~1ns (4cyc)  32-64KB              │
│  │ (I$ + D$)   │                                     │
│  └──────┬──────┘                                     │
│  ┌──────┴──────┐                                     │
│  │ L2 Cache    │   ~3-5ns       256KB-2MB            │
│  └──────┬──────┘                                     │
└─────────┼────────────────────────────────────────────┘
  ┌───────┴───────┐
  │ L3 Cache      │   ~10-15ns    8MB-256MB (共有)
  │ (共有)         │
  └───────┬───────┘
  ┌───────┴───────┐
  │ メインメモリ   │   ~50-100ns   GB-TB (DRAM)
  │ (DRAM)        │
  └───────┬───────┘
  ┌───────┴───────┐
  │ ストレージ     │   ~10μs(SSD)  TB-PB
  │ (SSD/HDD)     │   ~5ms(HDD)
  └───────────────┘

キャッシュの基本概念:

  • キャッシュライン: データ転送の最小単位(通常64バイト)
  • アソシアティビティ: N-Way Set Associative(通常4〜16ウェイ)
  • 置換ポリシー: LRU(Least Recently Used)が基本
  • インクルーシブ vs エクスクルーシブ: L3がL2の内容を含むかどうか
  • コヒーレンシプロトコル: MOESI, MESIF等(マルチコアでのデータ一貫性)

3. x86 / x86-64 アーキテクチャ

3.1 概要と歴史

x86は、1978年にIntelの8086プロセッサで誕生したISAであり、PC革命の立役者である。2003年にAMDがx86を64ビットに拡張した**AMD64(x86-64)**を発表し、現在のPC・サーバー市場の標準となっている。

x86の進化:
8086 (1978) → 80286 → 80386 (32bit化) → 80486 → Pentium →
Pentium Pro (OoO) → Pentium 4 (NetBurst) → Core (2006) →
Sandy Bridge → Haswell → Skylake → Alder Lake (Hybrid) →
Raptor Lake → Meteor Lake → Arrow Lake (2024) → Panther Lake (2025)

3.2 レジスタ構成

x86-64は以下のレジスタを持つ:

汎用レジスタ(64ビット × 16個):
RAX, RBX, RCX, RDX       ← 8086からの拡張
RSI, RDI, RSP, RBP       ← 8086からの拡張
R8, R9, R10, R11          ← AMD64で追加
R12, R13, R14, R15        ← AMD64で追加

部分レジスタアクセス:
RAX (64bit) → EAX (32bit) → AX (16bit) → AH:AL (8bit:8bit)

特殊レジスタ:
RIP    - プログラムカウンタ(命令ポインタ)
RFLAGS - ステータスフラグ(ゼロ、キャリー、オーバーフロー等)
RSP    - スタックポインタ

SIMD/ベクトルレジスタ:
XMM0-15  (128ビット) ← SSE
YMM0-15  (256ビット) ← AVX/AVX2
ZMM0-31  (512ビット) ← AVX-512

セグメントレジスタ: CS, DS, ES, FS, GS, SS(64bitモードでは限定使用)

3.3 命令セットの特徴

x86の命令は可変長(1〜15バイト)で、非常に複雑なエンコーディングを持つ:

x86命令のフォーマット:
┌─────────┬────────┬────────┬─────┬────────────┬──────────┐
│ プレフィックス│ オペコード│ ModR/M │ SIB │ ディスプレイスメント│ 即値      │
│ 0-4 byte │ 1-3 byte│ 0-1 byte│0-1 B│ 0,1,2,4 byte│ 0,1,2,4 B│
└─────────┴────────┴────────┴─────┴────────────┴──────────┘

例:
ADD EAX, EBX         → 01 D8          (2バイト)
MOV RAX, [RBP-8]     → 48 8B 45 F8    (4バイト)
VFMADD231PS ZMM0, ZMM1, [RAX+RBX*4+16]  → (多バイト)

x86の命令セット拡張の歴史

拡張年代機能
MMX199764bit SIMD(整数)
SSE1999128bit SIMD(浮動小数点)
SSE22001128bit SIMD(整数+倍精度浮動小数点)
SSE3/SSSE32004-2006水平演算等の追加
SSE4.1/4.22006-2008文字列処理、CRC32等
AVX2011256bit SIMD
AVX22013256bit 整数SIMD
AVX-5122016512bit SIMD(マスク操作付き)
AMX2023行列演算(AI向け)
AVX102024AVX-512の統一版
APX2024+汎用レジスタ32本化、条件付き命令等

3.4 メモリモデル

x86は**TSO(Total Store Order)**という比較的強いメモリモデルを採用:

  • ストア→ストアの順序は保証される
  • ロード→ロードの順序は保証される
  • ロード→ストアの順序は保証される
  • ストア→ロードのリオーダリングのみ許可される

これにより、x86向けのマルチスレッドプログラミングは比較的容易だが、ARM/RISC-Vの弱いメモリモデル向けコードへの移植時に問題が生じることがある。

3.5 仮想化支援

x86は強力なハードウェア仮想化機能を持つ:

  • Intel VT-x / AMD-V: CPU仮想化
  • Intel VT-d / AMD-Vi (IOMMU): I/O仮想化
  • Intel EPT / AMD NPT: メモリ仮想化(ネストされたページテーブル)
  • Intel VT-c: ネットワーク仮想化

3.6 現代のx86プロセッサ

Intel Raptor Lake / Arrow Lake(2023-2024):

  • ハイブリッドアーキテクチャ(Pコア + Eコア)
  • Pコア: 高性能、OoO、ハイパースレッディング
  • Eコア: 省電力、インオーダーに近い設計
  • Intel Thread Director: コアの動的割り当て

AMD Zen 5(2024):

  • チップレット設計(CCD + IOD)
  • 3D V-Cache技術(L3 キャッシュの大幅増量)
  • SMT(Simultaneous Multi-Threading)
Intel Hybrid Architecture:
┌──────────────────────────────────────────────┐
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐│
│  │ P-Core │ │ P-Core │ │ P-Core │ │ P-Core ││  高性能タスク
│  │ (高性能)│ │        │ │        │ │        ││
│  └────────┘ └────────┘ └────────┘ └────────┘│
│  ┌─────┐┌─────┐┌─────┐┌─────┐┌─────┐┌─────┐│
│  │E-Core││E-Core││E-Core││E-Core││E-Core││E-Core││  バックグラウンド
│  │(効率)││     ││     ││     ││     ││     ││  タスク
│  └─────┘└─────┘└─────┘└─────┘└─────┘└─────┘│
│  ┌──────────────────────────────────────────┐│
│  │         共有 L3 Cache (36MB)              ││
│  └──────────────────────────────────────────┘│
│  ┌──────────────────────────────────────────┐│
│  │         メモリコントローラ / PCIe          ││
│  └──────────────────────────────────────────┘│
└──────────────────────────────────────────────┘

AMD Zen Chiplet Architecture:
┌─────────────┐  ┌─────────────┐
│    CCD 1     │  │    CCD 2     │  ← コンピュートダイ
│  8コア Zen 5 │  │  8コア Zen 5 │
│  L3: 32/96MB │  │  L3: 32/96MB │
└──────┬──────┘  └──────┬──────┘
       │                 │
┌──────┴─────────────────┴──────┐
│           IOD (I/Oダイ)         │  ← メモリ/PCIe/USB等
│  メモリコントローラ, PCIe Gen5   │
│  USB, SATA, Infinity Fabric    │
└────────────────────────────────┘

4. ARM (AArch64) アーキテクチャ

4.1 概要と歴史

ARM(Advanced RISC Machine、旧称Acorn RISC Machine)は、1985年にAcorn ComputersのSophie WilsonとSteve Furberによって設計された。ARM社はチップそのものは製造せず、IPライセンスモデルで設計をライセンス供与するビジネスモデルを採用している。

ARMの進化:
ARM1 (1985) → ARM6 (1991) → ARM7TDMI (1994, 組み込みの定番) →
ARM9 (1999) → ARM11 (2002) → Cortex-A8 (2005, 初のスーパースカラ) →
Cortex-A15 (2011, OoO) → ARMv8-A (2011, 64bit=AArch64) →
Cortex-A72 (2015) → Cortex-A76 (2018, ノートPC級性能) →
Cortex-X1 (2020, 性能特化) → Cortex-X4 (2023) →
Cortex-X925 (2024) → Cortex-X5 (2025)

ARMのビジネスモデル:

  • アーキテクチャライセンス: ISAの使用権(Apple, Qualcomm等が独自コア設計)
  • コアライセンス: Cortexコアの設計を使用(MediaTek, Samsung等)
  • チップ設計ライセンス: 完成したSoCの設計を使用

4.2 レジスタ構成(AArch64)

汎用レジスタ(64ビット × 31個):
X0-X30   (64bit)   ← W0-W30で下位32bitにアクセス

特殊レジスタ:
SP   - スタックポインタ(EL0-EL3ごとに別)
PC   - プログラムカウンタ(直接アクセス不可)
XZR  - ゼロレジスタ(常に0を返す)
PSTATE - プロセッサ状態(NZCV フラグ等)
ELR  - 例外リンクレジスタ
SPSR - 保存プロセッサ状態レジスタ

SIMD/浮動小数点レジスタ:
V0-V31  (128ビット) ← NEON (Advanced SIMD)
Z0-Z31  (可変長, 128-2048ビット) ← SVE/SVE2

例外レベル:
EL0 - ユーザーアプリケーション
EL1 - OS カーネル
EL2 - ハイパーバイザ
EL3 - セキュアモニタ (TrustZone)

4.3 命令セットの特徴

AArch64の命令は固定32ビット長で、整然としたエンコーディングを持つ:

AArch64命令フォーマット(すべて32ビット固定):

データ処理(レジスタ):
┌──────┬───┬──────┬──────┬──────┬──────┐
│ op   │ S │  Rm  │ shift│  Rn  │  Rd  │
│31  25│24 │20  16│15  10│9    5│4    0│
└──────┴───┴──────┴──────┴──────┴──────┘

例:
ADD X0, X1, X2       → 0x8B020020   (すべて4バイト)
LDR X0, [X1, #16]    → 0xF9400820   (すべて4バイト)
B.NE label           → 0x54xxxxxx   (すべて4バイト)

主要な命令カテゴリ:

  • データ処理: ADD, SUB, AND, ORR, EOR, LSL, LSR等
  • ロード/ストア: LDR, STR, LDP, STP(ペアロード/ストア)
  • 分岐: B, BL, BR, BLR, RET, CBZ, CBNZ, TBZ
  • システム: MSR, MRS, SVC, HVC, SMC, DMB, DSB, ISB
  • SIMD/FP: NEON命令群

4.4 ARMの特徴的な技術

条件付き実行(AArch32)→ 条件選択(AArch64):

; AArch32の条件付き実行
CMP R0, #0
ADDNE R1, R1, #1    ; R0 != 0 の場合のみ実行

; AArch64の条件選択
CMP X0, #0
CINC X1, X1, NE     ; X0 != 0 ならインクリメント
CSEL X2, X3, X4, EQ ; 等しければX3、そうでなければX4を選択

TrustZone(セキュリティ拡張):

┌────────────────────┬────────────────────┐
│   通常ワールド      │  セキュアワールド    │
│                    │                    │
│  ┌──────────────┐  │  ┌──────────────┐  │
│  │ リッチOS      │  │  │ セキュアOS    │  │
│  │ (Linux/Android)│ │  │ (OP-TEE等)   │  │
│  └──────────────┘  │  └──────────────┘  │
│  ┌──────────────┐  │  ┌──────────────┐  │
│  │ 通常アプリ    │  │  │ Trusted App  │  │
│  │              │  │  │ (鍵管理, DRM) │  │
│  └──────────────┘  │  └──────────────┘  │
├────────────────────┴────────────────────┤
│          セキュアモニタ (EL3)            │
└─────────────────────────────────────────┘

SVE/SVE2(Scalable Vector Extension):

  • ベクトル長が128〜2048ビットで可変
  • ハードウェア実装ごとにベクトル長を選択可能
  • 同じバイナリが異なるベクトル長のハードウェアで動作
  • Predicate レジスタによるマスク操作
SVEのベクトル長柔軟性:
実装A: 128ビット → 1要素/処理 (64bit×2)
実装B: 256ビット → 2要素/処理 (64bit×4)
実装C: 512ビット → 4要素/処理 (64bit×8)
実装D: 2048ビット → 16要素/処理 (64bit×32)
→ 同じSVEバイナリがすべてで動作

4.5 主要なARM実装

実装者コア名用途
ARMCortex-A520高効率(スマホの省電力コア)
ARMCortex-A725バランス(スマホの中間コア)
ARMCortex-X925高性能(スマホのプライムコア)
AppleFirestorm/Avalanche (M1)Mac/iPad
AppleEverest/Sawtooth (M4)Mac/iPad
QualcommOryon (Snapdragon X Elite)ノートPC
NVIDIAGraceサーバー/HPC
AWSGraviton4クラウドサーバー
AmpereAmpereOneクラウドサーバー
富士通A64FXスパコン(富岳)

5. RISC-V アーキテクチャ

5.1 概要と歴史

RISC-Vは、2010年にカリフォルニア大学バークレー校(UCB)でKrste Asanović教授とDavid Patterson教授(RISCの共同提唱者)のチームによって設計されたオープンソースの命令セットアーキテクチャである。

RISC-Vの最大の特徴は、ISA自体がオープンスタンダードであることである。x86はIntel/AMDの、ARMはArm Ltdの知的財産であるが、RISC-Vは誰でも無料で実装・使用できる。

RISC-Vの進化:
2010年 UCBで設計開始
2011年 最初の仕様公開
2015年 RISC-V Foundation設立
2020年 RISC-V International設立(スイスに本部移転)
2022年 SiFive Performance P670 (高性能OoOコア)
2023年 Tenstorrent Ascalon (サーバー向け高性能コア)
2024年 Qualcomm RISC-V採用検討、各社から商用チップ登場
2025年 Android/ChromeOSでRISC-Vサポート強化

5.2 設計思想

RISC-Vは以下の設計原則に基づいている:

  1. モジュラー設計: 基本命令セット + 標準拡張の組み合わせ
  2. クリーンスレート設計: 過去の互換性に縛られない
  3. シンプルさ: 基本ISA(RV32I)はわずか47命令
  4. 拡張性: カスタム拡張を自由に追加可能
  5. オープンスタンダード: 特許やライセンス料なし

5.3 モジュラーISA

RISC-Vの最大の特徴はモジュラー構造である:

基本整数ISA(必須):
┌──────────────────────────────────────────────┐
│ RV32I / RV64I / RV128I                        │
│ 基本整数命令 (47命令)                          │
│ ADD, SUB, AND, OR, XOR, SLT, SLL, SRL, SRA   │
│ LW, SW, LB, SB, LH, SH                       │
│ BEQ, BNE, BLT, BGE, JAL, JALR                │
│ LUI, AUIPC, ECALL, EBREAK                    │
└──────────────────────────────────────────────┘

標準拡張(オプション):
┌────┬───────────────────────────────────────┐
│ M  │ 整数乗除算 (MUL, DIV, REM)            │
│ A  │ アトミック操作 (LR/SC, AMO)            │
│ F  │ 単精度浮動小数点 (32bit)               │
│ D  │ 倍精度浮動小数点 (64bit)               │
│ Q  │ 四倍精度浮動小数点 (128bit)            │
│ C  │ 圧縮命令 (16bit命令、コード密度向上)    │
│ V  │ ベクトル拡張 (SIMD/ベクトル演算)       │
│ B  │ ビット操作拡張                         │
│ H  │ ハイパーバイザ拡張                      │
│ Zicsr│ CSR命令 (制御/状態レジスタ)           │
│ Zifencei│ 命令フェンス                       │
│ Zba │ アドレス生成ビット操作                 │
│ Zbb │ 基本ビット操作                         │
│ Zbc │ キャリーなしビット操作                 │
│ Zbs │ 単一ビット操作                         │
│ Zk* │ 暗号化拡張(AES, SHA等)               │
│ Ztso│ Total Store Ordering (x86互換メモリモデル)│
└────┴───────────────────────────────────────┘

一般的なプロファイル:
RV64GC = RV64I + M + A + F + D + C
       = 汎用的なアプリケーション向け(Linux等)

RV32IMC = 組み込みマイクロコントローラ向け
RV64GCV = HPC/AI向け(ベクトル拡張付き)

5.4 レジスタ構成

汎用レジスタ(32個 × 32/64/128ビット):
x0  (zero) - 常にゼロ(ハードワイヤード)
x1  (ra)   - リターンアドレス
x2  (sp)   - スタックポインタ
x3  (gp)   - グローバルポインタ
x4  (tp)   - スレッドポインタ
x5-x7  (t0-t2)   - テンポラリ
x8  (s0/fp) - 保存レジスタ/フレームポインタ
x9  (s1)    - 保存レジスタ
x10-x17 (a0-a7)  - 引数/戻り値
x18-x27 (s2-s11) - 保存レジスタ
x28-x31 (t3-t6)  - テンポラリ

浮動小数点レジスタ(F/D拡張時):
f0-f31 (32個 × 32/64ビット)

ベクトルレジスタ(V拡張時):
v0-v31 (32個 × VLEN ビット、128-65536)

CSR(制御/状態レジスタ):
mstatus, mie, mip, mepc, mcause, mtval, mtvec等 (Machine)
sstatus, sie, sip, sepc, scause, stval, stvec等 (Supervisor)
cycle, time, instret等 (パフォーマンスカウンタ)

5.5 命令フォーマット

RISC-Vは6つの基本命令フォーマットを持ち、すべて32ビット固定長:

R型(レジスタ-レジスタ演算):
┌───────┬─────┬─────┬──────┬─────┬─────────┐
│ funct7│ rs2 │ rs1 │funct3│ rd  │ opcode  │
│31   25│24 20│19 15│14  12│11  7│6       0│
└───────┴─────┴─────┴──────┴─────┴─────────┘

I型(即値演算/ロード):
┌────────────┬─────┬──────┬─────┬─────────┐
│  imm[11:0] │ rs1 │funct3│ rd  │ opcode  │
│31        20│19 15│14  12│11  7│6       0│
└────────────┴─────┴──────┴─────┴─────────┘

S型(ストア):
┌───────┬─────┬─────┬──────┬────────┬─────────┐
│imm[11:5]│ rs2│ rs1│funct3│imm[4:0]│ opcode  │
└───────┴─────┴─────┴──────┴────────┴─────────┘

B型(分岐):
U型(上位即値):
J型(ジャンプ):

C拡張の16ビット圧縮命令:
┌──────────────────┐
│  16ビット命令      │  ← よく使う命令の短縮形
│  コード密度向上    │     x86に近い密度を実現
└──────────────────┘

5.6 特権レベル

┌─────────────────────────────────────┐
│ レベル │ 名称       │ 用途          │
├─────────────────────────────────────┤
│ M      │ Machine    │ ファームウェア │  ← 最高特権(必須)
│ S      │ Supervisor │ OSカーネル    │  ← オプション
│ U      │ User       │ アプリケーション│ ← オプション
│ HS     │ Hypervisor │ 仮想化        │  ← H拡張使用時
└─────────────────────────────────────┘

最小構成(組み込み): M のみ
一般構成(Linux):    M + S + U
仮想化構成:          M + HS + S + U

5.7 ベクトル拡張(RVV)

RISC-Vのベクトル拡張は、ARMのSVEに似た**ベクトル長非依存(VLA: Vector Length Agnostic)**設計:

// RISC-V ベクトルコードの例(ベクトル加算)
void vec_add(float *a, float *b, float *c, int n) {
    while (n > 0) {
        size_t vl = __riscv_vsetvl_e32m1(n);  // ベクトル長を設定
        vfloat32m1_t va = __riscv_vle32_v_f32m1(a, vl);  // ロード
        vfloat32m1_t vb = __riscv_vle32_v_f32m1(b, vl);  // ロード
        vfloat32m1_t vc = __riscv_vfadd_vv_f32m1(va, vb, vl);  // 加算
        __riscv_vse32_v_f32m1(c, vc, vl);  // ストア
        a += vl; b += vl; c += vl; n -= vl;
    }
}

VLENの柔軟性:

  • 最小: 128ビット
  • 典型: 256〜512ビット
  • 最大: 65,536ビット
  • LMUL(レジスタグルーピング): 複数のレジスタを結合して仮想的に長いベクトルを作成

5.8 主要なRISC-V実装

実装者チップ名コア用途
SiFiveP670/P870高性能OoOアプリケーションプロセッサ
TenstorrentAscalon高性能OoOサーバー/AI
Alibaba (T-Head)C910/C920OoOサーバー/エッジ
SpacemiTX60OoOノートPC/タブレット
EsperantoET-SoC-11000+コアAI/HPC
Bouffalo LabBL602/BL808組み込みIoT/WiFi
GigaDeviceGD32VF103組み込みMCU
StarFiveJH7110OoOSBC(VisionFive 2)

6. x86 vs ARM vs RISC-V 徹底比較

6.1 アーキテクチャ比較表

特性x86-64AArch64 (ARMv9)RISC-V (RV64GC)
設計思想CISC(内部RISC)RISCRISC
ライセンスIntel/AMD独占ARM社からライセンスオープンスタンダード
命令長可変(1-15バイト)固定32ビット固定32ビット(+16bit C拡張)
汎用レジスタ16個(APXで32個)31個31個(+ゼロレジスタ)
SIMDレジスタ16-32個(128-512bit)32個(128bit NEON)32個(可変長 V拡張)
ベクトルAVX-512(固定512bit)SVE/SVE2(128-2048bit)RVV(128-65536bit)
メモリモデルTSO(強い)弱い(RVWMO相当)RVWMO(弱い)/Ztso(TSO)
特権レベルRing 0-3 + VMXEL0-EL3M/S/U/HS
エンディアンリトルのみバイエンディアンリトルのみ(標準)
仮想化VT-x/AMD-VEL2H拡張
セキュリティSGX/TDX/SEVTrustZone, PAC, MTE, CCAPMP, ePMP, WorldGuard
コード密度高い(可変長命令)中程度中程度(C拡張で向上)
デコーダ複雑度非常に高い中程度低い
エコシステム非常に成熟成熟急成長中
主な用途PC, サーバーモバイル, 組み込み, サーバー組み込み, IoT, 教育, サーバー
消費電力効率低〜中高い高い(実装依存)

6.2 命令セットの違いを詳細に比較

3つのISAは命令のエンコード方式、構造、実行モデルにおいて根本的に異なる。本セクションでは、これらの違いを深掘りする。

6.2.1 命令エンコーディングの設計思想

x86-64(可変長、1〜15バイト):
┌──────────┬─────────┬────────┬─────┬──────────────┬──────────┐
│プレフィックス│ オペコード│ ModR/M │ SIB │ディスプレイスメント│ 即値     │
│ 0-4 B    │ 1-3 B   │ 0-1 B  │0-1B │ 0/1/2/4 B    │ 0/1/2/4B │
└──────────┴─────────┴────────┴─────┴──────────────┴──────────┘
  → 複雑なデコーダが必要、コード密度は高い

AArch64(固定32ビット):
┌──────────┬──────┬──────┬──────┬──────┐
│  opcode  │  Rm  │ shift│  Rn  │  Rd  │    (データ処理)
│31      21│20  16│15  10│9    5│4    0│
└──────────┴──────┴──────┴──────┴──────┘
  → シンプルなデコーダ、整然としたエンコーディング

RISC-V(固定32ビット + オプションの16ビット圧縮命令):
┌───────┬─────┬─────┬──────┬─────┬─────────┐
│ funct7│ rs2 │ rs1 │funct3│ rd  │ opcode  │  (R型)
│31   25│24 20│19 15│14  12│11  7│6       0│
└───────┴─────┴─────┴──────┴─────┴─────────┘
  → 最もシンプルなデコーダ、6つの基本フォーマットによるモジュラー設計

エンコーディングの主要な違い

観点x86-64AArch64RISC-V
命令長1〜15バイト常に4バイト4バイト(C拡張で2バイト)
エンコード形式数数百パターン約10カテゴリ6つの基本形式(R/I/S/B/U/J)
オペコード位置可変固定ビット [31:25]固定ビット [6:0]
レジスタフィールドModR/M+SIBに埋め込み固定位置固定位置
即値エンコーディング命令末尾フィールドに分散分散(符号拡張)
デコード複雑度非常に高い(μop分解)中程度低い
デコーダのトランジスタ比率フロントエンドの約30-40%約15-20%約5-10%

6.2.2 アドレッシングモード

x86は最も豊富なアドレッシングモードをサポートし、RISC-Vは最も制約が強い:

x86-64 アドレッシングモード(1命令内で使用可能):
  [base]                     → MOV RAX, [RBX]
  [base + disp]              → MOV RAX, [RBX + 16]
  [base + index]             → MOV RAX, [RBX + RCX]
  [base + index*scale]       → MOV RAX, [RBX + RCX*8]
  [base + index*scale + disp]→ MOV RAX, [RBX + RCX*8 + 16]
  [RIP + disp32]             → MOV RAX, [RIP + offset]  (PC相対)
  → ALU命令でメモリオペランドを直接指定可能

AArch64 アドレッシングモード:
  [base]                     → LDR X0, [X1]
  [base, #imm]               → LDR X0, [X1, #16]
  [base, Rm]                 → LDR X0, [X1, X2]
  [base, Rm, extend/shift]   → LDR X0, [X1, X2, LSL #3]
  [base, #imm]!              → LDR X0, [X1, #16]!     (プリインデックス)
  [base], #imm               → LDR X0, [X1], #16      (ポストインデックス)
  literal (PC相対)           → LDR X0, =label
  → ロード/ストア専用命令だが、柔軟なインデクシング

RISC-V アドレッシングモード:
  base + imm12               → LW a0, 16(a1)          (ロード)
  base + imm12               → SW a0, 16(a1)          (ストア)
  PC + imm20                 → AUIPC a0, %pcrel_hi(sym) (PC相対)
  → 命令タイプごとに1つのアドレッシングモードのみ
  → インデックスレジスタやスケーリングなし — コンパイラが明示的にADDを生成

6.2.3 命令カテゴリ別の比較

算術演算・論理演算

; === シフト付き加算: result = a + (b << 3) ===

; x86-64: 別途シフトが必要、またはLEAを流用
lea  rax, [rdi + rsi*8]         ; LEAでアドレス計算を流用

; AArch64: バレルシフタ内蔵
add  x0, x0, x1, lsl #3        ; シフト付きの1命令で完了

; RISC-V: 明示的なシフトが必要
slli a1, a1, 3                  ; 左に3ビットシフト
add  a0, a0, a1                 ; その後加算

メモリ操作

; === 2つの値をペアでロード ===

; x86-64: 2つの個別ロード(またはSIMDを使用)
mov  rax, [rdi]
mov  rbx, [rdi+8]

; AArch64: 専用のペアロード命令
ldp  x0, x1, [x0]              ; 2つの64ビット値を1命令でロード

; RISC-V: 2つの個別ロード(ベースISAにペアロードなし)
ld   a0, 0(a2)
ld   a1, 8(a2)

関数呼び出し規約

; === 関数呼び出し: int add(int a, int b) ===

; x86-64 (System V ABI):
;   引数: RDI, RSI, RDX, RCX, R8, R9(整数6レジスタ)
;   戻り値: RAX
;   呼び出し側退避: RAX, RCX, RDX, RSI, RDI, R8-R11
;   呼び出され側退避: RBX, RBP, R12-R15
mov  eax, edi
add  eax, esi
ret                             ; 結果はEAXに格納

; AArch64 (AAPCS64):
;   引数: X0-X7(整数8レジスタ)
;   戻り値: X0
;   呼び出し側退避: X0-X18
;   呼び出され側退避: X19-X28
add  w0, w0, w1
ret                             ; 結果はW0に格納

; RISC-V (呼び出し規約):
;   引数: a0-a7(整数8レジスタ)
;   戻り値: a0
;   呼び出し側退避: a0-a7, t0-t6, ra
;   呼び出され側退避: s0-s11
add  a0, a0, a1
ret                             ; 結果はa0に格納(jalr x0, ra, 0 の疑似命令)

ループ構造

; === 配列の合計: sum = 0; for (i = 0; i < n; i++) sum += arr[i]; ===

; x86-64(メモリオペランドを直接使用可能):
    xor  eax, eax              ; sum = 0
    xor  ecx, ecx              ; i = 0
.loop:
    add  eax, [rdi + rcx*4]   ; sum += arr[i](スケーリング付きインデックス!)
    inc  ecx
    cmp  ecx, esi
    jl   .loop

; AArch64:
    mov  w2, #0                ; sum = 0
    mov  w3, #0                ; i = 0
.loop:
    ldr  w4, [x0, w3, uxtw #2] ; arr[i](インデックススケーリング付き)
    add  w2, w2, w4
    add  w3, w3, #1
    cmp  w3, w1
    b.lt .loop

; RISC-V:
    li   a2, 0                 ; sum = 0
.loop:
    lw   a3, 0(a0)            ; arr[i] をロード
    add  a2, a2, a3           ; sum += arr[i]
    addi a0, a0, 4            ; ポインタをインクリメント(スケーリングなし)
    addi a1, a1, -1           ; カウンタをデクリメント
    bnez a1, .loop            ; ゼロでなければ分岐

アトミック操作

; === アトミック・コンペア&スワップ ===

; x86-64: 専用のCMPXCHG命令(CISCアプローチ)
    mov  eax, [expected]
    lock cmpxchg [rdi], esi   ; [rdi]==EAXなら[rdi]=ESI、そうでなければEAX=[rdi]

; AArch64: ロード排他/ストア排他ペア(RISCアプローチ)
.retry:
    ldaxr w2, [x0]           ; ロード取得排他
    cmp   w2, w1              ; 期待値と比較
    b.ne  .fail
    stlxr w3, w4, [x0]       ; ストア解放排他
    cbnz  w3, .retry          ; ストア失敗なら再試行
.fail:

; RISC-V: ロード予約/ストア条件付き(ARMと類似)
.retry:
    lr.w.aq a2, (a0)         ; ロード予約(取得)
    bne  a2, a1, .fail       ; 期待値と比較
    sc.w.rl a3, a4, (a0)     ; ストア条件付き(解放)
    bnez a3, .retry           ; ストア失敗なら再試行
.fail:

6.2.4 条件実行の違い

各アーキテクチャは条件処理を異なる方法で実現する:

x86-64:
  - CMP/TESTで条件フラグを設定(RFLAGS: ZF, CF, SF, OF)
  - 条件付きMOV(CMOVcc)で分岐を回避
  - SETccで条件結果を0/1として格納
  - 条件分岐(Jcc)でフラグをテスト
  CMP EAX, EBX
  CMOVG ECX, EDX       ; EAX > EBX なら ECX = EDX(分岐なし)

AArch64:
  - CMP, ADDS, SUBSで条件フラグを設定(NZCV)
  - 条件選択ファミリ(CSEL, CSINC, CSINV, CSNEG)
  - AArch64ではプレディケート実行なし(AArch32とは異なる)
  CMP W0, W1
  CSEL W2, W3, W4, GT  ; W0>W1 なら W2=W3、そうでなければ W2=W4

RISC-V:
  - 条件フラグレジスタなし
  - 条件分岐は2つのレジスタを直接比較
  - ベースISAに条件付きMOVなし(Zicond拡張で追加)
  - ブランチレスコードはSLT + 算術トリックが必要
  BLT a0, a1, label    ; a0 < a1 なら分岐(レジスタ直接比較)
  SLT a2, a1, a0       ; a2 = (a0 > a1) ? 1 : 0
メカニズムx86-64AArch64RISC-V
条件フラグRFLAGS(6フラグ)PSTATE/NZCV(4フラグ)なし
条件付きMOVCMOVcc(16種類)CSEL/CSINC/CSINV/CSNEGZicond拡張(CZERO.EQZ/NEZ)
条件分岐Jcc(フラグテスト)B.cond(フラグテスト)Bxx reg, reg(直接比較)
フラグ設定多くのALU演算で暗黙的に設定Sサフィックス付きのみフラグを設定しない

設計上のトレードオフ: x86/ARMは共有フラグを使用するため、フラグを設定する命令と読み取る命令の間に依存関係が生じる。RISC-Vはフラグを完全に排除し、この依存関係をなくすことでアウトオブオーダー実行を簡素化しているが、一部のパターンでは命令数が増える。

6.2.5 SIMD / ベクトル命令の比較

; === ベクトル加算: float c[N] = a[N] + b[N] ===

; x86-64(AVX2、固定256ビット):
    vmovups ymm0, [rdi]           ; a から8個のfloatをロード
    vaddps  ymm0, ymm0, [rsi]    ; b の8個のfloatを加算(メモリオペランド)
    vmovups [rdx], ymm0           ; c に8個のfloatをストア
    ; 端数(N % 8)はスカラーまたはマスク付きコードで処理が必要

; AArch64(SVE、スケーラブル 128〜2048ビット):
    whilelt p0.s, xzr, x3        ; アクティブレーンのプレディケートを設定
.loop:
    ld1w   z0.s, p0/z, [x0, x4, lsl #2]  ; プレディケート付きロード(a)
    ld1w   z1.s, p0/z, [x1, x4, lsl #2]  ; プレディケート付きロード(b)
    fadd   z0.s, z0.s, z1.s              ; ベクトル加算
    st1w   z0.s, p0, [x2, x4, lsl #2]    ; プレディケート付きストア(c)
    incw   x4                             ; ベクトル長分インクリメント
    whilelt p0.s, x4, x3                 ; プレディケート更新
    b.first .loop
    ; 端数はプレディケートマスクで自動処理

; RISC-V(RVV、スケーラブル 128〜65536ビット):
.loop:
    vsetvli t0, a3, e32, m1      ; 残り要素に応じたベクトル長を設定
    vle32.v v0, (a0)             ; a からロード
    vle32.v v1, (a1)             ; b からロード
    vfadd.vv v2, v0, v1          ; ベクトル加算
    vse32.v v2, (a2)             ; c にストア
    sub     a3, a3, t0           ; カウントをデクリメント
    ; ポインタ更新...
    bnez    a3, .loop
    ; 端数はvsetvliで自動処理
特性x86 AVX-512ARM SVE/SVE2RISC-V RVV
ベクトル幅固定512ビットスケーラブル 128-2048bitスケーラブル 128-65536bit
マスク/プレディケートk0-k7(8本のマスクレジスタ)p0-p15(プレディケートレジスタ)v0をマスクとして使用
端数処理手動(スカラー/マスク)自動(プレディケート)自動(vsetvli)
メモリオペランドALU命令内で使用可能ロード/ストア分離ロード/ストア分離
レジスタグルーピングなしなしLMUL(1/8〜8)
同一バイナリの可搬性なし(固定幅)あり(VLA)あり(VLA)
ギャザー/スキャッタありありあり

6.2.6 コード密度とバイナリサイズ

コード密度は、同じプログラムを表現するのに必要なバイト数を示す指標である:

相対バイナリサイズ(正規化、x86-64 = 1.00):

x86-64:           ████████████████████ 1.00(可変長命令でコンパクト)
AArch64:          ██████████████████████████ 1.30(固定32ビットはやや大きい)
RISC-V (RV64G):   ████████████████████████████ 1.40(複雑な命令がない)
RISC-V (RV64GC):  ██████████████████████ 1.10(C拡張で差を縮める)
AArch64 + リテラル:████████████████████████ 1.20(定数プールがサイズ増加)

RISC-VのC(圧縮)拡張は、最も使用頻度の高い25命令を16ビット形式でエンコードし、コード密度をx86に近づける:

RISC-V C拡張の例:
  c.add  a0, a1       → 16ビット(32ビットADDの代替)
  c.lw   a0, 0(a1)    → 16ビット(32ビットLWの代替)
  c.li   a0, 5        → 16ビット(32ビットADDIの代替)
  c.j    label         → 16ビット(32ビットJALの代替)
  c.beqz a0, label     → 16ビット(32ビットBEQの代替)

6.2.7 命令セット設計のトレードオフまとめ

設計上の選択x86-64AArch64RISC-V
デコーダのHWコスト最高(複雑なμop分解)中程度最低
コード密度最高(可変長)良好良好(C拡張付き)
コンパイラの複雑度高い(特殊ケースが多い)中程度低い(直交性が高い)
メモリ直接ALU演算あり(CISC遺産)なし(ロード/ストア)なし(ロード/ストア)
バレルシフタ内蔵限定的(LEA, シフト)全面的(全データ処理命令)なし(明示的シフト)
即値範囲8/16/32ビット12ビット+シフト12ビット(I型)、20ビット(U型)
カスタム拡張不可能不可能コア設計思想
バイナリ互換性45年以上(8086→現在)約10年(AArch64)約15年(拡大中)

6.3 性能比較

シングルスレッド性能(SPEC CPU 2017 推定スコア, 2024年時点):

プロセッサSPECintSPECfpTDP
Intel i9-14900K (Pコア, x86)~105~130253W
AMD Ryzen 9 9950X (Zen 5, x86)~110~140170W
Apple M4 Pro (ARM)~105~125~30W
Qualcomm Snapdragon X Elite (ARM)~80~90~23W
AWS Graviton4 (ARM, サーバー)~85~95N/A
SiFive P870 (RISC-V)~50*~55*N/A

*RISC-Vはまだ高性能実装が限定的で、性能差は主にマイクロアーキテクチャの成熟度による

電力効率(性能/ワット比較):

性能/ワット(相対比、Apple M4 = 100):

Apple M4 Pro (ARM):          ████████████████████ 100
Qualcomm X Elite (ARM):      ████████████████ 80
AWS Graviton4 (ARM):         ███████████████ 75
AMD Zen 5 (x86):             ████████████ 60
Intel Raptor Lake (x86):     ████████ 40

※サーバーワークロードでの概算。実際のワークロードにより大きく変動

6.4 メモリモデルの比較

メモリ順序の強さ:

x86 (TSO)     ████████████████████ 強い
              Store→Load以外のリオーダなし
              マルチスレッドプログラミングが容易

ARMv8         █████████ 弱い
              ほぼすべてのリオーダが可能
              バリア命令(DMB, DSB, ISB)が必要

RISC-V (RVWMO)████████ 弱い(ARMとほぼ同等)
              fence命令でバリアを制御
              Ztso拡張でTSOモードも可能

弱いモデルの利点: ハードウェアが自由に最適化可能→省電力
強いモデルの利点: プログラミングが容易、バグが少ない

6.5 エコシステム比較

観点x86ARMRISC-V
OS対応Windows, Linux, macOS, BSDLinux, Android, iOS, WindowsLinux, Android, FreeBSD
コンパイラGCC, LLVM, MSVC, ICCGCC, LLVM, ARM CompilerGCC, LLVM
仮想化KVM, Hyper-V, VMwareKVM, XenKVM(開発中)
コンテナDocker(ネイティブ)Docker(ネイティブ)Docker(実験的)
クラウドAWS, Azure, GCPAWS Graviton, Azure Cobalt限定的
開発ツール非常に充実充実急速に改善中
デバッガGDB, LLDB, WinDbgGDB, LLDB, ARM DSGDB, LLDB
市場シェアPC 90%+, サーバー 80%+モバイル 99%+組み込み急成長中

6.6 セキュリティ機能の比較

機能x86ARMRISC-V
TEEIntel SGX/TDX, AMD SEVTrustZone, CCAKeystone, MultiZone
メモリ安全性MPX(廃止), CETPAC, MTE, BTIPMP, ePMP
ポインタ認証なしPAC (ARMv8.3)Zicfiss(提案中)
メモリタグなしMTE (ARMv8.5)なし(提案中)
制御フローCET (IBT+SS)BTI + PACZicfilp + Zicfiss
暗号化メモリTME/MKTME, SEV-SNPRME/CCAなし(提案中)

7. マルチコアとヘテロジニアスコンピューティング

7.1 マルチコアの進化

シングルコアの限界(2000年代前半):
- 消費電力の壁(Power Wall)
- メモリの壁(Memory Wall)
- ILP(命令レベル並列性)の壁

→ マルチコア化による解決

コア数の進化:
2005: デュアルコア (Intel Core Duo)
2006: クアッドコア (Intel Core 2 Quad)
2017: 8コア (AMD Ryzen 7 1800X)
2019: 16コア (AMD Ryzen 9 3950X)
2022: 24コア (Intel i9-13900K, Hybrid)
2024: 192コア (AMD EPYC 9965, サーバー)
2024: 128コア (Ampere AmpereOne, ARM サーバー)

7.2 big.LITTLE / ハイブリッドアーキテクチャ

ARM big.LITTLE / DynamIQ:
┌────────────────────────────────────────┐
│ ┌────────┐ ┌────────┐                 │
│ │ Cortex │ │ Cortex │  ← big コア     │
│ │  X925  │ │  A725  │    (高性能)     │
│ └────────┘ └────────┘                 │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐     │
│ │A520 │ │A520 │ │A520 │ │A520 │ ← LITTLE│
│ │     │ │     │ │     │ │     │  (省電力)│
│ └─────┘ └─────┘ └─────┘ └─────┘     │
│ ┌────────────────────────────────┐   │
│ │        共有 L3 Cache            │   │
│ └────────────────────────────────┘   │
└────────────────────────────────────────┘

Intel Hybrid Technology:
P-Core (Performance): 高IPC、ハイパースレッディング対応
E-Core (Efficient):   省電力、高密度配置

Apple Silicon:
Firestorm (P) + Icestorm (E) = M1
Everest (P) + Sawtooth (E)   = M4
→ GPUコア、Neural Engine、Media Engineも統合

7.3 NUMA(Non-Uniform Memory Access)

NUMAアーキテクチャ(マルチソケットサーバー):

┌──────────────────┐    ┌──────────────────┐
│   ソケット 0       │    │   ソケット 1       │
│  ┌──────────────┐│    │┌──────────────┐  │
│  │  CPU コア群   ││    ││  CPU コア群   │  │
│  └──────┬───────┘│    │└──────┬───────┘  │
│  ┌──────┴───────┐│    │┌──────┴───────┐  │
│  │ ローカルメモリ ││    ││ ローカルメモリ │  │
│  │  (DDR5)      ││    ││  (DDR5)      │  │
│  └──────────────┘│    │└──────────────┘  │
└────────┬─────────┘    └─────────┬────────┘
         │     インターコネクト     │
         │  (UPI / Infinity Fabric) │
         └─────────┬───────────────┘

ローカルメモリへのアクセス:   ~80ns
リモートメモリへのアクセス:  ~120-150ns (1.5-2倍遅い)

8. 最新トレンドと将来展望

8.1 チップレット技術

モノリシックダイ vs チップレット:

モノリシック:            チップレット:
┌──────────────┐       ┌─────┐ ┌─────┐
│              │       │CCD 1│ │CCD 2│  ← 最先端プロセス
│   全機能が    │       │5nm  │ │5nm  │     (コンピュート)
│   1つのダイ   │       └──┬──┘ └──┬──┘
│              │          │       │
│              │       ┌──┴───────┴──┐
└──────────────┘       │    IOD       │  ← 成熟プロセス
                       │   6/12nm    │     (I/O, メモリ)
                       └─────────────┘

利点:
- 歩留り向上(小さなダイ)
- コスト最適化(機能ごとに最適なプロセスノード)
- 柔軟な構成(コア数のスケーリング)

採用例:
- AMD EPYC (Zen): CCD + IOD
- Intel Meteor Lake: コンピュートタイル + SOCタイル + GFXタイル + IOタイル
- Apple M1 Ultra: 2つのM1 Maxを接続

8.2 3Dスタッキング

2D配置:              3Dスタッキング:
┌─────────────┐     ┌─────────────┐
│ L3 Cache    │     │ V-Cache     │ ← 追加キャッシュ
│             │     │ (64MB SRAM) │    3D接続
├─────────────┤     ├═════════════┤
│ CPU コア群   │     │ CPU コア群   │
│             │     │             │
└─────────────┘     └─────────────┘

AMD 3D V-Cache: L3を3Dスタックで最大96MBに拡張
→ ゲーム性能で最大15%向上

8.3 専用アクセラレータの統合

現代のSoCの構成:

┌─────────────────────────────────────────────────┐
│                   SoC (System on Chip)            │
│                                                   │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐            │
│ │CPU コア群 │ │  GPU     │ │ NPU/     │            │
│ │(ARM/x86/ │ │          │ │ Neural   │            │
│ │ RISC-V)  │ │          │ │ Engine   │            │
│ └─────────┘ └─────────┘ └─────────┘            │
│                                                   │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐            │
│ │ メディア │ │ ISP      │ │ セキュリティ│           │
│ │エンコーダ │ │(イメージ  │ │エンジン   │           │
│ │/デコーダ │ │プロセッサ) │ │          │            │
│ └─────────┘ └─────────┘ └─────────┘            │
│                                                   │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐            │
│ │メモリ    │ │ PCIe/    │ │ WiFi/   │            │
│ │コントローラ││ USB/     │ │ 5G      │            │
│ │          │ │ Thunderbolt││ モデム   │            │
│ └─────────┘ └─────────┘ └─────────┘            │
└─────────────────────────────────────────────────┘

8.4 将来の展望

トレンド説明
UCIeチップレット間の標準インターコネクト
CXLCompute Express Link(メモリプーリング)
光インターコネクトチップ間光通信による帯域幅向上
RISC-V の台頭自動車、IoT、サーバーへの拡大
ARM サーバークラウドでの採用加速
量子コンピューティング古典CPUとの協調処理
ニューロモーフィック脳模倣型チップの発展
プロセスノード2nm (2025), 1.4nm (2026), Å世代へ

9. まとめ

9.1 アーキテクチャ選択ガイド

x86-64 を選ぶべき場面:

  • 既存のWindowsアプリケーションとの互換性が必要
  • 最高のシングルスレッド性能が必要
  • 成熟したソフトウェアエコシステムを活用したい
  • HPC/科学技術計算(AVX-512の活用)

ARM を選ぶべき場面:

  • 電力効率が最重要(モバイル、エッジ)
  • クラウドサーバーのコスト最適化(Graviton等)
  • モバイルデバイス向け開発
  • 高い性能/ワット比が求められる場面

RISC-V を選ぶべき場面:

  • ライセンスフリーでカスタムCPUを設計したい
  • 組み込みシステムでコスト最小化
  • 教育・研究用途
  • 特定用途向けにISAをカスタマイズしたい
  • ベンダーロックインを避けたい

9.2 総括

CPUアーキテクチャの世界は、長年にわたるx86の支配から、ARM・RISC-Vとの三つ巴の競争時代に移行しつつある。

  • x86 はデスクトップ・サーバー市場で依然として圧倒的だが、電力効率の課題に直面している。Intel/AMDはハイブリッドアーキテクチャやチップレット技術で対応中
  • ARM はモバイルの覇者から、Apple Silicon、AWS Graviton、NVIDIA Graceの成功により、PC・サーバー市場にも進出。電力効率の優位性が競争力の源泉
  • RISC-V はオープンなISAとして急速に成長し、組み込み・IoTでの採用が加速。サーバー・HPC向けの高性能実装も登場し始めており、長期的にはARMの領域にも進出する可能性がある

ムーアの法則の鈍化に伴い、アーキテクチャの革新——ドメイン特化アクセラレータ、チップレット、3Dスタッキング、新しいメモリ技術——がますます重要になっている。3つのアーキテクチャはそれぞれの強みを活かしながら、今後も進化を続けるだろう。