1function test86
2%TEST86 performance test of of GrB_Matrix_extract
3
4% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
5% SPDX-License-Identifier: Apache-2.0
6
7fprintf ('test86: performance test of of GrB_Matrix_extract\n') ;
8
9[save save_chunk] = nthreads_get ;
10chunk = 4096 ;
11
12rng ('default') ;
13nthreads_max = 2*GB_mex_omp_max_threads ;
14nthread_list = [1 2 3 4 8 16 32 40 64 128 160 256] ;
15nthread_list = nthread_list (nthread_list <= nthreads_max) ;
16
17Prob = ssget (2662)
18
19A = Prob.A ;
20n = size (A,1) ;
21
22fprintf ('\nrandperm==========================================================:\n') ;
23J = randperm (n) ;
24I = randperm (n) ;
25for subset = [n 1e6 1e4 100]
26    fprintf ('\nC = A (length %d randperm, length %d randperm)\n', subset, subset) ;
27    I2 = I (1:subset) ;
28    J2 = J (1:subset) ;
29    tic ;
30    C = A (I2,J2) ;
31    t1 = toc ;
32    fprintf ('    MATLAB %12.6f\n', t1) ;
33    [cm cn] = size (C) ;
34    S = sparse (cm, cn) ;
35    I0 = uint64 (I2) - 1 ;
36    J0 = uint64 (J2) - 1 ;
37    for nthreads = nthread_list
38        nthreads_set (nthreads, chunk) ;
39        C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I0, J0) ;
40        t2 = grbresults ;
41        assert (isequal (C, C2.matrix)) ;
42        fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
43    end
44end
45
46clear I0 J0 I2 J2
47
48fprintf ('\nrandperm==========================================================:\n') ;
49for subset = [n 1e6 1e4 100]
50    fprintf ('\nC = A (length %d randperm, :)\n', subset) ;
51    I2 = I (1:subset) ;
52    tic ;
53    C = A (I2,:) ;
54    t1 = toc ;
55    fprintf ('    MATLAB %12.6f\n', t1) ;
56    [cm cn] = size (C) ;
57    S = sparse (cm, cn) ;
58    I0 = uint64 (I2) - 1 ;
59    J0.begin = 0 ; J0.inc = 1   ; J0.end = n-1 ;
60    for nthreads = nthread_list
61        nthreads_set (nthreads, chunk) ;
62        C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I0, J0) ;
63        t2 = grbresults ;
64        assert (isequal (C, C2.matrix)) ;
65        fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
66    end
67end
68
69clear I J I0 J0 I2 J2
70
71fprintf ('\nC = A (1:inc:n, :) ===============================================:\n') ;
72for inc = [1:10 16 64 128 256 1024 100000 1e6 2e6]
73    % fprintf ('\nC = A (1:%7d:n, 1:%7d:n)\n', inc, inc) ;
74      fprintf ('\nC = A (1:%7d:n, :)\n', inc) ;
75    tic
76    % C = A (1:inc:n, 1:inc:n) ;
77      C = A (1:inc:n, :) ;
78    t1 = toc ;
79    fprintf ('    MATLAB %12.6f\n', t1) ;
80    clear I J
81    I.begin = 0 ; I.inc = inc ; I.end = n-1 ;
82    J.begin = 0 ; J.inc = 1   ; J.end = n-1 ;
83    [cm cn] = size (C) ;
84    S = sparse (cm, cn) ;
85    for nthreads = nthread_list
86        nthreads_set (nthreads, chunk) ;
87        % C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, I) ;
88          C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, J) ;
89        t2 = grbresults ;
90        GB_spok (C2.matrix) ;
91        assert (isequal (C, C2.matrix)) ;
92        fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
93    end
94end
95
96fprintf ('\nC = A (1:k, 1:k) =================================================:\n') ;
97
98for hi = [1:10 16 64 128 256 1024 100000 1e6 2e6]
99    fprintf ('\nC = A (1:%7d, 1:%7d)\n', hi, hi) ;
100    tic
101    C = A (1:hi, 1:hi) ;
102    t1 = toc ;
103    fprintf ('    MATLAB %12.6f\n', t1) ;
104    I.begin = 0 ;
105    I.inc = 1 ;
106    I.end = hi-1 ;
107    [cm cn] = size (C) ;
108    S = sparse (cm, cn) ;
109    for nthreads = nthread_list
110        nthreads_set (nthreads, chunk) ;
111        C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, I) ;
112        t2 = grbresults ;
113        assert (isequal (C, C2.matrix)) ;
114        fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
115    end
116end
117
118fprintf ('\nC = A (lo:hi, lo:hi) =============================================:\n') ;
119
120for lo = [1:10 16 64 128 256 1024 100000 1e6 2e6]
121    for delta = [1 10000 1e6]
122        hi = lo + delta ;
123        hi = min (n, hi) ;
124        fprintf ('\nC = A (%7d:%7d, %7d:%7d)\n', lo, hi, lo, hi) ;
125        tic
126        C = A (lo:hi, lo:hi) ;
127        t1 = toc ;
128        fprintf ('    MATLAB %12.6f\n', t1) ;
129        I.begin = lo-1 ;
130        I.inc = 1 ;
131        I.end = hi-1 ;
132        [cm cn] = size (C) ;
133        S = sparse (cm, cn) ;
134        for nthreads = nthread_list
135            nthreads_set (nthreads, chunk) ;
136            C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, I) ;
137            t2 = grbresults ;
138            assert (isequal (C, C2.matrix)) ;
139            fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
140        end
141    end
142end
143
144fprintf ('\nC = A (hi:-1:lo, hi:-1:lo) =======================================:\n') ;
145
146for lo = [1:10 16 64 128 256 1024 100000 1e6 2e6]
147    for delta = [1 10000 1e6]
148        hi = lo + delta ;
149        hi = min (n, hi) ;
150        fprintf ('\nC = A (%7d:-1:%7d, %7d:-1:%7d)\n', hi, lo, hi, lo) ;
151        tic
152        C = A (hi:-1:lo, hi:-1:lo) ;
153        t1 = toc ;
154        fprintf ('    MATLAB %12.6f\n', t1) ;
155        I.begin = hi-1 ;
156        I.inc = -1 ;
157        I.end = lo-1 ;
158        [cm cn] = size (C) ;
159        S = sparse (cm, cn) ;
160        for nthreads = nthread_list
161            nthreads_set (nthreads, chunk) ;
162            C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, I) ;
163            t2 = grbresults ;
164            assert (isequal (C, C2.matrix)) ;
165            fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
166        end
167    end
168end
169
170fprintf ('\nC = A (n:-inc:1, n:-inc:1) =======================================:\n') ;
171
172for inc = [1:10 16 64 128 256 1024 100000 1e6 2e6]
173    fprintf ('\nC = A (n:%7d:1, n:%7d:1)\n', -inc, -inc) ;
174    tic
175    C = A (n:(-inc):1, n:(-inc):1) ;
176    t1 = toc ;
177    fprintf ('    MATLAB %12.6f\n', t1) ;
178    I.begin = n-1 ;
179    I.inc = -inc ;
180    I.end = 0 ;
181    [cm cn] = size (C) ;
182    S = sparse (cm, cn) ;
183    for nthreads = nthread_list
184        nthreads_set (nthreads, chunk) ;
185        C2 = GB_mex_Matrix_extract (S, [ ], [ ], A, I, I) ;
186        t2 = grbresults ;
187        assert (isequal (C, C2.matrix)) ;
188        fprintf ('    GraphBLAS nthreads %2d %12.6f speedup %8.2f\n', nthreads, t2, t1/t2) ;
189    end
190end
191
192fprintf ('test86: all tests passed\n') ;
193
194nthreads_set (save, save_chunk) ;
195