バイナリより低レイヤな話 (プロセッサの心を読み解く) -...

56
バイナリより低レイヤな話 @hktechno

Upload: hirotaka-kawata

Post on 25-May-2015

1.967 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

バイナリより低レイヤな話

@hktechno

Page 2: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

@hktechno

川田 裕貴 (かわたひろたか)● 筑波大学に4月から入院中 (元coins09-AC)

○ システム情報工学研究科

コンピュータサイエンス専攻○ 実時間組み込みアーキテクチャ研究室

● Open Design Computer Project○ IPA 未踏 2011 スーパーなんとか

● トプスなんとかっていう会社でバイト中○ LLVM-IR と最近戯れている

● PyCon JP 2014 プログラムチーム

Page 3: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Open Design Computer Project

http://open-arch.org/● mist32 という自作CPUを作っている

○ 32bit Out of Order RISC コア○ In-order 版もあるよ○ FPGA (DE2-115, DE3) 上で動く

● CPU マニアと一緒にやっている○ @cpu_labs

● 自分はソフトウェアを作っている○ gcc, binutils, newlib...○ 最近 xv6 OS が動いた (実機は微妙)

Page 4: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

今日の忘れ物

Page 5: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤ

低レイヤ感の違い

● hktechno: 低レイヤ好きな人いなくて● ???: 低レイヤ?うちにもいるよ?

● hktechno: どんなことやってるんですか?● ???: ほら、C++ とか

Page 6: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤ 検索

低レイヤ 検索

Page 7: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤー入門

● http://www.slideshare.net/demuyan/ss-19333584

疑問

● C が使えたら低レイヤなのか● バイナリが喋れたら低レイヤなのか● 低レイヤとはなにか

Page 8: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤとは

システムソフトウェア

VM

OS kernel

アセンブラ

バイナリ

カーネル/VM 的低レイヤ

Eject

アプリケーション

Page 9: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最低レイヤはなにか

バイナリは、最低レイヤでしょうか?

Page 10: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

バイナリが喋れればかっこいいか?

バイナリが喋れるだけで、満足していませんか

相手の心もわかっていないのに

Page 11: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤ

自作コンピューター感の違い

● hktechno: コンピューターを自作してます● ???: 最近自作しなくなったなー

● hktechno: えっ● ???: えっ

Page 12: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤとは システムソフトウェア

VM

OS kernel

アセンブラ

バイナリ

プロセッサ

本来の低レイヤ

Page 13: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤとは システムソフトウェア

VM

OS kernel

アセンブラ

バイナリ

プロセッサ

低レイヤ

Page 14: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤとは システムソフトウェア

VM

OS kernel

アセンブラ

バイナリ

プロセッサCPUマニアが考える低レイヤ

Page 15: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

低レイヤを知るなら...

バイナリだけ出来てもプロセッサは口説けない

そうだ、低レイヤを極めよう

Page 16: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

プロセッサの心を読み解く

# 前振りが長かった

Page 17: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

プロセッサの違い

● Intel 第4世代 Core アーキテクチャ○ Haswell (tock), Broadwell (tick)

● Intel 第3世代 Core アーキテクチャ○ Sandy Bridge (tock), Ivy Bridge (tick)

違いは何ですか?

● AVX2● TSX (HTM)● ???

Page 18: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

SandyBridge -> Haswell

誰も気にしてくれない進化

● 演算ポートが2つ追加○ Integer ALU + Branch○ AGU for stores

● Branch prediction unit の改良● Reservation station の拡張● Re-order buffer の拡張● Physical register file の拡張

そもそもなんだかわからない

Page 19: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

プロセッサのブロック図を眺めてみる

わかってそうで、わかってない内部構造

● Execution Ports● Out of Order Execution● Branch prediction● x86 を中心に色々眺めてみる

明日から使えるムダ知識

Page 20: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

基本的なパイプライン

● Instruction Fetch● Instruction Decode● Execution

○ Memory Access● Write Back

Page 21: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

● Instruction Fetch● Instruction Buffer● Instruction Decode● Dispatch● Execution

MIST32 (In-order: MIST1032ISA)

IB

Page 22: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

ここまでが、インオーダーの話

ここから、アウトオブオーダーの話

Page 23: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

実行ポート4個 OoOな領域

2命令同時 Fetch Decode …(Super- Scalar)

Page 24: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

mov eax, [eax]xor ebx, ebxadd ebx, eaxinc ecxadd eax, ecx

Load (遅い)

↑の命令とは依存がない

↑の命令とは依存がない

Page 25: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

mov eax, [eax]xor ebx, ebxadd ebx, eaxinc ecxadd eax, ecx

Load (遅い)

↑の命令とは依存がない

↑の命令とは依存がない

12323

命令の順番を入れ替えても構わないしかも、開いてるポートに並列に実行できる

Page 26: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

非順序実行

● 実行できる命令から実行する

プロセッサがやらなければならないこと

1. 命令の依存関係を知る2. 命令をバッファする3. 実行できる命令から実行する4. どの命令が終わったかを知る5. 本来の順序でレジスタへコミットする

Page 27: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

● Out of Order○ Intel P6 から実装 (Pentium Pro)○ Intel Atom (Silvermont から実装)○ ARM Cortex-A9 から実装○ mist32

