@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Stories from developing YJIT

rubykaigi.org

は、RubyのYJITでどんな挑戦をしてきたかの話でした。

最初はRubyのinstructionを1:1で機械語に置き換えるところか始めました。 Railsでは遅くなりました。 つぎにJIT部分をフロントエンドとバックエンドに分けました。

もう、この辺でわかりません。 フロントエンドとバックエンドにわけるとなにがうれしいのか、そもそもなんで1:1の変換で遅くなるのか? わかってないなりに続きを聞きました。

生成した機械語のコードが条件分岐を増やすので、CPUの予測がはずれやすくなりました。 その対策としてLazy Basic Block Versioningを導入しました。

「Lazy Basic Block Versioning」はJITに関連した発表で、ちょいちょい聞く単語です。 説明してくれてうれしいです。 わかりません。 なんかstubを使うらしいです。 ある変数の型が実行中に変わることが少ないので、変わらないと仮定して、stubでキャッシュして使い回す?

YJITはRubyよりinstructionsを減らしました。

instructionsもよくわからないんです。 Rubyがinstructions持っているのはわかるんですが、YJITも持っているのがわかりません。 YJITがinstructionsと機械語と持つようになったのが、フロントエンドとバックエンドにわけたという意味なのでしょうか?

  • cfp-sp (stack pointer)
  • cfp-pc (program counter)

サンプル見せて説明してくれたのですが、よくわかりません。 stackのなかみのメモリに書き出すみたいです。 でも、どんなときに書き出すのかとか、書き出すとなにがうれしいのかなどわかりませんでした。

追記

理解の参考になりそうなツイートを集めました。

20220918 追記

Ruby が YJIT でなんで速くなるのか? Lazy Basic Block Versioning をサクッと理解してみた - estie inside blog