33# `n_values`
44# `k_values`
55# `m_values`
6- function test_complex (:: Type{TE} , m_values, k_values, n_values, testset_name_suffix) where {TE}
6+ function test_complex (
7+ :: Type{TE} ,
8+ m_values,
9+ k_values,
10+ n_values,
11+ testset_name_suffix
12+ ) where {TE}
713 T = Complex{TE}
814 @time @testset " Matrix Multiply $T $(testset_name_suffix) " begin
915 for n ∈ n_values
1016 for k ∈ k_values
1117 for m ∈ m_values
12- A = rand (T, m, k);
13- B = rand (T, k, n);
14- b = rand (T, k);
18+ A = rand (T, m, k)
19+ B = rand (T, k, n)
20+ b = rand (T, k)
1521
16- Are = real .(A);
17- Bre = real .(B);
18- bre = real .(b);
22+ Are = real .(A)
23+ Bre = real .(B)
24+ bre = real .(b)
1925
2026 A′ = permutedims (A)'
2127 B′ = permutedims (B)'
22- AB = A * B;
23- A′B = A′* B;
24- AB′ = A* B′;
25- A′B′= A′* B′;
26- Ab = A* b;
27- A′b = A′* b;
28+ AB = A * B
29+ A′B = A′ * B
30+ AB′ = A * B′
31+ A′B′ = A′ * B′
32+ Ab = A * b
33+ A′b = A′ * b
2834
29- AreB = Are* B;
30- ABre = A* Bre;
31- Areb = Are* b;
32- Abre = A* bre;
35+ AreB = Are * B
36+ ABre = A * Bre
37+ Areb = Are * b
38+ Abre = A * bre
3339
34- @info " " T n k m
35- @test @time (Octavian. matmul (A, B)) ≈ AB
36- @test @time (Octavian. matmul (A, Bre)) ≈ ABre
37- @test @time (Octavian. matmul (Are, B)) ≈ AreB
38- @test @time (Octavian. matmul (A′, B)) ≈ A′B
39- @test @time (Octavian. matmul (A, B′)) ≈ AB′
40- @test @time (Octavian. matmul (A′, B′)) ≈ A′B′
40+ @test (Octavian. matmul (A, B)) ≈ AB
41+ @test (Octavian. matmul (A, Bre)) ≈ ABre
42+ @test (Octavian. matmul (Are, B)) ≈ AreB
43+ @test (Octavian. matmul (A′, B)) ≈ A′B
44+ @test (Octavian. matmul (A, B′)) ≈ AB′
45+ @test (Octavian. matmul (A′, B′)) ≈ A′B′
4146
42- @test @time (Octavian. matmul (A, b)) ≈ Ab
43- @test transpose (@time (Octavian. matmul (transpose (b), transpose (A)))) ≈ Ab
44- @test @time (Octavian. matmul (A, bre)) ≈ Abre
45- @test @time (Octavian. matmul (Are, b)) ≈ Areb
46- @test @time (Octavian. matmul (A′, b)) ≈ A′b
47- @test transpose (@time (Octavian. matmul (transpose (b), transpose (A′)))) ≈ A′b
47+ @test (Octavian. matmul (A, b)) ≈ Ab
48+ @test transpose ((Octavian. matmul (transpose (b), transpose (A)))) ≈ Ab
49+ @test (Octavian. matmul (A, bre)) ≈ Abre
50+ @test (Octavian. matmul (Are, b)) ≈ Areb
51+ @test (Octavian. matmul (A′, b)) ≈ A′b
52+ @test transpose ((Octavian. matmul (transpose (b), transpose (A′)))) ≈ A′b
4853
49- @test @time (Octavian. matmul_serial (A, B)) ≈ AB
50- @test @time (Octavian. matmul_serial (A, Bre)) ≈ ABre
51- @test @time (Octavian. matmul_serial (Are, B)) ≈ AreB
52- @test @time (Octavian. matmul_serial (A′, B)) ≈ A′B
53- @test @time (Octavian. matmul_serial (A, B′)) ≈ AB′
54- @test @time (Octavian. matmul_serial (A′, B′)) ≈ A′B′
54+ @test (Octavian. matmul_serial (A, B)) ≈ AB
55+ @test (Octavian. matmul_serial (A, Bre)) ≈ ABre
56+ @test (Octavian. matmul_serial (Are, B)) ≈ AreB
57+ @test (Octavian. matmul_serial (A′, B)) ≈ A′B
58+ @test (Octavian. matmul_serial (A, B′)) ≈ AB′
59+ @test (Octavian. matmul_serial (A′, B′)) ≈ A′B′
5560
56- @test @time (Octavian. matmul_serial (A, b)) ≈ Ab
57- @test transpose (@time (Octavian. matmul_serial (transpose (b), transpose (A)))) ≈ Ab
58- @test @time (Octavian. matmul_serial (A, bre)) ≈ Abre
59- @test @time (Octavian. matmul_serial (Are, b)) ≈ Areb
60- @test @time (Octavian. matmul_serial (A′, b)) ≈ A′b
61- @test transpose (@time (Octavian. matmul_serial (transpose (b), transpose (A′)))) ≈ A′b
61+ @test (Octavian. matmul_serial (A, b)) ≈ Ab
62+ @test transpose ((Octavian. matmul_serial (
63+ transpose (b),
64+ transpose (A)
65+ ))) ≈ Ab
66+ @test (Octavian. matmul_serial (A, bre)) ≈ Abre
67+ @test (Octavian. matmul_serial (Are, b)) ≈ Areb
68+ @test (Octavian. matmul_serial (A′, b)) ≈ A′b
69+ @test transpose ((Octavian. matmul_serial (
70+ transpose (b),
71+ transpose (A′)
72+ ))) ≈ A′b
6273
6374 C = Matrix {T} (undef, n, m)'
64- @test @time (Octavian. matmul! (C, A, B)) ≈ AB
75+ @test (Octavian. matmul! (C, A, B)) ≈ AB
6576
6677 C1 = rand (T, m, n)
6778 C2 = copy (C1)
6879 α, β = T (1 - 2im ), T (3 + 4im )
69- @test @time (Octavian. matmul! (C1, A, B, α, β)) ≈ Octavian. matmul! (C2, A, B, α, β)
80+ @test (Octavian. matmul! (C1, A, B, α, β)) ≈
81+ Octavian. matmul! (C2, A, B, α, β)
7082 end
7183 end
7284 end
7385 end
7486end
7587
7688function matmul_pack_ab! (C, A, B)
77- M, N = size (C); K = size (B,1 )
78- zc, za, zb = Octavian. zstridedpointer .((C,A,B))
89+ M, N = size (C)
90+ K = size (B, 1 )
91+ zc, za, zb = Octavian. zstridedpointer .((C, A, B))
7992 nspawn = min (Threads. nthreads (), Octavian. num_cores ())
8093 GC. @preserve C A B begin
8194 if nspawn > 1 && sizeof (Int) >= 8
82- threads, torelease = Octavian. PolyesterWeave. __request_threads ((nspawn- 1 )% UInt32, Octavian. PolyesterWeave. worker_pointer (), nothing )
95+ threads, torelease = Octavian. PolyesterWeave. __request_threads (
96+ (nspawn - 1 ) % UInt32,
97+ Octavian. PolyesterWeave. worker_pointer (),
98+ nothing
99+ )
83100 @assert threads. i < Threads. nthreads ()
84101 Octavian. matmul_pack_A_and_B! (
85- zc, za, zb, Octavian. StaticInt {1} (), Octavian. StaticInt {0} (), M, K, N, threads,
86- Octavian. W₁Default (), Octavian. W₂Default (), Octavian. R₁Default (), Octavian. R₂Default ()
102+ zc,
103+ za,
104+ zb,
105+ Octavian. StaticInt {1} (),
106+ Octavian. StaticInt {0} (),
107+ M,
108+ K,
109+ N,
110+ threads,
111+ Octavian. W₁Default (),
112+ Octavian. W₂Default (),
113+ Octavian. R₁Default (),
114+ Octavian. R₂Default ()
87115 )
88116 Octavian. PolyesterWeave. free_threads! (torelease)
89117 else
90118 Octavian. matmul_st_pack_A_and_B! (
91- zc, za, zb, Octavian. StaticInt {1} (), Octavian. StaticInt {0} (), M, K, N,
92- Octavian. W₁Default (), Octavian. W₂Default (), Octavian. R₁Default (), Octavian. R₂Default (), 0
119+ zc,
120+ za,
121+ zb,
122+ Octavian. StaticInt {1} (),
123+ Octavian. StaticInt {0} (),
124+ M,
125+ K,
126+ N,
127+ Octavian. W₁Default (),
128+ Octavian. W₂Default (),
129+ Octavian. R₁Default (),
130+ Octavian. R₂Default (),
131+ 0
93132 )
94133 end
95134 end
96135 C
97136end
98137
99- function test_real (:: Type{T} , m_values, k_values, n_values, testset_name_suffix) where {T}
138+ function test_real (
139+ :: Type{T} ,
140+ m_values,
141+ k_values,
142+ n_values,
143+ testset_name_suffix
144+ ) where {T}
100145 @time @testset " Matrix Multiply $T $(testset_name_suffix) " begin
101146 for n ∈ n_values
102147 for k ∈ k_values
@@ -106,34 +151,33 @@ function test_real(::Type{T}, m_values, k_values, n_values, testset_name_suffix)
106151 b = rand (T, k)
107152 A′ = permutedims (A)'
108153 B′ = permutedims (B)'
109- AB = A * B;
110- Ab = A * b;
111- @info " " T n k m
112- @test @time (Octavian. matmul (A, B)) ≈ AB
113- @test @time (Octavian. matmul (A′, B)) ≈ AB
114- @test @time (Octavian. matmul (A, B′)) ≈ AB
115- @test @time (Octavian. matmul (A′, B′)) ≈ AB
116- @test @time (Octavian. matmul_serial (A, B)) ≈ AB
117- @test @time (Octavian. matmul_serial (A′, B)) ≈ AB
118- @test @time (Octavian. matmul_serial (A, B′)) ≈ AB
119- @test @time (Octavian. matmul_serial (A′, B′)) ≈ AB
120- @test @time (Octavian. matmul (A, b)) ≈ Ab
121- @test @time (Octavian. matmul (A′, b)) ≈ Ab
122- @test @time (Octavian. matmul (b' , A' ))' ≈ Ab
123- @test @time (Octavian. matmul (b' , A′' ))' ≈ Ab
124- @test @time (Octavian. matmul_serial (A, b)) ≈ Ab
125- @test @time (Octavian. matmul_serial (A′, b)) ≈ Ab
126- @test @time (Octavian. matmul_serial (b' , A' ))' ≈ Ab
127- @test @time (Octavian. matmul_serial (b' , A′' ))' ≈ Ab
154+ AB = A * B
155+ Ab = A * b
156+ @test (Octavian. matmul (A, B)) ≈ AB
157+ @test (Octavian. matmul (A′, B)) ≈ AB
158+ @test (Octavian. matmul (A, B′)) ≈ AB
159+ @test (Octavian. matmul (A′, B′)) ≈ AB
160+ @test (Octavian. matmul_serial (A, B)) ≈ AB
161+ @test (Octavian. matmul_serial (A′, B)) ≈ AB
162+ @test (Octavian. matmul_serial (A, B′)) ≈ AB
163+ @test (Octavian. matmul_serial (A′, B′)) ≈ AB
164+ @test (Octavian. matmul (A, b)) ≈ Ab
165+ @test (Octavian. matmul (A′, b)) ≈ Ab
166+ @test (Octavian. matmul (b' , A' ))' ≈ Ab
167+ @test (Octavian. matmul (b' , A′' ))' ≈ Ab
168+ @test (Octavian. matmul_serial (A, b)) ≈ Ab
169+ @test (Octavian. matmul_serial (A′, b)) ≈ Ab
170+ @test (Octavian. matmul_serial (b' , A' ))' ≈ Ab
171+ @test (Octavian. matmul_serial (b' , A′' ))' ≈ Ab
128172 end
129173 end
130174 end
131175 m = k = n = max (8 Octavian. OCTAVIAN_NUM_TASKS[], 400 )
132- A = rand (T, m, k);
133- B = rand (T, k, n);
134- A′ = permutedims (A)' ;
135- B′ = permutedims (B)' ;
136- AB = A * B;
176+ A = rand (T, m, k)
177+ B = rand (T, k, n)
178+ A′ = permutedims (A)'
179+ B′ = permutedims (B)'
180+ AB = A * B
137181 @test matmul_pack_ab! (similar (AB), A, B) ≈ AB
138182 @test matmul_pack_ab! (similar (AB), A, B′) ≈ AB
139183 @test matmul_pack_ab! (similar (AB), A′, B) ≈ AB
@@ -142,13 +186,19 @@ function test_real(::Type{T}, m_values, k_values, n_values, testset_name_suffix)
142186end
143187
144188@time @testset " zero-sized-matrices" begin
145- @test Octavian. matmul_serial (randn (0 ,0 ), randn (0 ,0 )) == zeros (0 , 0 )
146- @test Octavian. matmul_serial (randn (2 ,3 ), randn (3 ,0 )) == zeros (2 , 0 )
147- @test Octavian. matmul_serial (randn (2 ,0 ), randn (0 ,2 )) == zeros (2 , 2 )
148- @test Octavian. matmul_serial! (ones (2 ,2 ),randn (2 ,0 ), randn (0 ,2 ), 1.0 , 2.0 ) == ones (2 , 2 ) .* 2
149- @test Octavian. matmul (randn (0 ,0 ), randn (0 ,0 )) == zeros (0 , 0 )
150- @test Octavian. matmul (randn (2 ,3 ), randn (3 ,0 )) == zeros (2 , 0 )
151- @test Octavian. matmul (randn (2 ,0 ), randn (0 ,2 )) == zeros (2 , 2 )
152- @test Octavian. matmul! (ones (2 ,2 ),randn (2 ,0 ), randn (0 ,2 ), 1.0 , 2.0 ) == ones (2 , 2 ) .* 2
189+ @test Octavian. matmul_serial (randn (0 , 0 ), randn (0 , 0 )) == zeros (0 , 0 )
190+ @test Octavian. matmul_serial (randn (2 , 3 ), randn (3 , 0 )) == zeros (2 , 0 )
191+ @test Octavian. matmul_serial (randn (2 , 0 ), randn (0 , 2 )) == zeros (2 , 2 )
192+ @test Octavian. matmul_serial! (
193+ ones (2 , 2 ),
194+ randn (2 , 0 ),
195+ randn (0 , 2 ),
196+ 1.0 ,
197+ 2.0
198+ ) == ones (2 , 2 ) .* 2
199+ @test Octavian. matmul (randn (0 , 0 ), randn (0 , 0 )) == zeros (0 , 0 )
200+ @test Octavian. matmul (randn (2 , 3 ), randn (3 , 0 )) == zeros (2 , 0 )
201+ @test Octavian. matmul (randn (2 , 0 ), randn (0 , 2 )) == zeros (2 , 2 )
202+ @test Octavian. matmul! (ones (2 , 2 ), randn (2 , 0 ), randn (0 , 2 ), 1.0 , 2.0 ) ==
203+ ones (2 , 2 ) .* 2
153204end
154-
0 commit comments