Skip to content

Commit a92372a

Browse files
committed
Add some Eigen3 benchmarks.
1 parent b0b6b45 commit a92372a

16 files changed

+289
-105
lines changed

benchmark/benchmarkflops.jl

Lines changed: 95 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,26 @@ function matmul_bench!(br, C, A, B, i)
3333
M, N = size(C); K = size(B,1);
3434
n_gflop = M*K*N*2e-9
3535
br[1,i] = n_gflop / @belapsed mul!($C, $A, $B)
36-
Cblas = copy(C)
36+
Cblas = copy(C); fill!(C, NaN)
3737
br[2,i] = n_gflop / @belapsed jgemm!($C, $A, $B)
38-
@assert C Cblas "Julia gemm wrong?"
38+
@assert C Cblas "Julia gemm wrong?"; fill!(C, NaN)
3939
br[3,i] = n_gflop / @belapsed cgemm!($C, $A, $B)
40-
@assert C Cblas "Polly gemm wrong?"
40+
@assert C Cblas "Polly gemm wrong?"; fill!(C, NaN)
4141
br[4,i] = n_gflop / @belapsed fgemm!($C, $A, $B)
42-
@assert C Cblas "Fort gemm wrong?"
42+
@assert C Cblas "Fort gemm wrong?"; fill!(C, NaN)
4343
br[5,i] = n_gflop / @belapsed fgemm_builtin!($C, $A, $B)
44-
@assert C Cblas "Fort intrinsic gemm wrong?"
44+
@assert C Cblas "Fort intrinsic gemm wrong?"; fill!(C, NaN)
4545
br[6,i] = n_gflop / @belapsed icgemm!($C, $A, $B)
46-
@assert C Cblas "icc gemm wrong?"
46+
@assert C Cblas "icc gemm wrong?"; fill!(C, NaN)
4747
br[7,i] = n_gflop / @belapsed ifgemm!($C, $A, $B)
48-
@assert C Cblas "ifort gemm wrong?"
48+
@assert C Cblas "ifort gemm wrong?"; fill!(C, NaN)
4949
br[8,i] = n_gflop / @belapsed ifgemm_builtin!($C, $A, $B)
50-
@assert C Cblas "ifort intrinsic gemm wrong?"
51-
br[9,i] = n_gflop / @belapsed gemmavx!($C, $A, $B)
50+
@assert C Cblas "ifort intrinsic gemm wrong?"; fill!(C, NaN)
51+
br[9,i] = n_gflop / @belapsed egemm!($C, $A, $B)
52+
@assert C Cblas "eigen gemm wrong?"; fill!(C, NaN)
53+
br[10,i] = n_gflop / @belapsed iegemm!($C, $A, $B)
54+
@assert C Cblas "i-eigen gemm wrong?"; fill!(C, NaN)
55+
br[11,i] = n_gflop / @belapsed gemmavx!($C, $A, $B)
5256
@assert C Cblas "LoopVec gemm wrong?"
5357
end
5458
function A_mul_B_bench!(br, s, i)
@@ -87,30 +91,35 @@ function At_mul_Bt_bench!(br, s, i)
8791
matmul_bench!(br, C, A, B, i)
8892
end
8993

