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