Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Pythonのcopy-and-patch JITの実装を読む
Search
Arata
October 03, 2025
110
0
Share
Pythonのcopy-and-patch JITの実装を読む
Arata
October 03, 2025
More Decks by Arata
See All by Arata
コンパイラ基盤を支える言語たち
arata_nvm
1
34
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
10
5分でわかるPage-Fault Weird Machine
arata_nvm
1
150
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
13
eBPFを使った動的解析手法
arata_nvm
1
760
カーネルハック実験の振り返り
arata_nvm
1
52
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
44
コードエディターのシンタックスハイライトの話
arata_nvm
0
210
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
95
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
94
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
199
73k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
160
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
520
How to build a perfect <img>
jonoalderson
1
5.4k
Practical Orchestrator
shlominoach
191
11k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
Ruling the World: When Life Gets Gamed
codingconduct
0
210
We Are The Robots
honzajavorek
0
220
WENDY [Excerpt]
tessaabrams
10
37k
Transcript
copy-and-patch JITを書く Pythonのcopy-and-patch JITの 実装を読む 2025/10/03 コンパイラのコンパの部分 #01 @Arata
2025/10/02 コンパイラのコンパの部分 #01 @Arata 背景: Python 3.13での試験的なJITの導入 2
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python 3.11: PEP659 - Specializing Adaptive
Interpreter • 汎用的な命令から特定の型に特化した命令へ実行時に書き換える ◦ e.g. x + 1: BINARY_OP(ADD) -> BINARY_OP_ADD_INT • データの型、よく実行される経路などのプロファイルも取る Python 3.12: DSLからのインタプリタ生成 • バイトコードのセマンティクスがより明確に Python 3.13ではこれらのプロファイラやDSLがJIT実装の基礎となった 背景: Faster CPythonの道のり 3
2025/10/02 コンパイラのコンパの部分 #01 @Arata copy-and-patchと呼ばれる仕組みを用いてJITを実装している Pythonビルド時: インタプリタのコードから各命令のステンシルを作成 1. インタプリタのコードから各命令の実行処理を抽出 2.
各命令の実行処理をそれぞれコンパイル 3. コンパイル結果からステンシル作成 Pythonコード実行時: ステンシルを使ってJITコンパイル 1. 各命令に対応するステンシルをコピー 2. ステンシル中の一部にパッチを当てる PythonのJIT実装 4
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python/bytecodes.c (DSL)からPython/executor_cases.c.h (C)を生成 巨大なswitch-caseになる Pythonビルド時: インタープリタのコード生成
5 Python/bytecodes.c Python/executor_cases.c.h
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python/executor_cases.c.hから正規表現で各命令の実装コードを抽出 Pythonビルド時: インタプリタからコード抽出 6 Tools/jit/_targets.py Python/execuor_cases.c.h
抽出対象
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシル作成 7 抽出した各命令の実装コードをテンプレートに挿入・コンパイル 実行時に決まる値はテンプレートで外部シンボルとして定義 コード挿入場所→
Tools/jit/template.c
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシルの最適化 8 ステンシルをアセンブリレベルで最適化 • 条件分岐命令でホットパスをフォールスルー側に配置
• 冗長な条件分岐命令の削除 Tools/jit/_optimizers.py
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシルのホール作成 9 実行時に決まる値=外部シンボルの参照には再配置エントリがあるはず それらの参照位置と参照シンボルを記録 Tools/jit/_stencils.py
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ヘッダーファイルの作成 10 ここまででステンシルの情報が集まったので、JITコンパイルに使う 関数たちを生成
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ヘッダーファイルの作成 11 ここまででステンシルの情報が集まったので、JITコンパイルに使う 関数たちを生成 ここではUNARY_NOTの例を紹介
ステンシルのアセンブリ UNARY_NOTの例 ステンシルのバイト列 code + data ステンシルのコピー&パッチ False,Trueへの参照を解決
2025/10/02 コンパイラのコンパの部分 #01 @Arata 結局何ができたのか? • 「あるバイトコード命令を実行する機械語」を生成する関数が全ての 命令について手に入った • これを命令ごとに呼び出せばバイトコードを機械語に変換できる
→ JITコンパイル達成 copy-and-patchの名前の由来は? • JITコンパイル時にステンシルをコピー&パッチするため • パッチは実行時に決まるオペランド、外部シンボルの参照等で必要 まとめ 12
2025/10/02 コンパイラのコンパの部分 #01 @Arata 余談: PyTorchのJITコンパイラ(TorchDynamo)も面白い 概要 • PEP 523で評価器を差し替えて、実行されたテンソル演算をトレース
• トレースから計算グラフを構築してコンパイル • 特殊化のため、コンパイルされたコードから参照する変数の値が変化 していないことを実行時に検証する仕組みがある 終わりに 13
2025/10/02 コンパイラのコンパの部分 #01 @Arata • https://peps.python.org/pep-0659/ • https://peps.python.org/pep-0744/ • https://github.com/python/cpython/tree/main/Tools/jit
• https://www.youtube.com/watch?v=HxSHIpEQRjs • https://docs.pytorch.org/docs/stable/torch.compiler_dynamo_ov erview.html 参考文献 14