94+
const BLASTESTS = [
95+
BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS",
96+
"Julia", "Clang-Polly",
97+
"GFortran", "GFort-intrinsic",
98+
"icc", "ifort", "ifort-intrinsic",
99+
"Clang++ & Eigen-3", "icpc & Eigen-3",
100+
"LoopVectorization"
101+
]
102+
90103
function benchmark_AmulB(sizes)
91-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
92-
br = BenchmarkResult(tests, sizes)
104+
br = BenchmarkResult(BLASTESTS, sizes)
93105
sm = br.sizedresults.results
94106
pmap(is -> A_mul_B_bench!(sm, is[2], is[1]), enumerate(sizes))
95107
br
96108
end
97109
function benchmark_AmulBt(sizes)
98-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
99-
br = BenchmarkResult(tests, sizes)
110+
br = BenchmarkResult(BLASTESTS, sizes)
100111
sm = br.sizedresults.results
101112
pmap(is -> A_mul_Bt_bench!(sm, is[2], is[1]), enumerate(sizes))
102113
br
103114
end
104115
function benchmark_AtmulB(sizes)
105-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
106-
br = BenchmarkResult(tests, sizes)
116+
br = BenchmarkResult(BLASTESTS, sizes)
107117
sm = br.sizedresults.results
108118
pmap(is -> At_mul_B_bench!(sm, is[2], is[1]), enumerate(sizes))
109119
br
110120
end
111121
function benchmark_AtmulBt(sizes)
112-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
113-
br = BenchmarkResult(tests, sizes)
122+
br = BenchmarkResult(BLASTESTS, sizes)
114123
sm = br.sizedresults.results
115124
pmap(is -> At_mul_Bt_bench!(sm, is[2], is[1]), enumerate(sizes))
116125
br
@@ -128,14 +137,18 @@ function dot_bench!(br, s, i)
128137
br[4,i] = n_gflop / @belapsed fdot($a, $b)
129138
@assert fdot(a,b) dotblas "Fort dot wrong?"
130139
br[5,i] = n_gflop / @belapsed icdot($a, $b)
131-
@assert cdot(a,b) dotblas "icc dot wrong?"
140+
@assert icdot(a,b) dotblas "icc dot wrong?"
132141
br[6,i] = n_gflop / @belapsed ifdot($a, $b)
133-
@assert fdot(a,b) dotblas "ifort dot wrong?"
134-
br[7,i] = n_gflop / @belapsed jdotavx($a, $b)
142+
@assert ifdot(a,b) dotblas "ifort dot wrong?"
143+
br[7,i] = n_gflop / @belapsed edot($a, $b)
144+
@assert edot(a,b) dotblas "eigen dot wrong?"
145+
br[8,i] = n_gflop / @belapsed iedot($a, $b)
146+
@assert iedot(a,b) dotblas "i-eigen dot wrong?"
147+
br[9,i] = n_gflop / @belapsed jdotavx($a, $b)
135148
@assert jdotavx(a,b) dotblas "LoopVec dot wrong?"
136149
end
137150
function benchmark_dot(sizes)
138-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "LoopVectorization"]
151+
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
139152
br = BenchmarkResult(tests, sizes)
140153
sm = br.sizedresults.results
141154
pmap(is -> dot_bench!(sm, is[2], is[1]), enumerate(sizes))
@@ -156,11 +169,15 @@ function selfdot_bench!(br, s, i)
156169
@assert cselfdot(a) dotblas "icc dot wrong?"
157170
br[6,i] = n_gflop / @belapsed ifselfdot($a)
158171
@assert fselfdot(a) dotblas "ifort dot wrong?"
159-
br[7,i] = n_gflop / @belapsed jselfdotavx($a)
172+
br[7,i] = n_gflop / @belapsed eselfdot($a)
173+
@assert eselfdot(a) dotblas "eigen dot wrong?"
174+
br[8,i] = n_gflop / @belapsed ieselfdot($a)
175+
@assert ieselfdot(a) dotblas "i-eigen dot wrong?"
176+
br[9,i] = n_gflop / @belapsed jselfdotavx($a)
160177
@assert jselfdotavx(a) dotblas "LoopVec dot wrong?"
161178
end
162179
function benchmark_selfdot(sizes)
163-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "LoopVectorization"]
180+
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
164181
br = BenchmarkResult(tests, sizes)
165182
sm = br.sizedresults.results
166183
pmap(is -> selfdot_bench!(sm, is[2], is[1]), enumerate(sizes))
@@ -173,22 +190,26 @@ function gemv_bench!(br, x, A, y, i)
173190
M, N = size(A)
174191
n_gflop = M*N * 2e-9
175192
br[1,i] = n_gflop / @belapsed mul!($x, $A, $y)
176-
xblas = copy(x)
193+
xblas = copy(x); fill!(x, NaN);
177194
br[2,i] = n_gflop / @belapsed jgemv!($x, $A, $y)
178-
@assert x xblas "Julia wrong?"
195+
@assert x xblas "Julia wrong?"; fill!(x, NaN);
179196
br[3,i] = n_gflop / @belapsed cgemv!($x, $A, $y)
180-
@assert x xblas "Polly wrong?"
197+
@assert x xblas "Polly wrong?"; fill!(x, NaN);
181198
br[4,i] = n_gflop / @belapsed fgemv!($x, $A, $y)
182-
@assert x xblas "Fort wrong?"
199+
@assert x xblas "Fort wrong?"; fill!(x, NaN);
183200
br[5,i] = n_gflop / @belapsed fgemv_builtin!($x, $A, $y)
184-
@assert x xblas "Fort wrong?"
201+
@assert x xblas "Fort wrong?"; fill!(x, NaN);
185202
br[6,i] = n_gflop / @belapsed icgemv!($x, $A, $y)
186-
@assert x xblas "icc wrong?"
203+
@assert x xblas "icc wrong?"; fill!(x, NaN);
187204
br[7,i] = n_gflop / @belapsed ifgemv!($x, $A, $y)
188-
@assert x xblas "ifort wrong?"
205+
@assert x xblas "ifort wrong?"; fill!(x, NaN);
189206
br[8,i] = n_gflop / @belapsed ifgemv_builtin!($x, $A, $y)
190-
@assert x xblas "ifort wrong?"
191-
br[9,i] = n_gflop / @belapsed jgemvavx!($x, $A, $y)
207+
@assert x xblas "ifort wrong?"; fill!(x, NaN);
208+
br[9,i] = n_gflop / @belapsed egemv!($x, $A, $y)
209+
@assert x xblas "eigen wrong?"; fill!(x, NaN);
210+
br[10,i] = n_gflop / @belapsed iegemv!($x, $A, $y)
211+
@assert x xblas "i-eigen wrong?"; fill!(x, NaN);
212+
br[11,i] = n_gflop / @belapsed jgemvavx!($x, $A, $y)
192213
@assert x xblas "LoopVec wrong?"
193214
end
194215
function A_mul_vb_bench!(br, s, i)
@@ -206,15 +227,13 @@ function At_mul_vb_bench!(br, s, i)
206227
gemv_bench!(br, x, A, y, i)
207228
end
208229
function benchmark_Amulvb(sizes)
209-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
210-
br = BenchmarkResult(tests, sizes)
230+
br = BenchmarkResult(BLASTESTS, sizes)
211231
sm = br.sizedresults.results
212232
pmap(is -> A_mul_vb_bench!(sm, is[2], is[1]), enumerate(sizes))
213233
br
214234
end
215235
function benchmark_Atmulvb(sizes)
216-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "GFort-intrinsic", "icc", "ifort", "ifort-intrinsic", "LoopVectorization"]
217-
br = BenchmarkResult(tests, sizes)
236+
br = BenchmarkResult(BLASTESTS, sizes)
218237
sm = br.sizedresults.results
219238
pmap(is -> At_mul_vb_bench!(sm, is[2], is[1]), enumerate(sizes))
220239
br
@@ -233,14 +252,18 @@ function dot3_bench!(br, s, i)
233252
br[4,i] = n_gflop / @belapsed fdot3($x, $A, $y)
234253
@assert fdot3(x, A, y) dotblas "Fort dot wrong?"
235254
br[5,i] = n_gflop / @belapsed icdot3($x, $A, $y)
236-
@assert cdot3(x, A, y) dotblas "icc dot wrong?"
255+
@assert icdot3(x, A, y) dotblas "icc dot wrong?"
237256
br[6,i] = n_gflop / @belapsed ifdot3($x, $A, $y)
238-
@assert fdot3(x, A, y) dotblas "ifort dot wrong?"
239-
br[7,i] = n_gflop / @belapsed jdot3avx($x, $A, $y)
257+
@assert ifdot3(x, A, y) dotblas "ifort dot wrong?"
258+
br[7,i] = n_gflop / @belapsed edot3($x, $A, $y)
259+
@assert edot3(x, A, y) dotblas "eigen dot wrong?"
260+
br[8,i] = n_gflop / @belapsed iedot3($x, $A, $y)
261+
@assert iedot3(x, A, y) dotblas "i-eigen dot wrong?"
262+
br[9,i] = n_gflop / @belapsed jdot3avx($x, $A, $y)
240263
@assert jdot3avx(x, A, y) dotblas "LoopVec dot wrong?"
241264
end
242265
function benchmark_dot3(sizes)
243-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "LoopVectorization"]
266+
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
244267
br = BenchmarkResult(tests, sizes)
245268
sm = br.sizedresults.results
246269
pmap(is -> dot3_bench!(sm, is[2], is[1]), enumerate(sizes))
@@ -268,14 +291,18 @@ function sse_bench!(br, s, i)
268291
br[4,i] = n_gflop / @belapsed fOLSlp($y, $X, $β)
269292
@assert fOLSlp(y, X, β) lpblas "Fort wrong?"
270293
br[5,i] = n_gflop / @belapsed icOLSlp($y, $X, $β)
271-
@assert cOLSlp(y, X, β) lpblas "icc wrong?"
294+
@assert icOLSlp(y, X, β) lpblas "icc wrong?"
272295
br[6,i] = n_gflop / @belapsed ifOLSlp($y, $X, $β)
273-
@assert fOLSlp(y, X, β) lpblas "ifort wrong?"
274-
br[7,i] = n_gflop / @belapsed jOLSlp_avx($y, $X, $β)
296+
@assert ifOLSlp(y, X, β) lpblas "ifort wrong?"
297+
br[7,i] = n_gflop / @belapsed eOLSlp($y, $X, $β)
298+
@assert eOLSlp(y, X, β) lpblas "eigen wrong?"
299+
br[8,i] = n_gflop / @belapsed ieOLSlp($y, $X, $β)
300+
@assert ieOLSlp(y, X, β) lpblas "i-eigen wrong?"
301+
br[9,i] = n_gflop / @belapsed jOLSlp_avx($y, $X, $β)
275302
@assert jOLSlp_avx(y, X, β) lpblas "LoopVec wrong?"
276303
end
277304
function benchmark_sse(sizes)
278-
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "LoopVectorization"]
305+
tests = [BLAS.vendor() === :mkl ? "IntelMKL" : "OpenBLAS", "Julia", "Clang-Polly", "GFortran", "icc", "ifort", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
279306
br = BenchmarkResult(tests, sizes)
280307
sm = br.sizedresults.results
281308
pmap(is -> sse_bench!(sm, is[2], is[1]), enumerate(sizes))
@@ -312,20 +339,24 @@ function aplusBc_bench!(br, s, i)
312339
c′ = c'; D = similar(B)
313340
n_gflop = 2e-9 * M*N
314341
br[1,i] = n_gflop / @belapsed @. $D = $a + $B * $c′
315-
Dcopy = copy(D)
342+
Dcopy = copy(D); fill!(D, NaN);
316343
br[2,i] = n_gflop / @belapsed caplusBc!($D, $a, $B, $c)
317-
@assert D Dcopy "Polly wrong?"
344+
@assert D Dcopy "Polly wrong?"; fill!(D, NaN);
318345
br[3,i] = n_gflop / @belapsed faplusBc!($D, $a, $B, $c)
319-
@assert D Dcopy "Fort wrong?"
346+
@assert D Dcopy "Fort wrong?"; fill!(D, NaN);
320347
br[4,i] = n_gflop / @belapsed icaplusBc!($D, $a, $B, $c)
321-
@assert D Dcopy "icc wrong?"
348+
@assert D Dcopy "icc wrong?"; fill!(D, NaN);
322349
br[5,i] = n_gflop / @belapsed ifaplusBc!($D, $a, $B, $c)
323-
@assert D Dcopy "ifort wrong?"
324-
br[6,i] = n_gflop / @belapsed @avx @. $D = $a + $B * $c′
350+
@assert D Dcopy "ifort wrong?"; fill!(D, NaN);
351+
br[6,i] = n_gflop / @belapsed eaplusBc!($D, $a, $B, $c)
352+
@assert D Dcopy "eigen wrong?"; fill!(D, NaN);
353+
br[7,i] = n_gflop / @belapsed ieaplusBc!($D, $a, $B, $c)
354+
@assert D Dcopy "i-eigen wrong?"; fill!(D, NaN);
355+
br[8,i] = n_gflop / @belapsed @avx @. $D = $a + $B * $c′
325356
@assert D Dcopy "LoopVec wrong?"
326357
end
327358
function benchmark_aplusBc(sizes)
328-
tests = ["Julia", "Clang-Polly", "GFortran", "icc", "ifort", "LoopVectorization"]
359+
tests = ["Julia", "Clang-Polly", "GFortran", "icc", "ifort", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
329360
br = BenchmarkResult(tests, sizes)
330361
sm = br.sizedresults.results
331362
pmap(is -> aplusBc_bench!(sm, is[2], is[1]), enumerate(sizes))
@@ -336,24 +367,28 @@ function AplusAt_bench!(br, s, i)
336367
A = rand(s,s); B = similar(A)
337368
n_gflop = 1e-9*s^2
338369
br[1,i] = n_gflop / @belapsed @. $B = $A + $A'
339-
baseB = copy(B)
370+
baseB = copy(B); fill!(B, NaN);
340371
br[2,i] = n_gflop / @belapsed cAplusAt!($B, $A)
341-
@assert B baseB "Clang wrong?"
372+
@assert B baseB "Clang wrong?"; fill!(B, NaN);
342373
br[3,i] = n_gflop / @belapsed fAplusAt!($B, $A)
343-
@assert B baseB "Fort wrong?"
374+
@assert B baseB "Fort wrong?"; fill!(B, NaN);
344375
br[4,i] = n_gflop / @belapsed fAplusAt_builtin!($B, $A)
345-
@assert B baseB "Fort-builtin wrong?"
376+
@assert B baseB "Fort-builtin wrong?"; fill!(B, NaN);
346377
br[5,i] = n_gflop / @belapsed icAplusAt!($B, $A)
347-
@assert B baseB "icc wrong?"
378+
@assert B baseB "icc wrong?"; fill!(B, NaN);
348379
br[6,i] = n_gflop / @belapsed ifAplusAt!($B, $A)
349-
@assert B baseB "ifort wrong?"
380+
@assert B baseB "ifort wrong?"; fill!(B, NaN);
350381
br[7,i] = n_gflop / @belapsed ifAplusAt_builtin!($B, $A)
351-
@assert B baseB "ifort-builtin wrong?"
352-
br[8,i] = n_gflop / @belapsed @avx @. $B = $A + $A'
382+
@assert B baseB "ifort-builtin wrong?"; fill!(B, NaN);
383+
br[8,i] = n_gflop / @belapsed eAplusAt!($B, $A)
384+
@assert B baseB "eigen wrong?"; fill!(B, NaN);
385+
br[9,i] = n_gflop / @belapsed ieAplusAt!($B, $A)
386+
@assert B baseB "i-eigen wrong?"; fill!(B, NaN);
387+
br[10,i] = n_gflop / @belapsed @avx @. $B = $A + $A'
353388
@assert B baseB "LoopVec wrong?"
354389
end
355390
function benchmark_AplusAt(sizes)
356-
tests = ["Julia", "Clang-Polly", "GFortran", "GFortran-builtin", "icc", "ifort", "ifort-builtin", "LoopVectorization"]
391+
tests = ["Julia", "Clang-Polly", "GFortran", "GFortran-builtin", "icc", "ifort", "ifort-builtin", "Clang++ & Eigen-3", "icpc & Eigen-3", "LoopVectorization"]
357392
br = BenchmarkResult(tests, sizes)
358393
sm = br.sizedresults.results
359394
pmap(is -> AplusAt_bench!(sm, is[2], is[1]), enumerate(sizes))

benchmark/driver.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,15 @@ Amulvb_bench = benchmark_Amulvb(2:256)
2929
Atmulvb_bench = benchmark_Atmulvb(2:256)
3030
dot3_bench = benchmark_dot3(2:256)
3131
sse_bench = benchmark_sse(2:256)
32-
exp_bench = benchmark_exp(2:256)
3332
aplusBc_bench = benchmark_aplusBc(2:256)
3433
AplusAt_bench = benchmark_AplusAt(2:256)
34+
exp_bench = benchmark_exp(2:256)
3535
randomaccess_bench = benchmark_random_access(2:256)
3636
logdettriangle_bench = benchmark_logdettriangle(2:256)
3737

3838
v = 1
3939
filetype = "svg"
4040
const PICTURES = joinpath(pkgdir("LoopVectorization"), "docs", "src", "assets")
41-
save(joinpath(PICTURES, "bench_exp_v$v.$filetype"), plot(exp_bench));
42-
save(joinpath(PICTURES, "bench_logdettriangle_v$v.$filetype"), plot(logdettriangle_bench));
4341
save(joinpath(PICTURES, "bench_AmulB_v$v.$filetype"), plot(AmulB_bench));
4442
save(joinpath(PICTURES, "bench_AmulBt_v$v.$filetype"), plot(AmulBt_bench));
4543
save(joinpath(PICTURES, "bench_AtmulB_v$v.$filetype"), plot(AtmulB_bench));
@@ -50,9 +48,11 @@ save(joinpath(PICTURES, "bench_dot3_v$v.$filetype"), plot(dot3_bench));
5048
save(joinpath(PICTURES, "bench_sse_v$v.$filetype"), plot(sse_bench));
5149
save(joinpath(PICTURES, "bench_aplusBc_v$v.$filetype"), plot(aplusBc_bench));
5250
save(joinpath(PICTURES, "bench_AplusAt_v$v.$filetype"), plot(AplusAt_bench));
53-
save(joinpath(PICTURES, "bench_random_access_v$v.$filetype"), plot(randomaccess_bench));
5451
save(joinpath(PICTURES, "bench_Amulvb_v$v.$filetype"), plot(Amulvb_bench));
5552
save(joinpath(PICTURES, "bench_Atmulvb_v$v.$filetype"), plot(Atmulvb_bench));
53+
save(joinpath(PICTURES, "bench_exp_v$v.$filetype"), plot(exp_bench));
54+
save(joinpath(PICTURES, "bench_logdettriangle_v$v.$filetype"), plot(logdettriangle_bench));
55+
save(joinpath(PICTURES, "bench_random_access_v$v.$filetype"), plot(randomaccess_bench));
5656

5757

5858

0 commit comments

Comments
 (0)