1 //------------------------------------------------------------------------------
2 // GxB_Global_Option_set: set 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_set(GxB_Option_Field field,...)12 GrB_Info GxB_Global_Option_set      // set a global default option
13 (
14     GxB_Option_Field field,         // option to change
15     ...                             // value to change it to
16 )
17 {
18 
19     //--------------------------------------------------------------------------
20     // check inputs
21     //--------------------------------------------------------------------------
22 
23     GB_WHERE1 ("GxB_Global_Option_set (field, value)") ;
24 
25     //--------------------------------------------------------------------------
26     // set the global 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_Global_hyper_switch_set ((float) hyper_switch) ;
45             }
46             break ;
47 
48         case GxB_BITMAP_SWITCH :
49 
50             {
51                 va_start (ap, field) ;
52                 double *bitmap_switch = va_arg (ap, double *) ;
53                 va_end (ap) ;
54                 if (bitmap_switch == NULL)
55                 {
56                     // set all switches to their default
57                     GB_Global_bitmap_switch_default ( ) ;
58                 }
59                 else
60                 {
61                     for (int k = 0 ; k < GxB_NBITMAP_SWITCH ; k++)
62                     {
63                         float b = (float) (bitmap_switch [k]) ;
64                         GB_Global_bitmap_switch_set (k, b) ;
65                     }
66                 }
67             }
68             break ;
69 
70         case GxB_FORMAT :
71 
72             {
73                 va_start (ap, field) ;
74                 int format = va_arg (ap, int) ;
75                 va_end (ap) ;
76                 if (! (format == GxB_BY_ROW || format == GxB_BY_COL))
77                 {
78                     return (GrB_INVALID_VALUE) ;
79                 }
80                 GB_Global_is_csc_set (format != (int) GxB_BY_ROW) ;
81             }
82             break ;
83 
84         //----------------------------------------------------------------------
85         // OpenMP control
86         //----------------------------------------------------------------------
87 
88         case GxB_GLOBAL_NTHREADS :      // same as GxB_NTHREADS
89 
90             {
91                 va_start (ap, field) ;
92                 int nthreads_max_new = va_arg (ap, int) ;
93                 va_end (ap) ;
94                 // if < 1, then treat it as if nthreads_max = 1
95                 nthreads_max_new = GB_IMAX (1, nthreads_max_new) ;
96                 GB_Global_nthreads_max_set (nthreads_max_new) ;
97             }
98             break ;
99 
100         case GxB_GLOBAL_CHUNK :         // same as GxB_CHUNK
101 
102             {
103                 va_start (ap, field) ;
104                 double chunk = va_arg (ap, double) ;
105                 va_end (ap) ;
106                 GB_Global_chunk_set (chunk) ;
107             }
108             break ;
109 
110         //----------------------------------------------------------------------
111         // memory pool control
112         //----------------------------------------------------------------------
113 
114         case GxB_MEMORY_POOL :
115 
116             {
117                 va_start (ap, field) ;
118                 int64_t *free_pool_limit = va_arg (ap, int64_t *) ;
119                 va_end (ap) ;
120                 if (free_pool_limit == NULL)
121                 {
122                     // set all limits to their default
123                     GB_Global_free_pool_init (false) ;
124                 }
125                 else
126                 {
127                     for (int k = 3 ; k < 64 ; k++)
128                     {
129                         GB_Global_free_pool_limit_set (k, free_pool_limit [k]) ;
130                     }
131                 }
132             }
133             break ;
134 
135         //----------------------------------------------------------------------
136         // diagnostics
137         //----------------------------------------------------------------------
138 
139         case GxB_BURBLE :
140 
141             {
142                 va_start (ap, field) ;
143                 int burble = va_arg (ap, int) ;
144                 va_end (ap) ;
145                 GB_Global_burble_set ((bool) burble) ;
146             }
147             break ;
148 
149         case GxB_PRINTF :
150 
151             {
152                 va_start (ap, field) ;
153                 void *printf_func = va_arg (ap, void *) ;
154                 va_end (ap) ;
155                 GB_Global_printf_set ((GB_printf_function_t) printf_func) ;
156             }
157             break ;
158 
159         case GxB_FLUSH :
160 
161             {
162                 va_start (ap, field) ;
163                 void *flush_func = va_arg (ap, void *) ;
164                 va_end (ap) ;
165                 GB_Global_flush_set ((GB_flush_function_t) flush_func) ;
166             }
167             break ;
168 
169         //----------------------------------------------------------------------
170         // CUDA (DRAFT: in progress, do not use)
171         //----------------------------------------------------------------------
172 
173         case GxB_GLOBAL_GPU_CONTROL :       // same as GxB_GPU_CONTROL
174 
175             {
176                 va_start (ap, field) ;
177                 GrB_Desc_Value gpu_control = (GrB_Desc_Value) va_arg (ap, int) ;
178                 va_end (ap) ;
179                 GB_Global_gpu_control_set (gpu_control) ;
180             }
181             break ;
182 
183         case GxB_GLOBAL_GPU_CHUNK :         // same as GxB_GPU_CHUNK
184 
185             {
186                 va_start (ap, field) ;
187                 double gpu_chunk = va_arg (ap, double) ;
188                 va_end (ap) ;
189                 GB_Global_gpu_chunk_set (gpu_chunk) ;
190             }
191             break ;
192 
193         default :
194 
195             return (GrB_INVALID_VALUE) ;
196     }
197 
198     return (GrB_SUCCESS) ;
199 }
200 
201