Multithreading speedup for large models

In this tutorial we illustrate how to make use of multi threading in BeforeIT.jl to allow for faster executions of single simulation runs.

import BeforeIT as Bit

using FileIO, Plots, StatsPlots

First, we initialise the model, this time we use the Italy 2010Q1 scenario, and we want to simulate the model for a large number of epochs

parameters = Bit.ITALY2010Q1.parameters
initial_conditions = Bit.ITALY2010Q1.initial_conditions
T = 50
model = Bit.init_model(parameters, initial_conditions, T);

The model is in scale 1:2000, so it has around 30,000 households

model.prop.H
29915

Note that the households number is actually the sum of active and inactive households, the owners of firms and of the bank

length(model.w_act) + length(model.w_inact) + length(model.firms) + 1
29915

Let's fist check how many threads we have available in this Julia session

Threads.nthreads()
2

Then we need to first compile the code not to count compilation time, we can do that just by executing the function one time

Bit.run!(model; multi_threading = false);

Let's now compare the performance of single threading and multi threading

model = Bit.init_model(parameters, initial_conditions, T);
@time data = Bit.run!(model; multi_threading = false);

model = Bit.init_model(parameters, initial_conditions, T);
@time data = Bit.run!(model; multi_threading = true);
  5.745592 seconds (3.42 M allocations: 6.010 GiB, 20.62% gc time)
  2.701379 seconds (3.49 M allocations: 6.254 GiB, 8.70% gc time)

Is the speedup in line to what we would expect? Yes!