Skip to content

Strange Memory Allocations with saveat #880

@MicheleCeresoli

Description

@MicheleCeresoli

Hello, I'm observing very strange and large memory allocations while solving a standard ODE and evaluating it at given times. However, after the first benchmark, if (and only if!) I recompile the integrated function these allocations disappear.

The function I'm integrating is:

@inbounds function dyn!(du::Vector{Float64}, u::Vector{Float64}, 
                                 p, t::Float64)
    du[1] =- u[1]
    du[2] = -u[2]
    du[3] = -u[3]
   
    nothing 
end

while test is the function that evaluates the solution at the given times:

import DifferentialEquations: Vern9, ODEProblem, solve
function test(x::Vector{Float64}, tms::Vector{Float64})

    user_prob = ODEProblem(dyn!, x, [0., 86400])
    user_sol = solve(user_prob, Vern9(), abstol=1e-10, reltol=1e-9, saveat=tms, save_everystep=false).u

    return user_sol 
end

Calling it with:

x =  [3., 5., 10];
tms = collect(LinRange(0., 86400., 86400));

using BenchmarkTools
@benchmark test($x, $tms)

yields:

BenchmarkTools.Trial: 30 samples with 1 evaluation.
 Range (min  max):  129.553 ms  535.830 ms  ┊ GC (min  max): 11.32%  74.42%
 Time  (median):     151.338 ms               ┊ GC (median):    14.82%
 Time  (mean ± σ):   167.691 ms ±  71.469 ms  ┊ GC (mean ± σ):  21.46% ± 11.46%

    ██                                                           
  ▆▇██▆▁▆▁▆▄▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄ ▁
  130 ms           Histogram: frequency by time          536 ms <

 Memory estimate: 304.61 MiB, allocs estimate: 432505.

If i recompile dyn! the new benchmark is:

BenchmarkTools.Trial: 81 samples with 1 evaluation.
 Range (min  max):  49.294 ms  106.972 ms  ┊ GC (min  max): 0.00%  0.00%
 Time  (median):     59.441 ms               ┊ GC (median):    0.00%
 Time  (mean ± σ):   62.334 ms ±  12.016 ms  ┊ GC (mean ± σ):  2.41% ± 4.19%

  █ ▁    ▁▁    ▃                                                
  █▆█▇▄▇▇██▇▆▇▇█▁▇▆▆▆▆▄▆▆▆▄▄▁▁▄▁▁▆▆▁▁▁▄▁▁▁▁▁▁▁▆▁▁▄▁▄▄▁▁▁▁▁▁▁▁▄ ▁
  49.3 ms         Histogram: frequency by time         98.8 ms <

 Memory estimate: 17.22 MiB, allocs estimate: 173311.

Any idea what's happening? I see the Garbage Collector is taking quite a lot of time

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions