@@ -16,8 +16,10 @@ M_g = div(2*10^8, N^2)
16
16
# Size
17
17
18
18
A = rand (Float64,N,N)
19
+ A = A* A'
19
20
As = SMatrix {N,N} (A)
20
21
Am = MMatrix {N,N} (A)
22
+ Az = Size (N,N)(copy (A))
21
23
@static if fsa
22
24
Af = Mat (ntuple (j -> ntuple (i-> A[i,j], N), N)) # there is a bug in FixedSizeArrays Mat constructor (13 July 2016)
23
25
end
@@ -36,9 +38,19 @@ if !isdefined(:f_mut_marray) || !isdefined(:benchmark_suite) || benchmark_suite
36
38
@generated f_blas_marray (n:: Integer , A) = :(@inbounds (C = similar (A); C[:] = A[:]; tmp = similar (A); for i = 1 : n; StaticArrays. A_mul_B_blas! (tmp, C, A); C. data = tmp. data; end ; return C))
37
39
38
40
@generated g (n:: Integer , A) = :(@inbounds (C = A; for i = 1 : n; C = C + A; end ; return C))
39
- @generated g_mut (n:: Integer , A) = :(@inbounds (C = similar (A); C[:] = A[:] ; for i = 1 : n; @inbounds map! (+ , C, C, A); end ; return C))
41
+ @generated g_mut (n:: Integer , A) = :(@inbounds (C = copy (A); for i = 1 : n; @inbounds map! (+ , C, C, A); end ; return C))
40
42
@generated g_via_sarray {M} (n:: Integer , A:: MMatrix{M,M} ) = :(@inbounds (C = similar (A); C[:] = A[:]; for i = 1 : n; C = MMatrix {M,M} (SMatrix {M,M} (C) + SMatrix {M,M} (A)); end ; return C))
41
43
44
+ @noinline _det (x) = det (x)
45
+ @noinline _inv (x) = inv (x)
46
+ @noinline _eig (x) = eig (x)
47
+ @noinline _chol (x) = chol (x)
48
+
49
+ f_det (n:: Int , A) = (for i = 1 : n; _det (A); end )
50
+ f_inv (n:: Int , A) = (for i = 1 : n; _inv (A); end )
51
+ f_eig (n:: Int , A) = (for i = 1 : n; _eig (A); end )
52
+ f_chol (n:: Int , A) = (for i = 1 : n; _chol (A); end )
53
+
42
54
# Notes: - A[:] = B[:] is allocating in Base, unlike `map!`
43
55
# - Also, the same goes for Base's implementation of broadcast!(f, A, B, C) (but map! is OK).
44
56
# - I really need to implement copy() in StaticArrays... (and maybe a special instance of setindex!(C, :))
@@ -122,11 +134,14 @@ end
122
134
# Warmup and some checks
123
135
Cs = f (2 , As)
124
136
Cm = f (2 , Am)
137
+ Cz = f (2 , Az)
125
138
126
139
Cs:: SMatrix
127
140
if N <= 4 ; @assert Cs ≈ C; end
128
141
Cm:: MMatrix
129
142
if N <= 4 ; @assert Cm ≈ C; end
143
+ Cz:: SizedMatrix
144
+ if N <= 4 ; @assert Cz ≈ C; end
130
145
131
146
@static if fsa
132
147
@static if all_methods
@@ -149,6 +164,10 @@ Cm_mut = f_mut_marray(2, Am)
149
164
Cm_mut:: MMatrix
150
165
if N <= 4 ; @assert Cm_mut ≈ C; end
151
166
167
+ Cz_mut = f_mut_array (2 , Az)
168
+ Cz_mut:: SizedMatrix
169
+ if N <= 4 ; @assert Cz_mut ≈ C; end
170
+
152
171
@static if all_methods
153
172
println ()
154
173
print (" A_mul_B!(MMatrix, MMatrix) compilation time (unrolled):" )
@@ -196,13 +215,19 @@ if N <= 4; @assert C_mut ≈ C; end
196
215
Cs = g (2 , As)
197
216
Cm = g (2 , Am)
198
217
Cm_mut = g_mut (2 , Am)
218
+ Cz = g (2 , Az)
219
+ Cz_mut = g_mut (2 , Az)
199
220
200
221
Cs:: SMatrix
201
222
if N <= 4 ; @assert Cs == C; end
202
223
Cm:: MMatrix
203
224
if N <= 4 ; @assert Cm == C; end
204
225
Cm_mut:: MMatrix
205
226
if N <= 4 ; @assert Cm_mut == C; end
227
+ Cz:: SizedMatrix
228
+ if N <= 4 ; @assert Cz == C; end
229
+ Cz_mut:: SizedMatrix
230
+ if N <= 4 ; @assert Cz_mut == C; end
206
231
207
232
@static if all_methods
208
233
Cm_via_sarray = g_via_sarray (2 , Am)
216
241
if N <= 4 ; @assert Cf == C; end
217
242
end
218
243
244
+ if N <= 3
245
+ # det, eig etc
246
+ C = f_det (2 , A)
247
+ Cs = f_det (2 , As)
248
+ Cm = f_det (2 , Am)
249
+ Cz = f_det (2 , Az)
250
+
251
+ C = f_inv (2 , A)
252
+ Cs = f_inv (2 , As)
253
+ Cm = f_inv (2 , Am)
254
+ Cz = f_inv (2 , Az)
255
+
256
+ C = f_eig (2 , Symmetric (A))
257
+ Cs = f_eig (2 , Symmetric (As))
258
+ Cm = f_eig (2 , Symmetric (Am))
259
+ Cz = f_eig (2 , Symmetric (Az))
260
+
261
+ C = f_chol (2 , Symmetric (A))
262
+ Cs = f_chol (2 , Symmetric (As))
263
+ Cm = f_chol (2 , Symmetric (Am))
264
+ Cz = f_chol (2 , Symmetric (Az))
265
+ end
266
+
219
267
println ()
220
268
221
269
# Do the performance tests
@@ -229,6 +277,7 @@ begin
229
277
end
230
278
print (" SArray ->" ); @time f (M_f, As)
231
279
print (" MArray ->" ); @time f (M_f, Am)
280
+ print (" SizedArray ->" ); @time f (M_f, Az)
232
281
@static if all_methods
233
282
print (" SArray (unrolled) ->" ); @time f_unrolled (M_f, As)
234
283
print (" SArray (chunks) ->" ); @time f_unrolled_chunks (M_f, As)
@@ -246,6 +295,7 @@ println("--------------------------------")
246
295
begin
247
296
print (" Array ->" ); @time f_mut_array (M_f, A)
248
297
print (" MArray ->" ); @time f_mut_marray (M_f, Am)
298
+ print (" SizedArray ->" ); @time f_mut_array (M_f, Az)
249
299
@static if all_methods
250
300
print (" MArray (unrolled) ->" ); @time f_mut_unrolled (M_f, Am)
251
301
print (" MArray (chunks) ->" ); @time f_mut_chunks (M_f, Am)
@@ -263,6 +313,7 @@ begin
263
313
end
264
314
print (" SArray ->" ); @time g (M_g, As)
265
315
print (" MArray ->" ); @time g (M_g, Am)
316
+ print (" SizedArray ->" ); @time g (M_g, Az)
266
317
@static if all_methods
267
318
print (" MArray (via SArray) ->" ); @time g_via_sarray (M_g, Am)
268
319
end
@@ -272,7 +323,50 @@ println()
272
323
println (" Matrix addition (mutating)" )
273
324
println (" --------------------------" )
274
325
begin
275
- print (" Array ->" ); @time g_mut (M_g, A) # broadcast! seems to be broken!
276
- print (" MArray ->" ); @time g_mut (M_g, Am)
326
+ print (" Array ->" ); @time g_mut (M_g, A) # broadcast! seems to be broken!
327
+ print (" MArray ->" ); @time g_mut (M_g, Am)
328
+ print (" SizedArray ->" ); @time g_mut (M_g, Az)
277
329
end
278
330
println ()
331
+
332
+ if N <= 3
333
+ println (" Matrix determinant" )
334
+ println (" ------------------" )
335
+ begin
336
+ print (" Array ->" ); @time f_det (M_f, A)
337
+ print (" SArray ->" ); @time f_det (M_f, As)
338
+ print (" MArray ->" ); @time f_det (M_f, Am)
339
+ print (" SizedArray ->" ); @time f_det (M_f, Az)
340
+ end
341
+ println ()
342
+
343
+ println (" Matrix inverse" )
344
+ println (" --------------" )
345
+ begin
346
+ print (" Array ->" ); @time f_inv (M_f, A)
347
+ print (" SArray ->" ); @time f_inv (M_f, As)
348
+ print (" MArray ->" ); @time f_inv (M_f, Am)
349
+ print (" SizedArray ->" ); @time f_inv (M_f, Az)
350
+ end
351
+ println ()
352
+
353
+ println (" Matrix symmetric eigenvalue" )
354
+ println (" ---------------------------" )
355
+ begin
356
+ print (" Array ->" ); @time f_eig (M_f, Symmetric (A))
357
+ print (" SArray ->" ); @time f_eig (M_f, Symmetric (As))
358
+ print (" MArray ->" ); @time f_eig (M_f, Symmetric (Am))
359
+ print (" SizedArray ->" ); @time f_eig (M_f, Symmetric (Az))
360
+ end
361
+ println ()
362
+
363
+ println (" Matrix Cholesky" )
364
+ println (" ---------------" )
365
+ begin
366
+ print (" Array ->" ); @time f_chol (M_f, Symmetric (A))
367
+ print (" SArray ->" ); @time f_chol (M_f, Symmetric (As))
368
+ print (" MArray ->" ); @time f_chol (M_f, Symmetric (Am))
369
+ print (" SizedArray ->" ); @time f_chol (M_f, Symmetric (Az))
370
+ end
371
+ println ()
372
+ end # if N <= 3
0 commit comments