Eigenvalue SoLvers for Petaflop-Applications (ELPA)  2020.11.001
elpa_constants.h
Go to the documentation of this file.
1 #pragma once
2 
3 /* This might seem over-engineered, but helps to re-use this file also on the
4  * Fortran side and thus to keep the definitions in this one place here
5  */
6 
7 /* Private helper macros */
8 #define ELPA_ENUM_ENTRY(name, value, ...) \
9  name = value,
10 #define ELPA_ENUM_SUM(name, value, ...) +1
11 
12 /* MATRIX layout */
13 #define ELPA_FOR_ALL_MATRIX_LAYOUTS(X) \
14  X(COLUMN_MAJOR_ORDER, 1) \
15  X(ROW_MAJOR_ORDER, 2)
16 
19 };
20 
21 #define ELPA_NUMBER_OF_MATRIX_LAYOUTS (0 ELPA_FOR_ALL_MATRIX_LAYOUTS(ELPA_ENUM_SUM))
22 
23 /* Solver constants */
24 #define ELPA_FOR_ALL_SOLVERS(X) \
25  X(ELPA_SOLVER_1STAGE, 1) \
26  X(ELPA_SOLVER_2STAGE, 2)
27 
30 };
31 
32 #define ELPA_NUMBER_OF_SOLVERS (0 ELPA_FOR_ALL_SOLVERS(ELPA_ENUM_SUM))
33 
34 /* Kernel constants */
35 #define ELPA_FOR_ALL_2STAGE_REAL_KERNELS(X, ...) \
36  X(ELPA_2STAGE_REAL_GENERIC, 1, 1, __VA_ARGS__) \
37  X(ELPA_2STAGE_REAL_GENERIC_SIMPLE, 2, 1, __VA_ARGS__) \
38  X(ELPA_2STAGE_REAL_BGP, 3, 0, __VA_ARGS__) \
39  X(ELPA_2STAGE_REAL_BGQ, 4, 0, __VA_ARGS__) \
40  X(ELPA_2STAGE_REAL_SSE_ASSEMBLY, 5, 1, __VA_ARGS__) \
41  X(ELPA_2STAGE_REAL_SSE_BLOCK2, 6, 1, __VA_ARGS__) \
42  X(ELPA_2STAGE_REAL_SSE_BLOCK4, 7, 1, __VA_ARGS__) \
43  X(ELPA_2STAGE_REAL_SSE_BLOCK6, 8, 1, __VA_ARGS__) \
44  X(ELPA_2STAGE_REAL_AVX_BLOCK2, 9, 1, __VA_ARGS__) \
45  X(ELPA_2STAGE_REAL_AVX_BLOCK4, 10, 1, __VA_ARGS__) \
46  X(ELPA_2STAGE_REAL_AVX_BLOCK6, 11, 1, __VA_ARGS__) \
47  X(ELPA_2STAGE_REAL_AVX2_BLOCK2, 12, 0, __VA_ARGS__) \
48  X(ELPA_2STAGE_REAL_AVX2_BLOCK4, 13, 0, __VA_ARGS__) \
49  X(ELPA_2STAGE_REAL_AVX2_BLOCK6, 14, 0, __VA_ARGS__) \
50  X(ELPA_2STAGE_REAL_AVX512_BLOCK2, 15, 0, __VA_ARGS__) \
51  X(ELPA_2STAGE_REAL_AVX512_BLOCK4, 16, 0, __VA_ARGS__) \
52  X(ELPA_2STAGE_REAL_AVX512_BLOCK6, 17, 0, __VA_ARGS__) \
53  X(ELPA_2STAGE_REAL_GPU, 18, 0, __VA_ARGS__) \
54  X(ELPA_2STAGE_REAL_SPARC64_BLOCK2, 19, 0, __VA_ARGS__) \
55  X(ELPA_2STAGE_REAL_SPARC64_BLOCK4, 20, 0, __VA_ARGS__) \
56  X(ELPA_2STAGE_REAL_SPARC64_BLOCK6, 21, 0, __VA_ARGS__) \
57  X(ELPA_2STAGE_REAL_NEON_ARCH64_BLOCK2, 22, 0, __VA_ARGS__) \
58  X(ELPA_2STAGE_REAL_NEON_ARCH64_BLOCK4, 23, 0, __VA_ARGS__) \
59  X(ELPA_2STAGE_REAL_NEON_ARCH64_BLOCK6, 24, 0, __VA_ARGS__) \
60  X(ELPA_2STAGE_REAL_VSX_BLOCK2, 25, 0, __VA_ARGS__) \
61  X(ELPA_2STAGE_REAL_VSX_BLOCK4, 26, 0, __VA_ARGS__) \
62  X(ELPA_2STAGE_REAL_VSX_BLOCK6, 27, 0, __VA_ARGS__) \
63  X(ELPA_2STAGE_REAL_SVE128_BLOCK2, 28, 0, __VA_ARGS__) \
64  X(ELPA_2STAGE_REAL_SVE128_BLOCK4, 29, 0, __VA_ARGS__) \
65  X(ELPA_2STAGE_REAL_SVE128_BLOCK6, 30, 0, __VA_ARGS__) \
66  X(ELPA_2STAGE_REAL_SVE256_BLOCK2, 31, 0, __VA_ARGS__) \
67  X(ELPA_2STAGE_REAL_SVE256_BLOCK4, 32, 0, __VA_ARGS__) \
68  X(ELPA_2STAGE_REAL_SVE256_BLOCK6, 33, 0, __VA_ARGS__) \
69  X(ELPA_2STAGE_REAL_SVE512_BLOCK2, 34, 0, __VA_ARGS__) \
70  X(ELPA_2STAGE_REAL_SVE512_BLOCK4, 35, 0, __VA_ARGS__) \
71  X(ELPA_2STAGE_REAL_SVE512_BLOCK6, 36, 0, __VA_ARGS__) \
72  X(ELPA_2STAGE_REAL_GENERIC_SIMPLE_BLOCK4, 37, 1, __VA_ARGS__) \
73  X(ELPA_2STAGE_REAL_GENERIC_SIMPLE_BLOCK6, 38, 1, __VA_ARGS__)
74 
75 #define ELPA_FOR_ALL_2STAGE_REAL_KERNELS_AND_DEFAULT(X) \
76  ELPA_FOR_ALL_2STAGE_REAL_KERNELS(X) \
77  X(ELPA_2STAGE_REAL_INVALID, -1, choke me) \
78  X(ELPA_2STAGE_REAL_DEFAULT, 9, choke me)
79 
80 enum ELPA_REAL_KERNELS {
82 };
83 
84 
85 #define ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS(X, ...) \
86  X(ELPA_2STAGE_COMPLEX_GENERIC, 1, 1, __VA_ARGS__) \
87  X(ELPA_2STAGE_COMPLEX_GENERIC_SIMPLE, 2, 1, __VA_ARGS__) \
88  X(ELPA_2STAGE_COMPLEX_BGP, 3, 0, __VA_ARGS__) \
89  X(ELPA_2STAGE_COMPLEX_BGQ, 4, 0, __VA_ARGS__) \
90  X(ELPA_2STAGE_COMPLEX_SSE_ASSEMBLY, 5, 1, __VA_ARGS__) \
91  X(ELPA_2STAGE_COMPLEX_SSE_BLOCK1, 6, 1, __VA_ARGS__) \
92  X(ELPA_2STAGE_COMPLEX_SSE_BLOCK2, 7, 1, __VA_ARGS__) \
93  X(ELPA_2STAGE_COMPLEX_AVX_BLOCK1, 8, 1, __VA_ARGS__) \
94  X(ELPA_2STAGE_COMPLEX_AVX_BLOCK2, 9, 1, __VA_ARGS__) \
95  X(ELPA_2STAGE_COMPLEX_AVX2_BLOCK1, 10, 0, __VA_ARGS__) \
96  X(ELPA_2STAGE_COMPLEX_AVX2_BLOCK2, 11, 0, __VA_ARGS__) \
97  X(ELPA_2STAGE_COMPLEX_AVX512_BLOCK1, 12, 0, __VA_ARGS__) \
98  X(ELPA_2STAGE_COMPLEX_AVX512_BLOCK2, 13, 0, __VA_ARGS__) \
99  X(ELPA_2STAGE_COMPLEX_SVE128_BLOCK1, 14, 0, __VA_ARGS__) \
100  X(ELPA_2STAGE_COMPLEX_SVE128_BLOCK2, 15, 0, __VA_ARGS__) \
101  X(ELPA_2STAGE_COMPLEX_SVE256_BLOCK1, 16, 0, __VA_ARGS__) \
102  X(ELPA_2STAGE_COMPLEX_SVE256_BLOCK2, 17, 0, __VA_ARGS__) \
103  X(ELPA_2STAGE_COMPLEX_SVE512_BLOCK1, 18, 0, __VA_ARGS__) \
104  X(ELPA_2STAGE_COMPLEX_SVE512_BLOCK2, 19, 0, __VA_ARGS__) \
105  X(ELPA_2STAGE_COMPLEX_NEON_ARCH64_BLOCK1, 20, 0, __VA_ARGS__) \
106  X(ELPA_2STAGE_COMPLEX_NEON_ARCH64_BLOCK2, 21, 0, __VA_ARGS__) \
107  X(ELPA_2STAGE_COMPLEX_GPU, 22, 0, __VA_ARGS__)
108 
109 #define ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS_AND_DEFAULT(X) \
110  ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS(X) \
111  X(ELPA_2STAGE_COMPLEX_INVALID, -1, choke me) \
112  X(ELPA_2STAGE_COMPLEX_DEFAULT, 8, choke me)
113 
116 };
117 
118 
119 
120 /* General constants */
121 #define ELPA_FOR_ALL_ERRORS(X) \
122  X(ELPA_OK, 0) \
123  X(ELPA_ERROR, -1) \
124  X(ELPA_ERROR_ENTRY_NOT_FOUND, -2) \
125  X(ELPA_ERROR_ENTRY_INVALID_VALUE, -3) \
126  X(ELPA_ERROR_ENTRY_ALREADY_SET, -4) \
127  X(ELPA_ERROR_ENTRY_NO_STRING_REPRESENTATION, -5) \
128  X(ELPA_ERROR_SETUP, -6) \
129  X(ELPA_ERROR_CRITICAL, -7) \
130  X(ELPA_ERROR_API_VERSION, -8) \
131  X(ELPA_ERROR_AUTOTUNE_API_VERSION, -9) \
132  X(ELPA_ERROR_AUTOTUNE_OBJECT_CHANGED, -10) \
133  X(ELPA_ERROR_ENTRY_READONLY, -11) \
134  X(ELPA_ERROR_CANNOT_OPEN_FILE, -12)
135 
136 enum ELPA_ERRORS {
138 };
139 
141  ELPA_2STAGE_NUMBER_OF_COMPLEX_KERNELS = (0 ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS(ELPA_ENUM_SUM)),
142  ELPA_2STAGE_NUMBER_OF_REAL_KERNELS = (0 ELPA_FOR_ALL_2STAGE_REAL_KERNELS(ELPA_ENUM_SUM)),
143 };
144 
145 #define ELPA_FOR_ALL_AUTOTUNE_LEVELS(X, ...) \
146  X(ELPA_AUTOTUNE_NOT_TUNABLE, 0) \
147  X(ELPA_AUTOTUNE_FAST, 1) \
148  X(ELPA_AUTOTUNE_MEDIUM, 2) \
149  X(ELPA_AUTOTUNE_EXTENSIVE, 3)
150 
153 };
154 
155 
156 #define ELPA_FOR_ALL_AUTOTUNE_DOMAINS(X, ...) \
157  X(ELPA_AUTOTUNE_DOMAIN_REAL, 1) \
158  X(ELPA_AUTOTUNE_DOMAIN_COMPLEX, 2) \
159  X(ELPA_AUTOTUNE_DOMAIN_ANY, 3)
160 
163 };
ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS_AND_DEFAULT
#define ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS_AND_DEFAULT(X)
Definition: elpa_constants.h:106
ELPA_FOR_ALL_ERRORS
#define ELPA_FOR_ALL_ERRORS(X)
Definition: elpa_constants.h:117
ELPA_AUTOTUNE_LEVELS
ELPA_AUTOTUNE_LEVELS
Definition: elpa_constants.h:146
ELPA_ERRORS
ELPA_ERRORS
Definition: elpa_constants.h:132
ELPA_COMPLEX_KERNELS
ELPA_COMPLEX_KERNELS
Definition: elpa_constants.h:111
ELPA_FOR_ALL_SOLVERS
#define ELPA_FOR_ALL_SOLVERS(X)
Definition: elpa_constants.h:23
ELPA_AUTOTUNE_DOMAINS
ELPA_AUTOTUNE_DOMAINS
Definition: elpa_constants.h:155
ELPA_FOR_ALL_AUTOTUNE_LEVELS
#define ELPA_FOR_ALL_AUTOTUNE_LEVELS(X,...)
Definition: elpa_constants.h:140
MATRIX_LAYOUTS
MATRIX_LAYOUTS
Definition: elpa_constants.h:17
ELPA_REAL_KERNELS
ELPA_REAL_KERNELS
Definition: elpa_constants.h:78
ELPA_ENUM_ENTRY
#define ELPA_ENUM_ENTRY(name, value,...)
Definition: elpa_constants.h:8
ELPA_SOLVERS
ELPA_SOLVERS
Definition: elpa_constants.h:27
ELPA_FOR_ALL_MATRIX_LAYOUTS
#define ELPA_FOR_ALL_MATRIX_LAYOUTS(X)
Definition: elpa_constants.h:13
ELPA_ENUM_SUM
#define ELPA_ENUM_SUM(name, value,...)
Definition: elpa_constants.h:10
ELPA_FOR_ALL_2STAGE_REAL_KERNELS
#define ELPA_FOR_ALL_2STAGE_REAL_KERNELS(X,...)
Definition: elpa_constants.h:33
ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS
#define ELPA_FOR_ALL_2STAGE_COMPLEX_KERNELS(X,...)
Definition: elpa_constants.h:82
ELPA_FOR_ALL_2STAGE_REAL_KERNELS_AND_DEFAULT
#define ELPA_FOR_ALL_2STAGE_REAL_KERNELS_AND_DEFAULT(X)
Definition: elpa_constants.h:73
ELPA_FOR_ALL_AUTOTUNE_DOMAINS
#define ELPA_FOR_ALL_AUTOTUNE_DOMAINS(X,...)
Definition: elpa_constants.h:150
ELPA_CONSTANTS
ELPA_CONSTANTS
Definition: elpa_constants.h:135