Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonのcopy-and-patch JITの実装を読む

Avatar for Arata Arata
October 03, 2025
11

Pythonのcopy-and-patch JITの実装を読む

Avatar for Arata

Arata

October 03, 2025
Tweet

Transcript

  1. 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
  2. 2025/10/02 コンパイラのコンパの部分 #01 @Arata copy-and-patchと呼ばれる仕組みを用いてJITを実装している Pythonビルド時: インタプリタのコードから各命令のステンシルを作成 1. インタプリタのコードから各命令の実行処理を抽出 2.

    各命令の実行処理をそれぞれコンパイル 3. コンパイル結果からステンシル作成 Pythonコード実行時: ステンシルを使ってJITコンパイル 1. 各命令に対応するステンシルをコピー 2. ステンシル中の一部にパッチを当てる PythonのJIT実装 4
  3. 2025/10/02 コンパイラのコンパの部分 #01 @Arata 結局何ができたのか? • 「あるバイトコード命令を実行する機械語」を生成する関数が全ての 命令について手に入った • これを命令ごとに呼び出せばバイトコードを機械語に変換できる

    → JITコンパイル達成 copy-and-patchの名前の由来は? • JITコンパイル時にステンシルをコピー&パッチするため • パッチは実行時に決まるオペランド、外部シンボルの参照等で必要 まとめ 12
  4. 2025/10/02 コンパイラのコンパの部分 #01 @Arata 余談: PyTorchのJITコンパイラ(TorchDynamo)も面白い 概要 • PEP 523で評価器を差し替えて、実行されたテンソル演算をトレース

    • トレースから計算グラフを構築してコンパイル • 特殊化のため、コンパイルされたコードから参照する変数の値が変化 していないことを実行時に検証する仕組みがある 終わりに 13
  5. 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