Jit Engines

Jit stands for just-in-time and a Jit compiler compiles code on-the-fly into machine code, ready for execution within a single session. RoadRunner compiles SBML models into machine code for fast evaluation of model rate laws.

RoadRunner has two Jit backends, MCJit and LLJit. By virtue of being older, MCJit is more stable than LLJit, which is a more recent addition to RoadRunner. However, LLJit compiles faster, and gives the user the option to choose between different levels of compile time optimization. For those familiar with C and C++, this is akin to the “-O3” optimization flag.

Given that MCJit is more stable, we have decided to keep it as our default Jit engine, at least until LLJit has been battle tested. In a future release, however LLJit will become the default Jit engine while MCJit will be deprecated and then removed.

Switching Jit Engines

Switching backends is remarkably simple. All we need to do is use the Config.setValue function to globally configure the LLVM_BACKEND variable.

1from roadrunner import Config
2Config.setValue(Config.LLVM_BACKEND, Config.LLJIT)

And to switch back it would be:

1from roadrunner import Config
2Config.setValue(Config.LLVM_BACKEND, Config.MCJIT)

Currently, these are our only two options. But it is foreseeable that other options will be available in the future.

Modifying LLJit Compile-Time Optimization

There are four optimization levels that you can choose from: NONE, LESS, DEFAULT and AGGRESSIVE. No optimization means faster model compiles but slower compiled code, since all compiler optimizations are turned off. On the other end, AGGRESSIVE optimization makes for faster executable sbml models but it takes longer to compile. The default is DEFAULT.

Here’s how to do it:

1Config.setValue(Config.LLJIT_OPTIMIZATION_LEVEL, Config.NONE)
2Config.setValue(Config.LLJIT_OPTIMIZATION_LEVEL, Config.LESS)
3Config.setValue(Config.LLJIT_OPTIMIZATION_LEVEL, Config.DEFAULT)
4Config.setValue(Config.LLJIT_OPTIMIZATION_LEVEL, Config.AGGRESSIVE)