1 /*
2 
3     Copyright (C) 2014, The University of Texas at Austin
4 
5     This file is part of libflame and is available under the 3-Clause
6     BSD license, which can be found in the LICENSE file at the top-level
7     directory, or at http://opensource.org/licenses/BSD-3-Clause
8 
9 */
10 
11 
12 
13 // --- Miscellaneous macro definitions -----------------------------------------
14 
15 #undef  NULL
16 #define NULL 0
17 
18 #ifdef FLA_ENABLE_WINDOWS_BUILD
19   #define restrict  __restrict
20 #endif
21 
22 
23 // --- Type-related macro definitions ------------------------------------------
24 
25 // FLA_Bool
26 #undef  TRUE
27 #undef  FALSE
28 #define TRUE  1
29 #define FALSE 0
30 
31 // FLA_Error (non-specific)
32 #define FLA_SUCCESS           (-1)
33 #define FLA_FAILURE           (-2)
34 
35 // FLA_Quadrant
36 #define FLA_TL                 11
37 #define FLA_TR                 12
38 #define FLA_BL                 21
39 #define FLA_BR                 22
40 
41 // FLA_Datatype
42 #define FLA_FLOAT             100
43 #define FLA_DOUBLE            101
44 #define FLA_COMPLEX           102
45 #define FLA_DOUBLE_COMPLEX    103
46 #define FLA_INT               104
47 #define FLA_CONSTANT          105
48 
49 // FLA_Elemtype
50 #define FLA_MATRIX            150
51 #define FLA_SCALAR            151
52 
53 // FLA_Side
54 #define FLA_TOP               200
55 #define FLA_BOTTOM            201
56 #define FLA_LEFT              210
57 #define FLA_RIGHT             211
58 #define FLA_SIDE_MASK         0x1
59 
60 // FLA_Uplo
61 #define FLA_LOWER_TRIANGULAR  300
62 #define FLA_UPPER_TRIANGULAR  301
63 #define FLA_ZERO_MATRIX       310
64 #define FLA_FULL_MATRIX       311
65 #define FLA_UPLO_MASK         0x1
66 
67 // FLA_Trans
68 #define FLA_NO_TRANSPOSE      400
69 #define FLA_TRANSPOSE         401
70 #define FLA_CONJ_TRANSPOSE    402
71 #define FLA_CONJ_NO_TRANSPOSE 403
72 #define FLA_TRANS_MASK        0x3
73 
74 // FLA_Conj
75 #define FLA_NO_CONJUGATE      450
76 #define FLA_CONJUGATE         451
77 
78 // FLA_Diag
79 #define FLA_UNIT_DIAG         500
80 #define FLA_NONUNIT_DIAG      501
81 #define FLA_ZERO_DIAG         502
82 #define FLA_DIAG_MASK         0x3
83 
84 // FLA_Dimension
85 #define FLA_DIMENSION_M       600
86 #define FLA_DIMENSION_K       601
87 #define FLA_DIMENSION_N       602
88 #define FLA_DIMENSION_MIN     603
89 
90 // FLA_Dimension_index
91 #define FLA_DIM_M_INDEX         0
92 #define FLA_DIM_K_INDEX         1
93 #define FLA_DIM_N_INDEX         2
94 #define FLA_DIM_MIN_INDEX       3
95 #define FLA_DIM_INDEX_MASK    0x3
96 
97 // FLA_Pivot_type
98 #define FLA_NATIVE_PIVOTS     700
99 #define FLA_LAPACK_PIVOTS     701
100 
101 // FLA_Direct
102 #define FLA_FORWARD           800
103 #define FLA_BACKWARD          801
104 
105 // FLA_Store
106 #define FLA_COLUMNWISE        900
107 #define FLA_ROWWISE           901
108 
109 // FLA_Matrix_type
110 #define FLA_FLAT             1000
111 #define FLA_HIER             1001
112 
113 // FLA_Precision
114 #define FLA_SINGLE_PRECISION 1100
115 #define FLA_DOUBLE_PRECISION 1101
116 
117 // FLA_Domain
118 #define FLA_REAL_DOMAIN      1200
119 #define FLA_COMPLEX_DOMAIN   1201
120 
121 // FLA_Inv
122 #define FLA_NO_INVERSE       1300
123 #define FLA_INVERSE          1301
124 
125 // FLA_Evd_type
126 #define FLA_EVD_WITHOUT_VECTORS         1400
127 #define FLA_EVD_WITH_VECTORS            1401
128 #define FLA_EVD_OF_TRIDIAG_WITH_VECTORS 1402
129 
130 // FLA_Svd_type
131 #define FLA_SVD_VECTORS_ALL           1500
132 #define FLA_SVD_VECTORS_MIN_COPY      1501
133 #define FLA_SVD_VECTORS_MIN_OVERWRITE 1502
134 #define FLA_SVD_VECTORS_NONE          1503
135 
136 // FLA_Machval
137 #define FLA_MACH_START                1600
138 #define FLA_MACH_EPS                  1600
139 #define FLA_MACH_SFMIN                1601
140 #define FLA_MACH_BASE                 1602
141 #define FLA_MACH_PREC                 1603
142 #define FLA_MACH_NDIGMANT             1604
143 #define FLA_MACH_RND                  1605
144 #define FLA_MACH_EMIN                 1606
145 #define FLA_MACH_RMIN                 1607
146 #define FLA_MACH_EMAX                 1608
147 #define FLA_MACH_RMAX                 1609
148 #define FLA_MACH_EPS2                 1610
149 #define FLA_MACH_N_VALS                 11
150 
151 // FLA_Diag_off
152 #define FLA_SUPER_DIAGONAL     ( 1)
153 #define FLA_MAIN_DIAGONAL        0
154 #define FLA_SUB_DIAGONAL       (-1)
155 
156 // FLAME threading model
157 #define FLA_OPENMP              1
158 #define FLA_PTHREADS            2
159 
160 // FLAME vector intrinsics types
161 #define FLA_NO_INTRINSICS       0
162 #define FLA_SSE_INTRINSICS      3
163 
164 // FLAME internal error checking level
165 #define FLA_FULL_ERROR_CHECKING 2
166 #define FLA_MIN_ERROR_CHECKING  1
167 #define FLA_NO_ERROR_CHECKING   0
168 
169 // FLA_Datatype_index
170 #define FLA_S_INDEX             0
171 #define FLA_D_INDEX             1
172 #define FLA_C_INDEX             2
173 #define FLA_Z_INDEX             3
174 #define FLA_DTYPE_INDEX_MASK  0x3
175 
176 // Default blocksize if none are available.
177 #ifndef FLA_DEFAULT_M_BLOCKSIZE
178   #define FLA_DEFAULT_M_BLOCKSIZE  128
179 #endif
180 #ifndef FLA_DEFAULT_K_BLOCKSIZE
181   #define FLA_DEFAULT_K_BLOCKSIZE  128
182 #endif
183 #ifndef FLA_DEFAULT_N_BLOCKSIZE
184   #define FLA_DEFAULT_N_BLOCKSIZE  128
185 #endif
186 
187 // QR and LQ factorizations typically has an inner blocksize that corresponds
188 // to the length of the S (or T) block Householder matrix. For consistency, we
189 // define the ratio of the inner blocksize to the outer blocksize here, as it
190 // is used in several places. Note that other operations have analagous inner
191 // blocksizes, which we also define in terms of the outer storage blocksize,
192 // or in some cases such as Hessenberg, tridiagonal, and bidiagonal reductions,
193 // in terms of the system-wide default blocksize.
194 #define FLA_QR_INNER_TO_OUTER_B_RATIO      (0.25)
195 #define FLA_LQ_INNER_TO_OUTER_B_RATIO      (0.25)
196 #define FLA_LU_INNER_TO_OUTER_B_RATIO      (0.25)
197 #define FLA_UDDATE_INNER_TO_OUTER_B_RATIO  (0.25)
198 #define FLA_HESS_INNER_TO_OUTER_B_RATIO    (0.25)
199 #define FLA_TRIDIAG_INNER_TO_OUTER_B_RATIO (0.25)
200 #define FLA_BIDIAG_INNER_TO_OUTER_B_RATIO  (0.25)
201 #define FLA_CAQR_INNER_TO_OUTER_B_RATIO    (0.25)
202 
203 
204 
205 // --- Error-related macro definitions -----------------------------------------
206 
207 // Useful when determining the relative index base of the error codes.
208 #define FLA_ERROR_CODE_MIN                    (-10)
209 
210 // FLA_Error values.
211 #define FLA_INVALID_SIDE                      (-10)
212 #define FLA_INVALID_UPLO                      (-11)
213 #define FLA_INVALID_TRANS                     (-12)
214 #define FLA_INVALID_TRANS_GIVEN_DATATYPE      (-13)
215 #define FLA_INVALID_CONJ                      (-14)
216 #define FLA_INVALID_DIRECT                    (-15)
217 #define FLA_INVALID_STOREV                    (-16)
218 #define FLA_INVALID_DATATYPE                  (-17)
219 #define FLA_INVALID_INTEGER_DATATYPE          (-18)
220 #define FLA_INVALID_REAL_DATATYPE             (-19)
221 #define FLA_INVALID_COMPLEX_DATATYPE          (-20)
222 #define FLA_OBJECT_NOT_INTEGER                (-21)
223 #define FLA_OBJECT_NOT_REAL                   (-22)
224 #define FLA_OBJECT_NOT_COMPLEX                (-23)
225 #define FLA_OBJECT_NOT_SQUARE                 (-24)
226 #define FLA_OBJECT_NOT_SCALAR                 (-25)
227 #define FLA_OBJECT_NOT_VECTOR                 (-26)
228 #define FLA_INCONSISTENT_DATATYPES            (-27)
229 #define FLA_NONCONFORMAL_DIMENSIONS           (-28)
230 #define FLA_UNEQUAL_VECTOR_DIMS               (-29)
231 #define FLA_INVALID_HESSENBERG_INDICES        (-30)
232 #define FLA_NULL_POINTER                      (-32)
233 #define FLA_SPECIFIED_OBJ_DIM_MISMATCH        (-33)
234 #define FLA_INVALID_PIVOT_TYPE                (-35)
235 #define FLA_MALLOC_RETURNED_NULL_POINTER      (-37)
236 #define FLA_OBJECT_BASE_BUFFER_MISMATCH       (-38)
237 #define FLA_OBJECTS_NOT_VERTICALLY_ADJ        (-39)
238 #define FLA_OBJECTS_NOT_HORIZONTALLY_ADJ      (-40)
239 #define FLA_ADJACENT_OBJECT_DIM_MISMATCH      (-41)
240 #define FLA_OBJECTS_NOT_VERTICALLY_ALIGNED    (-42)
241 #define FLA_OBJECTS_NOT_HORIZONTALLY_ALIGNED  (-43)
242 #define FLA_INVALID_FLOATING_DATATYPE         (-44)
243 #define FLA_OBJECT_NOT_FLOATING_POINT         (-45)
244 #define FLA_INVALID_BLOCKSIZE_VALUE           (-46)
245 #define FLA_OPEN_RETURNED_ERROR               (-47)
246 #define FLA_LSEEK_RETURNED_ERROR              (-48)
247 #define FLA_CLOSE_RETURNED_ERROR              (-49)
248 #define FLA_UNLINK_RETURNED_ERROR             (-50)
249 #define FLA_READ_RETURNED_ERROR               (-51)
250 #define FLA_WRITE_RETURNED_ERROR              (-52)
251 #define FLA_INVALID_QUADRANT                  (-53)
252 #define FLA_NOT_YET_IMPLEMENTED               (-54)
253 #define FLA_EXPECTED_NONNEGATIVE_VALUE        (-55)
254 #define FLA_SUPERMATRIX_NOT_ENABLED           (-56)
255 #define FLA_UNDEFINED_ERROR_CODE              (-57)
256 #define FLA_INVALID_DIAG                      (-58)
257 #define FLA_INCONSISTENT_OBJECT_PRECISION     (-59)
258 #define FLA_INVALID_BLOCKSIZE_OBJ             (-60)
259 #define FLA_VECTOR_DIM_BELOW_MIN              (-61)
260 #define FLA_PTHREAD_CREATE_RETURNED_ERROR     (-63)
261 #define FLA_PTHREAD_JOIN_RETURNED_ERROR       (-64)
262 #define FLA_INVALID_ISGN_VALUE                (-65)
263 #define FLA_CHOL_FAILED_MATRIX_NOT_SPD        (-67)
264 #define FLA_INVALID_ELEMTYPE                  (-68)
265 #define FLA_POSIX_MEMALIGN_FAILED             (-69)
266 #define FLA_INVALID_SUBMATRIX_DIMS            (-70)
267 #define FLA_INVALID_SUBMATRIX_OFFSET          (-71)
268 #define FLA_OBJECT_NOT_SCALAR_ELEMTYPE        (-72)
269 #define FLA_OBJECT_NOT_MATRIX_ELEMTYPE        (-73)
270 #define FLA_ENCOUNTERED_NON_POSITIVE_NTHREADS (-74)
271 #define FLA_INVALID_CONJ_GIVEN_DATATYPE       (-75)
272 #define FLA_INVALID_COMPLEX_TRANS             (-76)
273 #define FLA_INVALID_REAL_TRANS                (-77)
274 #define FLA_INVALID_BLAS_TRANS                (-78)
275 #define FLA_INVALID_NONCONSTANT_DATATYPE      (-79)
276 #define FLA_OBJECT_NOT_NONCONSTANT            (-80)
277 #define FLA_OBJECT_DATATYPES_NOT_EQUAL        (-82)
278 #define FLA_DIVIDE_BY_ZERO                    (-83)
279 #define FLA_OBJECT_ELEMTYPES_NOT_EQUAL        (-84)
280 #define FLA_INVALID_PIVOT_INDEX_RANGE         (-85)
281 #define FLA_HOUSEH_PANEL_MATRIX_TOO_SMALL     (-86)
282 #define FLA_INVALID_OBJECT_LENGTH             (-87)
283 #define FLA_INVALID_OBJECT_WIDTH              (-88)
284 #define FLA_INVALID_ERROR_CHECKING_LEVEL      (-89)
285 #define FLA_ATTEMPTED_OVER_REPART_2X2         (-90)
286 #define FLA_ATTEMPTED_OVER_REPART_2X1         (-91)
287 #define FLA_ATTEMPTED_OVER_REPART_1X2         (-92)
288 #define FLA_EXTERNAL_LAPACK_NOT_IMPLEMENTED   (-93)
289 #define FLA_INVALID_ROW_STRIDE                (-94)
290 #define FLA_INVALID_COL_STRIDE                (-95)
291 #define FLA_INVALID_STRIDE_COMBINATION        (-96)
292 #define FLA_INVALID_VECTOR_DIM                (-97)
293 #define FLA_EXPECTED_ROW_VECTOR               (-98)
294 #define FLA_EXPECTED_COL_VECTOR               (-99)
295 #define FLA_INVALID_INVERSE                   (-100)
296 #define FLA_MALLOC_GPU_RETURNED_NULL_POINTER  (-101)
297 #define FLA_INVALID_EVD_TYPE                  (-102)
298 #define FLA_INVALID_SVD_TYPE                  (-103)
299 #define FLA_INVALID_MACHVAL                   (-104)
300 #define FLA_INVALID_DIAG_OFFSET               (-105)
301 #define FLA_EXPECTED_COL_STORAGE              (-106)
302 #define FLA_EXPECTED_ROW_STORAGE              (-107)
303 #define FLA_LAPAC2FLAME_INVALID_RETURN        (-108)
304 #define FLA_INVALID_SVD_TYPE_COMBINATION      (-109)
305 #define FLA_INVALID_SVD_TYPE_AND_TRANS_COMBINATION (-110)
306 #define FLA_OBJECT_NOT_COMPARABLE             (-111)
307 
308 // Necessary when computing whether an error code is defined.
309 #define FLA_ERROR_CODE_MAX                    (-111)
310 
311 // Internal string matrix limits.
312 #define FLA_MAX_NUM_ERROR_MSGS                 150
313 #define FLA_MAX_ERROR_MSG_LENGTH               200
314 
315 // Error code translation and output macro definition.
316 #define FLA_Check_error_code( code ) \
317         FLA_Check_error_code_helper( code, __FILE__, __LINE__ )
318 
319 
320 
321 // --- Common functions implemented as macros ----------------------------------
322 
323 #undef min
324 #define min( x, y ) ( (x) < (y) ? (x) : (y) )
325 
326 #undef max
327 #define max( x, y ) ( (x) > (y) ? (x) : (y) )
328 
329 #undef signof
330 #define signof( a, b ) ( (b) >= 0 ? (a) : -(a) )
331 
332 #undef exchange
333 #define exchange( a, b, temp ) { temp = a; a = b; b = temp; }
334 
335 // --- Other macro definitions -------------------------------------------------
336 
337 #define FLA_NEGATE( a ) \
338         ( a.base == FLA_ONE.base ? FLA_MINUS_ONE : FLA_ONE )
339 
340 
341