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もバージョンアップとともに命令セットが複雑化している。
| 特性 | CISC | RISC |
|---|---|---|
| 命令の複雑さ | 高い | 低い |
| 命令長 | 可変 | 固定(通常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-A53 | 8段 |
| ARM Cortex-A78 | 13段 |
| 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-A78 | 160エントリ |
| Apple M4 (Pコア) | 推定600+エントリ |
| AMD Zen 5 | 448エントリ |
| 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の命令セット拡張の歴史:
| 拡張 | 年代 | 機能 |
|---|---|---|
| MMX | 1997 | 64bit SIMD(整数) |
| SSE | 1999 | 128bit SIMD(浮動小数点) |
| SSE2 | 2001 | 128bit SIMD(整数+倍精度浮動小数点) |
| SSE3/SSSE3 | 2004-2006 | 水平演算等の追加 |
| SSE4.1/4.2 | 2006-2008 | 文字列処理、CRC32等 |
| AVX | 2011 | 256bit SIMD |
| AVX2 | 2013 | 256bit 整数SIMD |
| AVX-512 | 2016 | 512bit SIMD(マスク操作付き) |
| AMX | 2023 | 行列演算(AI向け) |
| AVX10 | 2024 | AVX-512の統一版 |
| APX | 2024+ | 汎用レジスタ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実装
| 実装者 | コア名 | 用途 |
|---|---|---|
| ARM | Cortex-A520 | 高効率(スマホの省電力コア) |
| ARM | Cortex-A725 | バランス(スマホの中間コア) |
| ARM | Cortex-X925 | 高性能(スマホのプライムコア) |
| Apple | Firestorm/Avalanche (M1) | Mac/iPad |
| Apple | Everest/Sawtooth (M4) | Mac/iPad |
| Qualcomm | Oryon (Snapdragon X Elite) | ノートPC |
| NVIDIA | Grace | サーバー/HPC |
| AWS | Graviton4 | クラウドサーバー |
| Ampere | AmpereOne | クラウドサーバー |
| 富士通 | 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は以下の設計原則に基づいている:
- モジュラー設計: 基本命令セット + 標準拡張の組み合わせ
- クリーンスレート設計: 過去の互換性に縛られない
- シンプルさ: 基本ISA(RV32I)はわずか47命令
- 拡張性: カスタム拡張を自由に追加可能
- オープンスタンダード: 特許やライセンス料なし
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実装
| 実装者 | チップ名 | コア | 用途 |
|---|---|---|---|
| SiFive | P670/P870 | 高性能OoO | アプリケーションプロセッサ |
| Tenstorrent | Ascalon | 高性能OoO | サーバー/AI |
| Alibaba (T-Head) | C910/C920 | OoO | サーバー/エッジ |
| SpacemiT | X60 | OoO | ノートPC/タブレット |
| Esperanto | ET-SoC-1 | 1000+コア | AI/HPC |
| Bouffalo Lab | BL602/BL808 | 組み込み | IoT/WiFi |
| GigaDevice | GD32VF103 | 組み込み | MCU |
| StarFive | JH7110 | OoO | SBC(VisionFive 2) |
6. x86 vs ARM vs RISC-V 徹底比較
6.1 アーキテクチャ比較表
| 特性 | x86-64 | AArch64 (ARMv9) | RISC-V (RV64GC) |
|---|---|---|---|
| 設計思想 | CISC(内部RISC) | RISC | RISC |
| ライセンス | 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 + VMX | EL0-EL3 | M/S/U/HS |
| エンディアン | リトルのみ | バイエンディアン | リトルのみ(標準) |
| 仮想化 | VT-x/AMD-V | EL2 | H拡張 |
| セキュリティ | SGX/TDX/SEV | TrustZone, PAC, MTE, CCA | PMP, 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-64 | AArch64 | RISC-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-64 | AArch64 | RISC-V |
|---|---|---|---|
| 条件フラグ | RFLAGS(6フラグ) | PSTATE/NZCV(4フラグ) | なし |
| 条件付きMOV | CMOVcc(16種類) | CSEL/CSINC/CSINV/CSNEG | Zicond拡張(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-512 | ARM SVE/SVE2 | RISC-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-64 | AArch64 | RISC-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年時点):
| プロセッサ | SPECint | SPECfp | TDP |
|---|---|---|---|
| Intel i9-14900K (Pコア, x86) | ~105 | ~130 | 253W |
| AMD Ryzen 9 9950X (Zen 5, x86) | ~110 | ~140 | 170W |
| Apple M4 Pro (ARM) | ~105 | ~125 | ~30W |
| Qualcomm Snapdragon X Elite (ARM) | ~80 | ~90 | ~23W |
| AWS Graviton4 (ARM, サーバー) | ~85 | ~95 | N/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 エコシステム比較
| 観点 | x86 | ARM | RISC-V |
|---|---|---|---|
| OS対応 | Windows, Linux, macOS, BSD | Linux, Android, iOS, Windows | Linux, Android, FreeBSD |
| コンパイラ | GCC, LLVM, MSVC, ICC | GCC, LLVM, ARM Compiler | GCC, LLVM |
| 仮想化 | KVM, Hyper-V, VMware | KVM, Xen | KVM(開発中) |
| コンテナ | Docker(ネイティブ) | Docker(ネイティブ) | Docker(実験的) |
| クラウド | AWS, Azure, GCP | AWS Graviton, Azure Cobalt | 限定的 |
| 開発ツール | 非常に充実 | 充実 | 急速に改善中 |
| デバッガ | GDB, LLDB, WinDbg | GDB, LLDB, ARM DS | GDB, LLDB |
| 市場シェア | PC 90%+, サーバー 80%+ | モバイル 99%+ | 組み込み急成長中 |
6.6 セキュリティ機能の比較
| 機能 | x86 | ARM | RISC-V |
|---|---|---|---|
| TEE | Intel SGX/TDX, AMD SEV | TrustZone, CCA | Keystone, MultiZone |
| メモリ安全性 | MPX(廃止), CET | PAC, MTE, BTI | PMP, ePMP |
| ポインタ認証 | なし | PAC (ARMv8.3) | Zicfiss(提案中) |
| メモリタグ | なし | MTE (ARMv8.5) | なし(提案中) |
| 制御フロー | CET (IBT+SS) | BTI + PAC | Zicfilp + Zicfiss |
| 暗号化メモリ | TME/MKTME, SEV-SNP | RME/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 | チップレット間の標準インターコネクト |
| CXL | Compute 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つのアーキテクチャはそれぞれの強みを活かしながら、今後も進化を続けるだろう。