ABACUS
develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
source
source_base
module_container
base
macros
macros.h
Go to the documentation of this file.
1
#ifndef BASE_MACROS_MACROS_H_
2
#define BASE_MACROS_MACROS_H_
3
4
#include <cstdint>
5
#include <
base/utils/logging.h
>
6
7
#if __CUDA
8
#include <
base/macros/cuda.h
>
9
#elif __ROCM
10
#include <
base/macros/rocm.h
>
11
#endif
12
13
#include <
ATen/core/tensor_types.h
>
14
15
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
16
TypeName(const TypeName&) = delete; \
17
void operator=(const TypeName&) = delete
18
19
#define DISALLOW_MOVE_AND_ASSIGN(TypeName) \
20
TypeName(TypeName&&) = delete; \
21
void operator=(TypeName&&) = delete
22
23
#define DISALLOW_COPY_MOVE_AND_ASSIGN(TypeName) \
24
DISALLOW_COPY_AND_ASSIGN(TypeName); \
25
DISALLOW_MOVE_AND_ASSIGN(TypeName)
26
27
#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
28
TypeName() = delete; \
29
DISALLOW_COPY_MOVE_AND_ASSIGN(TypeName)
30
31
#define MAX_SIZE_T UINT64_MAX
32
33
#if defined(__CUDACC__) || defined(__HIPCC__)
34
#define AT_HOST __host__
35
#define AT_DEVICE __device__
36
#define AT_HOST_DEVICE __host__ __device__
37
#else
38
#define AT_HOST
39
#define AT_DEVICE
40
#define AT_HOST_DEVICE
41
#endif
// defined(__CUDACC__) || defined(__HIPCC__)
42
43
#if defined(__GNUC__) || defined(__ICL) || defined(__clang__)
44
#define PREDICT_TRUE(expr) (__builtin_expect(static_cast<bool>(expr), 1))
45
#define PREDICT_FALSE(expr) (__builtin_expect(static_cast<bool>(expr), 0))
46
#else
47
#define PREDICT_TRUE(expr) (expr)
48
#define PREDICT_FALSE(expr) (expr)
49
#endif
50
51
#define CHECK_MSG(expr, ...) \
52
(::base::utils::check_msg_impl( \
53
"Expected " #expr \
54
" to be true, but got false. " \
55
__VA_ARGS__ " " \
56
"(Could this error message be improved? If so, " \
57
"please report an enhancement request to Container)" \
58
))
59
60
#define REQUIRES_OK(expr, ...) \
61
if(PREDICT_FALSE(!(expr))) { \
62
::base::utils::check_exit_impl( \
63
__func__, \
64
__FILE__, \
65
static_cast<uint32_t>(__LINE__), \
66
CHECK_MSG(expr, ##__VA_ARGS__)); \
67
}
68
69
// The macro TEMPLATE_1() expands to a switch statement conditioned on
70
// TYPE_ENUM. Each case expands the STMTS after a typedef for T.
71
#define SINGLE_ARG(...) __VA_ARGS__
72
73
#define CASE_2(TYPE, DEVICE, STMTS) \
74
case (int(ct::DataTypeToEnum<TYPE>::value) * 10 + \
75
int(ct::DeviceTypeToEnum<DEVICE>::value)): { \
76
typedef TYPE T_; \
77
typedef DEVICE DEVICE_; \
78
STMTS; \
79
break; \
80
}
81
82
#define CASE_LAMBDA_2(TYPE, DEVICE, FUNC) \
83
case (int(ct::DataTypeToEnum<TYPE>::value) * 10 + \
84
int(ct::DeviceTypeToEnum<DEVICE>::value)): { \
85
typedef TYPE T_; \
86
typedef DEVICE DEVICE_; \
87
FUNC(); \
88
break; \
89
}
90
91
#define CASES_ALL_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, STMTS, DEFAULT) \
92
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
93
CASE_2(float, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
94
CASE_2(double, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
95
CASE_2(int, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
96
CASE_2(int64_t, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
97
CASE_2(std::complex<float>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
98
CASE_2(std::complex<double>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
99
default: \
100
DEFAULT; \
101
break; \
102
}
103
104
#define CASES_ALL_LAMBDA_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, FUNC, DEFAULT) \
105
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
106
CASE_LAMBDA_2(float, ct::DEVICE_CPU, FUNC) \
107
CASE_LAMBDA_2(double, ct::DEVICE_CPU, FUNC) \
108
CASE_LAMBDA_2(int, ct::DEVICE_CPU, FUNC) \
109
CASE_LAMBDA_2(int64_t, ct::DEVICE_CPU, FUNC) \
110
CASE_LAMBDA_2(std::complex<float>, ct::DEVICE_CPU, FUNC) \
111
CASE_LAMBDA_2(std::complex<double>, ct::DEVICE_CPU, FUNC) \
112
default: \
113
DEFAULT; \
114
break; \
115
}
116
117
#define CASES_BLAS_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, STMTS, DEFAULT) \
118
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
119
CASE_2(float, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
120
CASE_2(double, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
121
CASE_2(std::complex<float>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
122
CASE_2(std::complex<double>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
123
default: \
124
DEFAULT; \
125
break; \
126
}
127
128
#define CASES_ALL_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, STMTS, DEFAULT) \
129
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
130
CASE_2(float, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
131
CASE_2(float, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
132
CASE_2(double, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
133
CASE_2(double, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
134
CASE_2(int, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
135
CASE_2(int, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
136
CASE_2(int64_t, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
137
CASE_2(int64_t, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
138
CASE_2(std::complex<float>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
139
CASE_2(std::complex<float>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
140
CASE_2(std::complex<double>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
141
CASE_2(std::complex<double>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
142
default: \
143
DEFAULT; \
144
break; \
145
}
146
147
#define CASES_ALL_LAMBDA_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, FUNC, DEFAULT) \
148
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
149
CASE_LAMBDA_2(float, ct::DEVICE_CPU, FUNC) \
150
CASE_LAMBDA_2(float, ct::DEVICE_GPU, FUNC) \
151
CASE_LAMBDA_2(double, ct::DEVICE_CPU, FUNC) \
152
CASE_LAMBDA_2(double, ct::DEVICE_GPU, FUNC) \
153
CASE_LAMBDA_2(int, ct::DEVICE_CPU, FUNC) \
154
CASE_LAMBDA_2(int, ct::DEVICE_GPU, FUNC) \
155
CASE_LAMBDA_2(int64_t, ct::DEVICE_CPU, FUNC) \
156
CASE_LAMBDA_2(int64_t, ct::DEVICE_GPU, FUNC) \
157
CASE_LAMBDA_2(std::complex<float>, ct::DEVICE_CPU, FUNC) \
158
CASE_LAMBDA_2(std::complex<float>, ct::DEVICE_GPU, FUNC) \
159
CASE_LAMBDA_2(std::complex<double>, ct::DEVICE_CPU, FUNC) \
160
CASE_LAMBDA_2(std::complex<double>, ct::DEVICE_GPU, FUNC) \
161
default: \
162
DEFAULT; \
163
break; \
164
}
165
166
#define CASES_BLAS_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, STMTS, DEFAULT) \
167
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
168
CASE_2(float, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
169
CASE_2(float, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
170
CASE_2(double, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
171
CASE_2(double, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
172
CASE_2(std::complex<float>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
173
CASE_2(std::complex<float>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
174
CASE_2(std::complex<double>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
175
CASE_2(std::complex<double>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
176
default: \
177
DEFAULT; \
178
break; \
179
}
180
181
#define CASES_CZ_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, STMTS, DEFAULT) \
182
switch (int(TYPE_ENUM) * 10 + int(DEVICE_ENUM)) { \
183
CASE_2(std::complex<float>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
184
CASE_2(std::complex<float>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
185
CASE_2(std::complex<double>, ct::DEVICE_CPU, SINGLE_ARG(STMTS)) \
186
CASE_2(std::complex<double>, ct::DEVICE_GPU, SINGLE_ARG(STMTS)) \
187
default: \
188
DEFAULT; \
189
break; \
190
}
191
192
193
#if __CUDA || __ROCM
194
#define TEMPLATE_ALL_LAMBDA_2(TYPE_ENUM, DEVICE_ENUM, ...) \
195
CASES_ALL_LAMBDA_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
196
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
197
198
#define TEMPLATE_ALL_2(TYPE_ENUM, DEVICE_ENUM, ...) \
199
CASES_ALL_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
200
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
201
202
#define TEMPLATE_BLAS_2(TYPE_ENUM, DEVICE_ENUM, ...) \
203
CASES_BLAS_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
204
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
205
206
#define TEMPLATE_ALL_CALC_2(TYPE_ENUM, DEVICE_ENUM, ...) \
207
CASES_ALL_CALC_WITH_DEFAULT_2_GPU(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
208
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
209
#else
210
#define TEMPLATE_ALL_LAMBDA_2(TYPE_ENUM, DEVICE_ENUM, ...) \
211
CASES_ALL_LAMBDA_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
212
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
213
214
#define TEMPLATE_ALL_2(TYPE_ENUM, DEVICE_ENUM, ...) \
215
CASES_ALL_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
216
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
217
218
#define TEMPLATE_BLAS_2(TYPE_ENUM, DEVICE_ENUM, ...) \
219
CASES_BLAS_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
220
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
221
222
#define TEMPLATE_ALL_CALC_2(TYPE_ENUM, DEVICE_ENUM, ...) \
223
CASES_ALL_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
224
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
225
#endif
226
227
#define TEMPLATE_CZ_2(TYPE_ENUM, DEVICE_ENUM, ...) \
228
CASES_CZ_WITH_DEFAULT_2(TYPE_ENUM, DEVICE_ENUM, (__VA_ARGS__), \
229
std::cerr << "Unexpected type: " << TYPE_ENUM; exit(EXIT_FAILURE));
230
231
232
#if defined(_MSC_VER)
233
#define AT_ALWAYS_INLINE __forceinline
234
#elif __has_attribute(always_inline) || defined(__GNUC__)
235
#define AT_ALWAYS_INLINE __attribute__((__always_inline__)) inline
236
#else
237
#define AT_ALWAYS_INLINE inline
238
#endif
239
240
#endif
// BASE_MACROS_MACROS_H_
cuda.h
logging.h
rocm.h
tensor_types.h
This file contains the definition of the DataType enum class.
Generated by
1.9.8