tprofiling.jl - Granular.jl - Julia package for granular dynamics simulation | |
git clone git://src.adamsgaard.dk/Granular.jl | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tprofiling.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*… | |
26 if !grid_sorting | |
27 sim.ocean.input_file = false # fallback to all-to-all contact s… | |
28 end | |
29 r = min(dx, dy)/2. | |
30 if include_atmosphere | |
31 sim.atmosphere = Granular.createRegularAtmosphereGrid([nx, ny, 2… | |
32 [nx*dx, ny*d… | |
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_… | |
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] … | |
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 + atmosphe… | |
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… | |
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 .�… | |
165 label_all_to_all = @sprintf "%1.3g n^%3.2f" fit_all_to_all.coefs[1] fit_… | |
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 … | |
177 label_cell_sorting = @sprintf "%1.3g n^%3.2f" fit_cell_sorting.coefs[1] … | |
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 + atmosphe… | |
187 fit_cell_sorting2 = CurveFit.curve_fit(CurveFit.PowerFit, | |
188 elements, | |
189 memory_usage_cell_sorting2 .÷ 10… | |
190 label_cell_sorting2 = @sprintf "%1.3g n^%3.2f" fit_cell_sorting2.coefs[1… | |
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") |