ruby-changes:73443
From: Takashi <ko1@a...>
Date: Tue, 6 Sep 2022 15:49:24 +0900 (JST)
Subject: [ruby-changes:73443] 5b3bd91fcb (master): Add an option to lazily boot MJIT for experiments
https://git.ruby-lang.org/ruby.git/commit/?id=5b3bd91fcb From 5b3bd91fcba7224e9ece54c862dc96461cf4bf79 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Tue, 6 Sep 2022 12:33:51 +0900 Subject: Add an option to lazily boot MJIT for experiments You may use `RUBYOPT=--mjit=pause irb` to play with RubyVM::MJIT::C, control the boot timing of MJIT, or customize the implementation while paused. It's an undocumented feature for such experiments. --- mjit.c | 23 ++++++++++++++++++----- mjit.h | 4 +++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/mjit.c b/mjit.c index d25fa79d24..efb40216f5 100644 --- a/mjit.c +++ b/mjit.c @@ -1779,6 +1779,10 @@ mjit_setup_options(const char *s, struct mjit_options *mjit_opt) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1779 else if (opt_match_arg(s, l, "min-calls")) { mjit_opt->min_calls = atoi(s + 1); } + // --mjit=pause is an undocumented feature for experiments + else if (opt_match_noarg(s, l, "pause")) { + mjit_opt->pause = true; + } else { rb_raise(rb_eRuntimeError, "invalid MJIT option `%s' (--help will show valid MJIT options)", s); @@ -1870,11 +1874,15 @@ mjit_init(const struct mjit_options *opts) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1874 // rb_fiber_init_mjit_cont again with mjit_enabled=true to set the root_fiber's mjit_cont. rb_fiber_init_mjit_cont(GET_EC()->fiber_ptr); - // TODO: Consider running C compiler asynchronously - make_pch(); + // If --mjit=pause is given, lazily start MJIT when RubyVM::MJIT.resume is called. + // You can use it to control MJIT warmup, or to customize the JIT implementation. + if (!mjit_opts.pause) { + // TODO: Consider running C compiler asynchronously + make_pch(); - // Enable MJIT compilation - start_worker(); + // Enable MJIT compilation + start_worker(); + } } static void @@ -1920,6 +1928,11 @@ mjit_resume(void) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1928 return Qfalse; } + // Lazily prepare PCH when --mjit=pause is given + if (pch_status == PCH_NOT_READY) { + make_pch(); + } + if (!start_worker()) { rb_raise(rb_eRuntimeError, "Failed to resume MJIT worker"); } @@ -1993,7 +2006,7 @@ mjit_finish(bool close_handle_p) https://github.com/ruby/ruby/blob/trunk/mjit.c#L2006 mjit_dump_total_calls(); #endif - if (!mjit_opts.save_temps && getpid() == pch_owner_pid) + if (!mjit_opts.save_temps && getpid() == pch_owner_pid && pch_status != PCH_NOT_READY) remove_file(pch_file); xfree(header_file); header_file = NULL; diff --git a/mjit.h b/mjit.h index 55b9fbcfcd..130ab5abae 100644 --- a/mjit.h +++ b/mjit.h @@ -49,7 +49,7 @@ struct mjit_options { https://github.com/ruby/ruby/blob/trunk/mjit.h#L49 bool debug; // Add arbitrary cflags. char* debug_flags; - // If not 0, all ISeqs are synchronously compiled. For testing. + // If true, all ISeqs are synchronously compiled. For testing. bool wait; // Number of calls to trigger JIT compilation. For testing. unsigned int min_calls; @@ -59,6 +59,8 @@ struct mjit_options { https://github.com/ruby/ruby/blob/trunk/mjit.h#L59 // Maximal permitted number of iseq JIT codes in a MJIT memory // cache. int max_cache_size; + // [experimental] If true, do not start MJIT until MJIT.resume is called. + bool pause; }; // State of optimization switches -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/