1function test46
2%TEST46 performance test of GxB_subassign
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: Apache-2.0
6
7fprintf ('\n--------------performance test GB_mex_subassign\n') ;
8
9[save save_chunk] = nthreads_get ;
10chunk = 4096 ;
11nthreads = feature ('numcores') ;
12nthreads_set (nthreads, chunk) ;
13debug_off
14
15dt = struct ('inp0', 'tran') ;
16
17rng ('default') ;
18
19A = sparse (rand (3,4)) ;
20I = uint64 (0:2) ;
21J = uint64 (0:3) ;
22C = A ;
23
24C0 = sprandn (length(I), length (J), 0.5) ;
25C1 = C ;
26C1 (I+1,J+1) = C0 ;
27CC = GB_mex_subassign (C, [],[], C0, I, J, []) ;
28assert (isequal (C1, CC.matrix))
29
30C0 = sprandn (length(I), length (J), 0.5)' ;
31C1 = C ;
32C1 (I+1,J+1) = C0' ;
33CC = GB_mex_subassign (C, [],[], C0, I, J, dt) ;
34assert (isequal (C1, CC.matrix))
35
36for trial = 1:100
37
38    for m = [1 10 100]
39        for n = [1 10 100]
40
41            C = sprandn (m, n, 0.1) ;
42
43            ni = double (irand (1, m)) ;
44            nj = double (irand (1, n)) ;
45            I = randperm (m) ;
46            J = randperm (n) ;
47            I = I (1:ni) ;
48            J = J (1:nj) ;
49            I0 = uint64 (I-1) ;
50            J0 = uint64 (J-1) ;
51
52            A = sprandn (ni, nj, 0.1) ;
53
54            C1 = C ;
55            C1 (I,J) = A ;
56            C2 = GB_mex_subassign (C, [], '', A, I0, J0, []) ;
57
58            C3 = C ;
59            C3 (I,J) = C3 (I,J) + A ;
60            C4 = GB_mex_subassign (C, [], 'plus', A, I0, J0, []) ;
61
62            assert (isequal (C3, C4.matrix))
63        end
64    end
65end
66
67
68Prob = ssget (2662) ;
69A = Prob.A ;
70% n = 2^21 ; A = A (1:n,1:n) ;
71% A = A (:) ;
72A = [A A ; A A] ;
73A = [A A ; A A] ;
74% A = [A A ; A A] ;
75%A = [A A ; A A] ;
76%A = [A A ; A A] ;
77C = A ;
78C (1,1) = 1 ;
79[m n] = size (A) ;
80fprintf ('size: %d %d\n', m, n) ;
81
82ni = min (size (A, 1), 5500) ;
83nj = min (size (A, 2), 7000) ;
84B = sprandn (ni, nj, 0.001) ;
85% I = randperm (m) ; I = I (1:ni) ;
86% J = randperm (n) ; J = J (1:nj) ;
87I = randperm (m,ni) ;
88J = randperm (n,nj) ;
89fprintf ('nnzB: %g\n', nnz (B)) ;
90
91fprintf ('\nC(I,J)=B, MATLAB start:\n')
92tic
93C (I,J) = B ;
94toc
95
96I0 = uint64 (I-1) ;
97J0 = uint64 (J-1) ;
98
99C2 = A;
100C2 (1,1) =1 ;
101
102fprintf ('GraphBLAS start:\n')
103
104for nthreads = [1 20 40]
105    nthreads_set (nthreads) ;
106    C3 = GB_mex_subassign (C2, [], [], B, I0, J0, []) ;
107    tg = grbresults ;
108    fprintf ('%d threads, GB time: %g\n', nthreads, tg) ;
109    assert (isequal (C, C3.matrix)) ;
110end
111
112% A = Prob.A ;
113% A = A (:) ;
114% A = [A A] ;
115% n = 2^21 ; A = A (1:n,1:n) ;
116C = A ;
117C (1,1) = 1 ;
118
119fprintf ('\nC(I,J)+=B, MATLAB start:\n')
120tic
121C (I,J) = C (I,J) + B ;
122toc
123
124C2 = A ;
125C2 (1,1) = 1 ;
126
127fprintf ('GraphBLAS start:\n')
128
129for nthreads = [1 20 40]
130    nthreads_set (nthreads) ;
131    C3 = GB_mex_subassign (C2, [], 'plus', B, I0, J0, []) ;
132    tg = grbresults ;
133    fprintf ('%d threads, GB time: %g\n', nthreads, tg) ;
134    assert (isequal (C, C3.matrix)) ;
135end
136
137nthreads_set (save, save_chunk) ;
138
139fprintf ('\ntest46: all tests passed\n') ;
140
141