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 Plots, StatsPlots
First, we initialise the model, this time we use the Italy 2010Q1 scenario
parameters = Bit.ITALY2010Q1.parameters
initial_conditions = Bit.ITALY2010Q1.initial_conditions
model = Bit.Model(parameters, initial_conditions);
The model is in scale 1:2000, so it has around 30,000 households
model.prop.H
29916
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
29916
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
T = 50
Bit.run!(model, T; parallel = false);
Let's now compare the performance of single-threading and multi-threading
model = Bit.Model(parameters, initial_conditions);
@time Bit.run!(model, T; parallel = false);
model = Bit.Model(parameters, initial_conditions);
@time Bit.run!(model, T; parallel = true);
4.970428 seconds (275.11 k allocations: 5.351 GiB, 15.28% gc time)
2.282677 seconds (289.96 k allocations: 5.306 GiB, 2.18% gc time)
Is the speedup in line to what we would expect? Yes!