ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
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>
6
7#if __CUDA
8#include <base/macros/cuda.h>
9#elif __ROCM
10#include <base/macros/rocm.h>
11#endif
12
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, ...) \
195CASES_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, ...) \
199CASES_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, ...) \
203CASES_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, ...) \
207CASES_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, ...) \
211CASES_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, ...) \
215CASES_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, ...) \
219CASES_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, ...) \
223CASES_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, ...) \
228CASES_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_
This file contains the definition of the DataType enum class.