■ ただし Load/Store OoO は未実装

● In Order○ Intel Atom (初代 Bonnell)○ ARM Cortex-A7 以前

速くはなるが回路規模は大きくなる

Page 28: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

更に深く進んでみる

Page 29: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

● Register Renaming○ 物理レジスタを仮想レジスタにリネームする○ 命令の依存をより少なくできる○ (アウトオブオーダー実行に必須ではないが...)

mov eax, [eax]inc eaxmov [eax], eaxmov eax, ebxmov eax, [eax]

同じ eax レジスタだが、依存はない

← 先に実行可能

Page 30: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Out of Order Execution

代表的な OoO の実装

● Reorder Buffer○ 命令のコミットを制御するバッファ○ 演算の結果は一度ここへ書かれる

● Reservation Station○ 命令の依存関係を待つところ

○ ソースレジスタが利用可能かを監視して、

実行可能であれば実行を開始する○ Unified な方式、実行ポートごとに持たせる方式

Page 31: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Reorder Buffer (の一例)

Reorder Buffer Stage 1. 割り当て

Writeback Stage

2. 結果の書き込み

Retire / Commit

Reorder Buffer

Register File

3. コミット

Page 32: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Reservation Station (の一例)

Reservation Station

命令1 SRC1 NG

SRC2 OK

命令2 NG NG

命令3 OK NG

命令4 OK OK

Reorder Buffer,Register File

Execution ステージへ

Page 33: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

息抜きに、x86 のブロック図を眺めてみよう

Page 37: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

uOPs (micro-OPs)

みんな知ってる?

カーネル/VM では説明不要

Page 38: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最近? の uOPs

● Micro-OPs Fusion○ Fused Micro-OP○ 一部 uOP をまとめてパイプラインに流す

■ uOP 帯域の削減

● Macro-OPs Fusion○ 複数の x86 命令をまとめる○ 例えば CMP + Jxx○ Macro-OP レベルの並列性を向上

■ 少ないデコーダで実現

Page 39: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Branch prediction

分岐予測

● ブランチは厄介○ taken / not taken は直前になるまでわからない○ ミスするとパイプラインをフラッシュしてやり直し

■ すごい大きなペナルティになる○ ブランチするかしないか、予測する必要がある

分岐予測以外のアイデア

● Condition-Code (ARM)○ AArch64 では消え去りました

Page 40: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Branch prediction

mov eax, [eax]cmp eax, 0je is_zero......is_zero:...

実行完了するまで 分岐するかわからない

Page 41: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Branch prediction

● 分岐予測がアツイ (らしい)○ 電力があまり食わない上に性能向上に直結する○ Intel の 3% ルール○ 最近もいろいろな変更がある (ただし企業秘密?)

● 基本的な分岐予測○ 分岐しない (or する) 方向で常に予測しておく

■ 486○ 前回分岐した結果を保存しておく○ ループを検出する○ ...

Page 42: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Branch prediction

● Bi-modal counter○ よく branch するループは strongly taken に○ ほとんど branch しない場合は stolongly not taken○ 一度だけならいつもと違う動作をしても予測できる

Page 43: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

Branch prediction

● Loop detector○ n 回目で必ず分岐するなら、n を記憶しておく○ 過去 n 回の分岐パターンを記憶する

● Global branch predictor○ ある特定の分岐をそれぞれ記憶するのではなく、

すべての分岐のパターンを記憶しておく○ 周りの分岐命令との相関関係

最近のプロセッサは、ハイブリッド分岐予測器

● Bimodal + Loop detector + Global● どれか有効なものを使用する

Page 44: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最近の x86 のブロック図を眺めてみよう

Page 45: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

ブロック図を読み解く

Page 46: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Page 49: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最近の Intel のプロセッサ

● Zeroing Idioms○ xor eax, eax のような命令をゼロレジスタに、

リネームする

● uOP Cache○ uOp の変換をキャッシュする○ フロントエンドが眠ることができる○ Intel のデコーダはでかい

■ でかいデコーダを眠らせると電力効率アップ

● 実行ポートの増加○ ブランチユニット、AGU が増えた

Page 50: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最近の Intel プロセッサ

他にも...● Physical Register File

○ 物理レジスタファイルへ直接書き込む○ 待ち受け命令への ROB からのコピーを削減

● 分岐予測機のさらなる改良○ 詳細不明、エントリが増えてるなど

● ROB, RS のエントリの追加● Macro-Fusion の命令の追加

Page 51: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

最近の Intel のプロセッサ

● デコードの隠蔽に力を入れているっぽい○ x86 のクソ命令セットが重い○ デコーダに負担がかかる

■ デコーダ回路もでかい + 電力食い○ いかにデコーダを回さないか

■ uOP Cache■ uOP レベルでの分岐予測

● なぜ、あんなに性能が出るのか○ 命令セットはクズなのに○ Intel すごすぎ

Page 52: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

ただし、Intel に x86 以外を作らせると...

Page 53: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Page 56: バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1

まとめ

● マイクロアーキテクチャの進化○ まだまだ続きそう○ だけど Intel の独壇場的な感じもする

● 世代・メーカーで結構違う○ Intel と AMD のポートのもたせ方の違いとか