Granular.jl

Julia package for granular dynamics simulation
git clone git://src.adamsgaard.dk/Granular.jl # fast
git clone https://src.adamsgaard.dk/Granular.jl.git # slow
Log | Files | Refs | README | LICENSE Back to index

profiling.jl (7472B)


      1 #!/usr/bin/env julia
      2 if VERSION < v"0.7.0-DEV.2004"
      3     using Base.Test
      4 else
      5     using Test
      6 end
      7 import Plots
      8 import Granular
      9 import CurveFit
     10 
     11 verbose=false
     12 
     13 @info "Testing performance with many interacting grains"
     14 
     15 function timeSingleStepInDenseSimulation(nx::Int; verbose::Bool=true,
     16                                          profile::Bool=false,
     17                                          grid_sorting::Bool=true,
     18                                          include_atmosphere::Bool=false)
     19 
     20     sim = Granular.createSimulation()
     21     #nx, ny = 25, 25
     22     #nx, ny = 250, 250
     23     ny = nx
     24     dx, dy = 40., 40.
     25     sim.ocean = Granular.createRegularOceanGrid([nx, ny, 2], [nx*dx, ny*dy, 10.])
     26     if !grid_sorting
     27         sim.ocean.input_file = false  # fallback to all-to-all contact search
     28     end
     29     r = min(dx, dy)/2.
     30     if include_atmosphere
     31         sim.atmosphere = Granular.createRegularAtmosphereGrid([nx, ny, 2],
     32                                                             [nx*dx, ny*dy, 10.])
     33     end
     34 
     35     # add grains in regular packing
     36     for iy=1:ny
     37         for ix=1:nx
     38             x = r + (ix - 1)*dx
     39             y = r + (iy - 1)*dy
     40             fixed = false
     41             if ix == 1 || iy == 1 || ix == nx || iy == ny
     42                 fixed = true
     43             end
     44             Granular.addGrainCylindrical!(sim, [x, y], r*1.1, 1.,
     45                                           fixed=fixed, verbose=false)
     46         end
     47     end
     48     printstyled("number of grains: $(length(sim.grains))\n",
     49                        color=:green)
     50     if grid_sorting
     51         if include_atmosphere
     52             printstyled("using cell-based spatial decomposition " *
     53                              " (ocean + atmosphere)\n", color=:green)
     54         else
     55             printstyled("using cell-based spatial " * 
     56                              "decomposition (ocean)\n", color=:green)
     57         end
     58     else
     59         printstyled("using all-to-all contact search\n", color=:green)
     60     end
     61 
     62     Granular.setTotalTime!(sim, 1.0)
     63     Granular.setTimeStep!(sim)
     64     Granular.run!(sim, single_step=true, verbose=true)
     65     if profile
     66         @profile Granular.run!(sim, single_step=true, verbose=true)
     67         if verbose
     68             Profile.print()
     69         end
     70         Granular.run!(sim, single_step=true, verbose=true)
     71     end
     72     n_runs = 4
     73     t_elapsed = 1e12
     74     for i=1:n_runs
     75         tic()
     76         @time Granular.run!(sim, single_step=true, verbose=true)
     77         t = toc()
     78         if t < t_elapsed
     79             t_elapsed = t
     80         end
     81     end
     82 
     83     #Granular.writeVTK(sim)
     84 
     85     @test sim.grains[1].n_contacts == 0
     86     @test sim.grains[2].n_contacts == 1
     87     @test sim.grains[3].n_contacts == 1
     88     @test sim.grains[nx].n_contacts == 0
     89     @test sim.grains[nx + 1].n_contacts == 1
     90     @test sim.grains[nx + 2].n_contacts == 4
     91     return t_elapsed, Base.summarysize(sim)
     92 end
     93 
     94 #nx = Int[4 8 16 32 64 96]
     95 nx = round.(logspace(1, 2, 16))
     96 elements = zeros(length(nx))
     97 t_elapsed = zeros(length(nx))
     98 t_elapsed_all_to_all = zeros(length(nx))
     99 t_elapsed_cell_sorting = zeros(length(nx))
    100 t_elapsed_cell_sorting2 = zeros(length(nx))
    101 memory_usage_all_to_all = zeros(length(nx))
    102 memory_usage_cell_sorting = zeros(length(nx))
    103 memory_usage_cell_sorting2 = zeros(length(nx))
    104 for i=1:length(nx)
    105     @info "nx = $(nx[i])"
    106     t_elapsed_all_to_all[i], memory_usage_all_to_all[i] =
    107         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=false)
    108     t_elapsed_cell_sorting[i], memory_usage_cell_sorting[i] =
    109         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=true)
    110     t_elapsed_cell_sorting2[i], memory_usage_cell_sorting2[i] =
    111         timeSingleStepInDenseSimulation(Int(nx[i]), grid_sorting=true, 
    112                                         include_atmosphere=true)
    113     elements[i] = nx[i]*nx[i]
    114 end
    115 
    116 #Plots.gr()
    117 Plots.pyplot()
    118 Plots.scatter(elements, t_elapsed_all_to_all,
    119               xscale=:log10,
    120               yscale=:log10,
    121               label="All to all")
    122 fit_all_to_all = CurveFit.curve_fit(CurveFit.PowerFit,
    123                                     elements, t_elapsed_all_to_all)
    124 label_all_to_all = @sprintf "%1.3g n^%3.2f" fit_all_to_all.coefs[1] fit_all_to_all.coefs[2]
    125 Plots.plot!(elements, fit_all_to_all(elements),
    126             xscale=:log10,
    127             yscale=:log10,
    128             label=label_all_to_all)
    129 
    130 Plots.scatter!(elements, t_elapsed_cell_sorting,
    131                xscale=:log10,
    132                yscale=:log10,
    133                label="Cell-based spatial decomposition (ocean only)")
    134 fit_cell_sorting = CurveFit.curve_fit(CurveFit.PowerFit,
    135                                     elements, t_elapsed_cell_sorting)
    136 label_cell_sorting = @sprintf "%1.3g n^%3.2f" fit_cell_sorting.coefs[1] fit_cell_sorting.coefs[2]
    137 Plots.plot!(elements, fit_cell_sorting(elements),
    138             xscale=:log10,
    139             yscale=:log10,
    140             label=label_cell_sorting)
    141 
    142 Plots.scatter!(elements, t_elapsed_cell_sorting2,
    143                xscale=:log10,
    144                yscale=:log10,
    145                label="Cell-based spatial decomposition (ocean + atmosphere)")
    146 fit_cell_sorting2 = CurveFit.curve_fit(CurveFit.PowerFit,
    147                                        elements, t_elapsed_cell_sorting2)
    148 label_cell_sorting2 = @sprintf "%1.3g n^%3.2f" fit_cell_sorting2.coefs[1] fit_cell_sorting2.coefs[2]
    149 Plots.plot!(elements, fit_cell_sorting2(elements),
    150             xscale=:log10,
    151             yscale=:log10,
    152             label=label_cell_sorting2)
    153 
    154 Plots.title!("Dense granular system " * "(host: $(gethostname()))")
    155 Plots.xaxis!("Number of grains")
    156 Plots.yaxis!("Wall time per time step [s]")
    157 Plots.savefig("profiling-cpu.pdf")
    158 
    159 Plots.scatter(elements, memory_usage_all_to_all .÷ 1024,
    160               xscale=:log10,
    161               yscale=:log10,
    162               label="All to all")
    163 fit_all_to_all = CurveFit.curve_fit(CurveFit.PowerFit,
    164                                     elements, memory_usage_all_to_all .÷ 1024)
    165 label_all_to_all = @sprintf "%1.3g n^%3.2f" fit_all_to_all.coefs[1] fit_all_to_all.coefs[2]
    166 Plots.plot!(elements, fit_all_to_all(elements),
    167             xscale=:log10,
    168             yscale=:log10,
    169             label=label_all_to_all)
    170 
    171 Plots.scatter!(elements, memory_usage_cell_sorting .÷ 1024,
    172                xscale=:log10,
    173                yscale=:log10,
    174                label="Cell-based spatial decomposition (ocean only)")
    175 fit_cell_sorting = CurveFit.curve_fit(CurveFit.PowerFit,
    176                                     elements, memory_usage_cell_sorting .÷ 1024)
    177 label_cell_sorting = @sprintf "%1.3g n^%3.2f" fit_cell_sorting.coefs[1] fit_cell_sorting.coefs[2]
    178 Plots.plot!(elements, fit_cell_sorting(elements),
    179             xscale=:log10,
    180             yscale=:log10,
    181             label=label_cell_sorting)
    182 
    183 Plots.scatter!(elements, memory_usage_cell_sorting2 .÷ 1024,
    184                xscale=:log10,
    185                yscale=:log10,
    186                label="Cell-based spatial decomposition (ocean + atmosphere)")
    187 fit_cell_sorting2 = CurveFit.curve_fit(CurveFit.PowerFit,
    188                                        elements,
    189                                        memory_usage_cell_sorting2 .÷ 1024)
    190 label_cell_sorting2 = @sprintf "%1.3g n^%3.2f" fit_cell_sorting2.coefs[1] fit_cell_sorting2.coefs[2]
    191 Plots.plot!(elements, fit_cell_sorting2(elements),
    192             xscale=:log10,
    193             yscale=:log10,
    194             label=label_cell_sorting2)
    195 
    196 Plots.title!("Dense granular system " * "(host: $(gethostname()))")
    197 Plots.xaxis!("Number of grains")
    198 Plots.yaxis!("Memory usage [kb]")
    199 Plots.savefig("profiling-memory-usage.pdf")