AIで5μsのJITコンパイルを実現、pgrustがSQLクエリを全てJITコンパイル
JIT Compiling Code in 5μs

従来、高速なJITコンパイラの作成はアセンブリの深い知識を要する難技とされ、本番DBで独自JITを持つ例はなかった。しかしAI支援により、pgrustではSQLクエリ毎に約5μsでJITコンパイルを実行し、大幅な高速化を実現した。本記事では、正規表現エンジンを例に、コピーアンドパッチ方式でARM64アセンブリを生成するJITコンパイラの実装を解説する。
pgrustのJITコンパイラは約5μsでコードをコンパイルし、SQLクエリの一部だけでなく全てをJITコンパイルできるようにしています。
HNでの議論
104- MaxBarraclough
2024年のブログ記事「Look ma, I wrote a new JIT compiler for PostgreSQL」[0]を思い出します。どちらの記事も、PostgresのLLVMベースのJIT[1]がコード生成に時間がかかることを嘆いています。
> JITコンパイラが珍しいのは、歴史的にJITコンパイラの実装が難しすぎて、それに見合う価値がなかったからだと思います。
それはゼロからJITを書く場合にのみ当てはまります。JIT自体は珍しくありません。LLVM(や他のフレームワーク)がよく使われているだけです。主要なインタプリタにはすべてJITコンパイラがあります。PCRE2にもJITコンパイラがあります。LLVMよりもはるかに高速なコード生成を行うJITフレームワークもあります:Cranelift、GNU Lightning、Mirなどです。これらがカスタムのcopy-and-patch JITよりも高速なコード生成ができるかは疑問ですが、LLVMよりははるかに高速でしょう。
[0] https://www.pinaraf.info/2024/03/look-ma-i-wrote-a-new-jit-c... 、議論: https://news.ycombinator.com/item?id=39742916
- agnishom
Russ Coxの正規表現エンジン実装に関する記事を勧めます:https://swtch.com/~rsc/regexp/
非常に参考になります。
- catlifeonmars
これは少しメタな話ですが、楽しく読めました。LLMを使って書かれた記事なのに、LLMが書いたように読めないのは新鮮です。
このアプローチを使って、私が実験しているJITファイアウォールのステンシルを生成できるかもしれません。
また、これを使ってeBPFバイトコードをその場で生成することもできるかもしれないと思いました。
- glum64
うーん、Common Lispでは、JITが利用可能なだけでなく、管理も可能です:プログラマーは何をコンパイルする価値があるかを自分で決められます。
実行時だけでなく、コードがコンパイルまたはロードされるときにもJITが利用可能です(つまり、コンパイルやロードの高速化を考えていますか?問題ありません。その高速化もネイティブマシンコードにコンパイルできます。そして、それを無限に繰り返せます...)。
- mgaunard
このアプローチの問題は、実際のJITコンパイルではなく、基本的な置換を伴うアセンブリテンプレートにすぎないことです。
LLVMを使わないことで、LLVMが行うすべての最適化を逃しています。
- malisper
著者です。投稿やpgrustについて質問があれば、お知らせください。
- glenjamin
pgrustは非常に興味深いですが、深い変更があるため、アップストリームに統合する実行可能な道はありません。最終目標は、広く採用されるほど堅牢にすることですか?
- hamilyon2
それを実現するために、copy-and-patchコンパイルを使用しています。