# HG changeset patch # User Rik # Date 1373416646 25200 # Node ID e6ddaa65a77713029bdf87128f5697dd6e11a372 # Parent 99122191d3dde944b90afe6de921535ef58e2573 Add new function jit_startcnt to control JIT acceleration. * NEWS: Announce new function. * doc/interpreter/vectorize.txi: Add verbiage to manual about function. * libinterp/corefcn/pt-jit.cc(Fjit_startcnt): New function which manages static variable Vjit_startcnt. Variable is threshold above which JIT acceleration takes place. * libinterp/corefcn/pt-jit.cc(Fjit_enable, Fdebug_jit): Update seealso links in docstring. diff -r 99122191d3dd -r e6ddaa65a777 NEWS --- a/NEWS Tue Jul 09 16:47:57 2013 -0700 +++ b/NEWS Tue Jul 09 17:37:26 2013 -0700 @@ -186,22 +186,22 @@ inputdlg msgbox warndlg ** Other new functions added in 3.8.0: - - atan2d erfcinv polyeig - base64_decode erfi readline_re_read_init_file - base64_encode expint readline_read_init_file - betaincinv findfigs rgbplot - built_in_docstrings_file flintmax save_default_options - cmpermute fminsearch shrinkfaces - cmunique gallery splinefit - colorcube gco stemleaf - copyobj hdl2struct strjoin - dawson history_save struct2hdl - dblist imformats tetramesh - debug_jit importdata waterfall - doc_cache_create iscolormap + + atan2d erfcinv lines + base64_decode erfi polyeig + base64_encode expint readline_re_read_init_file + betaincinv findfigs readline_read_init_file + built_in_docstrings_file flintmax rgbplot + cmpermute fminsearch save_default_options + cmunique gallery shrinkfaces + colorcube gco splinefit + copyobj hdl2struct stemleaf + dawson history_save strjoin + dblist imformats struct2hdl + debug_jit importdata tetramesh + doc_cache_create iscolormap waterfall ellipj jit_enable - ellipke lines + ellipke jit_startcnt ** Deprecated functions. diff -r 99122191d3dd -r e6ddaa65a777 doc/interpreter/vectorize.txi --- a/doc/interpreter/vectorize.txi Tue Jul 09 16:47:57 2013 -0700 +++ b/doc/interpreter/vectorize.txi Tue Jul 09 17:37:26 2013 -0700 @@ -519,8 +519,8 @@ statements into another language, compiling the new code segment into an executable, and then running the executable and collecting any results. The process is not simple and there is a significant amount of work to perform for -each step. It can still make sense, however, if the loop counter is a -large number. Because Octave is an interpreted language every time through a +each step. It can still make sense, however, if the number of loop iterations +is large. Because Octave is an interpreted language every time through a loop Octave must parse the statements in the loop body before executing them. With a JIT compiler this is done just once when the body is translated to another language. @@ -528,12 +528,16 @@ The JIT compiler is a very new feature in Octave and not all valid Octave statements can currently be accelerated. However, if no other technique is available it may be worth benchmarking the code with JIT enabled. The -function @code{jit_enable} is used to turn compilation on or off. The function -@code{debug_jit} is not likely to be of use to anyone not working directly on -the implementation of the JIT compiler. +function @code{jit_enable} is used to turn compilation on or off. The +function @code{jit_startcnt} sets the threshold for acceleration. Loops +with iteration counts above @code{jit_startcnt} will be accelerated. The +function @code{debug_jit} is not likely to be of use to anyone not working +directly on the implementation of the JIT compiler. @DOCSTRING(jit_enable) +@DOCSTRING(jit_startcnt) + @DOCSTRING(debug_jit) @node Miscellaneous Techniques diff -r 99122191d3dd -r e6ddaa65a777 libinterp/corefcn/pt-jit.cc --- a/libinterp/corefcn/pt-jit.cc Tue Jul 09 16:47:57 2013 -0700 +++ b/libinterp/corefcn/pt-jit.cc Tue Jul 09 17:37:26 2013 -0700 @@ -44,6 +44,8 @@ static bool Vjit_enable = true; +static int Vjit_startcnt = 1000; + #include #include #include @@ -1880,8 +1882,6 @@ bool tree_jit::do_execute (tree_simple_for_command& cmd, const octave_value& bounds) { - const size_t MIN_TRIP_COUNT = 1000; - size_t tc = trip_count (bounds); if (! tc || ! initialize () || ! enabled ()) return false; @@ -1892,7 +1892,7 @@ jit_info *info = cmd.get_info (); if (! info || ! info->match (extra_vars)) { - if (tc < MIN_TRIP_COUNT) + if (tc < static_cast (Vjit_startcnt)) return false; delete info; @@ -2293,7 +2293,7 @@ When called from inside a function with the \"local\" option, the variable is\n\ changed locally for the function and any subroutines it calls. The original\n\ variable value is restored when exiting the function.\n\ -@seealso{jit_enable}\n\ +@seealso{jit_enable, jit_startcnt}\n\ @end deftypefn") { #if defined (HAVE_LLVM) @@ -2314,7 +2314,7 @@ When called from inside a function with the \"local\" option, the variable is\n\ changed locally for the function and any subroutines it calls. The original\n\ variable value is restored when exiting the function.\n\ -@seealso{debug_jit}\n\ +@seealso{jit_startcnt, debug_jit}\n\ @end deftypefn") { #if defined (HAVE_LLVM) @@ -2325,3 +2325,27 @@ #endif } +DEFUN (jit_startcnt, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {@var{val} =} jit_startcnt ()\n\ +@deftypefnx {Built-in Function} {@var{old_val} =} jit_startcnt (@var{new_val})\n\ +@deftypefnx {Built-in Function} {} jit_startcnt (@var{new_val}, \"local\")\n\ +Query or set the internal variable that determines whether JIT compilation\n\ +will take place for a specific loop. Because compilation is a costly\n\ +operation it does not make sense to employ JIT when the loop count is low.\n\ +By default only loops with greater than 1000 iterations will be accelerated.\n\ +\n\ +When called from inside a function with the \"local\" option, the variable is\n\ +changed locally for the function and any subroutines it calls. The original\n\ +variable value is restored when exiting the function.\n\ +@seealso{jit_enable, debug_jit}\n\ +@end deftypefn") +{ +#if defined (HAVE_LLVM) + return SET_INTERNAL_VARIABLE_WITH_LIMITS (jit_startcnt, 1, + std::numeric_limits::max ()); +#else + warning ("jit_enable: JIT compiling not available in this version of Octave"); + return octave_value (); +#endif +}