1 //------------------------------------------------------------------------------
2 // GxB_Global_Option_get: get a global default option for all future matrices
3 //------------------------------------------------------------------------------
4
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7
8 //------------------------------------------------------------------------------
9
10 #include "GB.h"
11
GxB_Global_Option_get(GxB_Option_Field field,...)12 GrB_Info GxB_Global_Option_get // gets the current global option
13 (
14 GxB_Option_Field field, // option to query
15 ... // return value of the global option
16 )
17 {
18
19 //--------------------------------------------------------------------------
20 // check inputs
21 //--------------------------------------------------------------------------
22
23 GB_WHERE1 ("GxB_Global_Option_get (field, &value)") ;
24
25 //--------------------------------------------------------------------------
26 // get the option
27 //--------------------------------------------------------------------------
28
29 va_list ap ;
30
31 switch (field)
32 {
33
34 //----------------------------------------------------------------------
35 // matrix format
36 //----------------------------------------------------------------------
37
38 case GxB_HYPER_SWITCH :
39
40 {
41 va_start (ap, field) ;
42 double *hyper_switch = va_arg (ap, double *) ;
43 va_end (ap) ;
44 GB_RETURN_IF_NULL (hyper_switch) ;
45 (*hyper_switch) = (double) GB_Global_hyper_switch_get ( ) ;
46 }
47 break ;
48
49 case GxB_BITMAP_SWITCH :
50
51 {
52 va_start (ap, field) ;
53 double *bitmap_switch = va_arg (ap, double *) ;
54 va_end (ap) ;
55 GB_RETURN_IF_NULL (bitmap_switch) ;
56 for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++)
57 {
58 double b = (double) GB_Global_bitmap_switch_get (k) ;
59 bitmap_switch [k] = b ;
60 }
61 }
62 break ;
63
64 case GxB_FORMAT :
65
66 {
67 va_start (ap, field) ;
68 GxB_Format_Value *format = va_arg (ap, GxB_Format_Value *) ;
69 va_end (ap) ;
70 GB_RETURN_IF_NULL (format) ;
71 (*format) = (GB_Global_is_csc_get ( )) ?
72 GxB_BY_COL : GxB_BY_ROW ;
73 }
74 break ;
75
76 //----------------------------------------------------------------------
77 // mode from GrB_init (blocking or non-blocking)
78 //----------------------------------------------------------------------
79
80 case GxB_MODE :
81
82 {
83 va_start (ap, field) ;
84 GrB_Mode *mode = va_arg (ap, GrB_Mode *) ;
85 va_end (ap) ;
86 GB_RETURN_IF_NULL (mode) ;
87 (*mode) = GB_Global_mode_get ( ) ;
88 }
89 break ;
90
91 //----------------------------------------------------------------------
92 // default number of threads
93 //----------------------------------------------------------------------
94
95 case GxB_GLOBAL_NTHREADS : // same as GxB_NTHREADS
96
97 {
98 va_start (ap, field) ;
99 int *nthreads_max = va_arg (ap, int *) ;
100 va_end (ap) ;
101 GB_RETURN_IF_NULL (nthreads_max) ;
102 (*nthreads_max) = GB_Global_nthreads_max_get ( ) ;
103 }
104 break ;
105
106 //----------------------------------------------------------------------
107 // default chunk size
108 //----------------------------------------------------------------------
109
110 case GxB_GLOBAL_CHUNK : // same as GxB_CHUNK
111
112 {
113 va_start (ap, field) ;
114 double *chunk = va_arg (ap, double *) ;
115 va_end (ap) ;
116 GB_RETURN_IF_NULL (chunk) ;
117 (*chunk) = GB_Global_chunk_get ( ) ;
118 }
119 break ;
120
121 //----------------------------------------------------------------------
122 // memory pool control
123 //----------------------------------------------------------------------
124
125 case GxB_MEMORY_POOL :
126
127 {
128 va_start (ap, field) ;
129 int64_t *free_pool_limit = va_arg (ap, int64_t *) ;
130 va_end (ap) ;
131 GB_RETURN_IF_NULL (free_pool_limit) ;
132 for (int k = 0 ; k < 64 ; k++)
133 {
134 free_pool_limit [k] = GB_Global_free_pool_limit_get (k) ;
135 }
136 }
137 break ;
138
139 //----------------------------------------------------------------------
140 // SuiteSparse:GraphBLAS version, date, license, etc
141 //----------------------------------------------------------------------
142
143 case GxB_LIBRARY_NAME :
144
145 {
146 va_start (ap, field) ;
147 char **name = va_arg (ap, char **) ;
148 va_end (ap) ;
149 GB_RETURN_IF_NULL (name) ;
150 (*name) = GxB_IMPLEMENTATION_NAME ;
151 }
152 break ;
153
154 case GxB_LIBRARY_VERSION :
155
156 {
157 va_start (ap, field) ;
158 int *version = va_arg (ap, int *) ;
159 va_end (ap) ;
160 GB_RETURN_IF_NULL (version) ;
161 version [0] = GxB_IMPLEMENTATION_MAJOR ;
162 version [1] = GxB_IMPLEMENTATION_MINOR ;
163 version [2] = GxB_IMPLEMENTATION_SUB ;
164 }
165 break ;
166
167 case GxB_LIBRARY_DATE :
168
169 {
170 va_start (ap, field) ;
171 char **date = va_arg (ap, char **) ;
172 va_end (ap) ;
173 GB_RETURN_IF_NULL (date) ;
174 (*date) = GxB_IMPLEMENTATION_DATE ;
175 }
176 break ;
177
178 case GxB_LIBRARY_ABOUT :
179
180 {
181 va_start (ap, field) ;
182 char **about = va_arg (ap, char **) ;
183 va_end (ap) ;
184 GB_RETURN_IF_NULL (about) ;
185 (*about) = GxB_IMPLEMENTATION_ABOUT ;
186 }
187 break ;
188
189 case GxB_LIBRARY_LICENSE :
190
191 {
192 va_start (ap, field) ;
193 char **license = va_arg (ap, char **) ;
194 va_end (ap) ;
195 GB_RETURN_IF_NULL (license) ;
196 (*license) = GxB_IMPLEMENTATION_LICENSE ;
197 }
198 break ;
199
200 case GxB_LIBRARY_COMPILE_DATE :
201
202 {
203 va_start (ap, field) ;
204 char **compile_date = va_arg (ap, char **) ;
205 va_end (ap) ;
206 GB_RETURN_IF_NULL (compile_date) ;
207 (*compile_date) = __DATE__ ;
208 }
209 break ;
210
211 case GxB_LIBRARY_COMPILE_TIME :
212
213 {
214 va_start (ap, field) ;
215 char **compile_time = va_arg (ap, char **) ;
216 va_end (ap) ;
217 GB_RETURN_IF_NULL (compile_time) ;
218 (*compile_time) = __TIME__ ;
219 }
220 break ;
221
222 case GxB_LIBRARY_URL :
223
224 {
225 va_start (ap, field) ;
226 char **url = va_arg (ap, char **) ;
227 va_end (ap) ;
228 GB_RETURN_IF_NULL (url) ;
229 (*url) = "http://faculty.cse.tamu.edu/davis/GraphBLAS" ;
230 }
231 break ;
232
233 //----------------------------------------------------------------------
234 // GraphBLAS API version, date, etc
235 //----------------------------------------------------------------------
236
237 case GxB_API_VERSION :
238
239 {
240 va_start (ap, field) ;
241 int *api_version = va_arg (ap, int *) ;
242 va_end (ap) ;
243 GB_RETURN_IF_NULL (api_version) ;
244 api_version [0] = GxB_SPEC_MAJOR ;
245 api_version [1] = GxB_SPEC_MINOR ;
246 api_version [2] = GxB_SPEC_SUB ;
247 }
248 break ;
249
250 case GxB_API_DATE :
251
252 {
253 va_start (ap, field) ;
254 char **api_date = va_arg (ap, char **) ;
255 va_end (ap) ;
256 GB_RETURN_IF_NULL (api_date) ;
257 (*api_date) = GxB_SPEC_DATE ;
258 }
259 break ;
260
261 case GxB_API_ABOUT :
262
263 {
264 va_start (ap, field) ;
265 char **api_about = va_arg (ap, char **) ;
266 va_end (ap) ;
267 GB_RETURN_IF_NULL (api_about) ;
268 (*api_about) = GxB_SPEC_ABOUT ;
269 }
270 break ;
271
272 case GxB_API_URL :
273
274 {
275 va_start (ap, field) ;
276 char **api_url = va_arg (ap, char **) ;
277 va_end (ap) ;
278 GB_RETURN_IF_NULL (api_url) ;
279 (*api_url) = "http://graphblas.org" ;
280 }
281 break ;
282
283 //----------------------------------------------------------------------
284 // controlling diagnostic output
285 //----------------------------------------------------------------------
286
287 case GxB_BURBLE :
288
289 {
290 va_start (ap, field) ;
291 bool *burble = va_arg (ap, bool *) ;
292 va_end (ap) ;
293 GB_RETURN_IF_NULL (burble) ;
294 (*burble) = GB_Global_burble_get ( ) ;
295 }
296 break ;
297
298 case GxB_PRINTF :
299
300 {
301 va_start (ap, field) ;
302 void **printf_func = va_arg (ap, void **) ;
303 va_end (ap) ;
304 GB_RETURN_IF_NULL (printf_func) ;
305 (*printf_func) = (void *) GB_Global_printf_get ( ) ;
306 }
307 break ;
308
309 case GxB_FLUSH :
310
311 {
312 va_start (ap, field) ;
313 void **flush_func = va_arg (ap, void **) ;
314 va_end (ap) ;
315 GB_RETURN_IF_NULL (flush_func) ;
316 (*flush_func) = (void *) GB_Global_flush_get ( ) ;
317 }
318 break ;
319
320 //----------------------------------------------------------------------
321 // CUDA (DRAFT: in progress, do not use)
322 //----------------------------------------------------------------------
323
324 case GxB_GLOBAL_GPU_CONTROL : // same as GxB_GPU_CONTROL
325
326 {
327 va_start (ap, field) ;
328 GrB_Desc_Value *gpu_control = va_arg (ap, GrB_Desc_Value *) ;
329 va_end (ap) ;
330 GB_RETURN_IF_NULL (gpu_control) ;
331 (*gpu_control) = GB_Global_gpu_control_get ( ) ;
332 }
333 break ;
334
335 case GxB_GLOBAL_GPU_CHUNK : // same as GxB_GPU_CHUNK
336
337 {
338 va_start (ap, field) ;
339 double *gpu_chunk = va_arg (ap, double *) ;
340 va_end (ap) ;
341 GB_RETURN_IF_NULL (gpu_chunk) ;
342 (*gpu_chunk) = GB_Global_gpu_chunk_get ( ) ;
343 }
344 break ;
345
346 default :
347
348 return (GrB_INVALID_VALUE) ;
349 }
350
351 return (GrB_SUCCESS) ;
352 }
353
354