timemory  3.2.1
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
macros.hpp
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2020, The Regents of the University of California,
4 // through Lawrence Berkeley National Laboratory (subject to receipt of any
5 // required approvals from the U.S. Dept. of Energy). All rights reserved.
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 
25 /** \file timemory/variadic/auto_macros.hpp
26  * \headerfile timemory/variadic/auto_macros.hpp "timemory/variadic/macros.hpp"
27  * Generic macros that are intended to be building-blocks for other macros, e.g.
28  * TIMEMORY_MARKER, TIMEMORY_HANDLE, TIMEMORY_CALIPER, etc.
29  *
30  */
31 
32 #pragma once
33 
34 #include <cstdint>
35 #include <string>
36 
37 #include "timemory/compat/macros.h"
39 #include "timemory/mpl/apply.hpp"
42 
43 //======================================================================================//
44 //
45 // CXX variadic macros
46 //
47 //======================================================================================//
48 
49 namespace tim
50 {
51 // e.g. tim::string::join(...)
53 } // namespace tim
54 
55 //--------------------------------------------------------------------------------------//
56 
57 #if !defined(TIMEMORY_MACROS)
58 
59 # define TIMEMORY_MACROS
60 
61 //======================================================================================//
62 //
63 // HELPER MACROS
64 //
65 //======================================================================================//
66 
67 # if !defined(TIMEMORY_WINDOWS)
68 # define TIMEMORY_OS_PATH_DELIMITER '/'
69 # else
70 # define TIMEMORY_OS_PATH_DELIMITER '\\'
71 # endif
72 
73 //--------------------------------------------------------------------------------------//
74 
75 # if defined(__FILE_NAME__)
76 # define _TIM_FILESTR __FILE_NAME__
77 # else
78 # define _TIM_FILESTR \
79  std::string(__FILE__).substr( \
80  std::string(__FILE__).find_last_of(TIMEMORY_OS_PATH_DELIMITER) + 1)
81 # endif
82 
83 //--------------------------------------------------------------------------------------//
84 
85 # define _TIM_FILELINE ::tim::string::join(':', _TIM_FILESTR, _TIM_LINESTR)
86 
87 //--------------------------------------------------------------------------------------//
88 
89 # define TIMEMORY_JOIN(delim, ...) ::tim::string::join(delim, __VA_ARGS__)
90 
91 //--------------------------------------------------------------------------------------//
92 
93 # define TIMEMORY_BLANK_LABEL(...) ::tim::string::join("", __VA_ARGS__)
94 
95 //--------------------------------------------------------------------------------------//
96 
97 # define TIMEMORY_BASIC_LABEL(...) ::tim::string::join("", _TIM_FUNC, __VA_ARGS__)
98 
99 //--------------------------------------------------------------------------------------//
100 
101 # define TIMEMORY_FULL_LABEL ::tim::string::join('/', _TIM_FUNC, _TIM_FILELINE)
102 
103 //--------------------------------------------------------------------------------------//
104 
105 # define TIMEMORY_LABEL(...) TIMEMORY_JOIN("", TIMEMORY_FULL_LABEL, __VA_ARGS__)
106 
107 //--------------------------------------------------------------------------------------//
108 
109 # define TIMEMORY_AUTO_TYPE(TYPE) ::tim::concepts::auto_type_t<TYPE>
110 
111 //--------------------------------------------------------------------------------------//
112 
113 # define TIMEMORY_COMP_TYPE(TYPE) ::tim::concepts::component_type_t<TYPE>
114 
115 //======================================================================================//
116 //
117 // MARKER MACROS
118 //
119 //======================================================================================//
120 
121 # define TIMEMORY_BLANK_MARKER(TYPE, ...) \
122  _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
123  TIMEMORY_AUTO_TYPE(TYPE) \
124  _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
125 
126 //--------------------------------------------------------------------------------------//
127 
128 # define TIMEMORY_BASIC_MARKER(TYPE, ...) \
129  _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
130  TIMEMORY_AUTO_TYPE(TYPE) \
131  _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
132 
133 //--------------------------------------------------------------------------------------//
134 
135 # define TIMEMORY_MARKER(TYPE, ...) \
136  _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
137  TIMEMORY_AUTO_TYPE(TYPE) \
138  _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
139 
140 //======================================================================================//
141 //
142 // CONDITIONAL MARKER MACROS
143 //
144 //======================================================================================//
145 
146 # define TIMEMORY_CONDITIONAL_BLANK_MARKER(COND, TYPE, ...) \
147  _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
148  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
149  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
150  ((COND)) \
151  ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
152  : nullptr)
153 
154 //--------------------------------------------------------------------------------------//
155 
156 # define TIMEMORY_CONDITIONAL_BASIC_MARKER(COND, TYPE, ...) \
157  _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
158  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
159  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
160  ((COND)) \
161  ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
162  : nullptr)
163 
164 //--------------------------------------------------------------------------------------//
165 
166 # define TIMEMORY_CONDITIONAL_MARKER(COND, TYPE, ...) \
167  _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
168  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
169  std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
170  ((COND)) \
171  ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
172  : nullptr)
173 
174 //======================================================================================//
175 //
176 // POINTER MACROS
177 //
178 //======================================================================================//
179 
180 # define TIMEMORY_BLANK_POINTER(TYPE, ...) \
181  TIMEMORY_CONDITIONAL_BLANK_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
182 
183 //--------------------------------------------------------------------------------------//
184 
185 # define TIMEMORY_BASIC_POINTER(TYPE, ...) \
186  TIMEMORY_CONDITIONAL_BASIC_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
187 
188 //--------------------------------------------------------------------------------------//
189 
190 # define TIMEMORY_POINTER(TYPE, ...) \
191  TIMEMORY_CONDITIONAL_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
192 
193 //======================================================================================//
194 //
195 // CALIPER MACROS
196 //
197 //======================================================================================//
198 
199 # define TIMEMORY_BLANK_CALIPER(ID, TYPE, ...) \
200  _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
201  TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
202 
203 //--------------------------------------------------------------------------------------//
204 
205 # define TIMEMORY_BASIC_CALIPER(ID, TYPE, ...) \
206  _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
207  TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
208 
209 //--------------------------------------------------------------------------------------//
210 
211 # define TIMEMORY_CALIPER(ID, TYPE, ...) \
212  _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
213  TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
214 
215 //--------------------------------------------------------------------------------------//
216 
217 # define TIMEMORY_STATIC_BLANK_CALIPER(ID, TYPE, ...) \
218  _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
219  static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
220 
221 //--------------------------------------------------------------------------------------//
222 
223 # define TIMEMORY_STATIC_BASIC_CALIPER(ID, TYPE, ...) \
224  _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
225  static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
226 
227 //--------------------------------------------------------------------------------------//
228 
229 # define TIMEMORY_STATIC_CALIPER(ID, TYPE, ...) \
230  _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
231  static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
232 
233 //--------------------------------------------------------------------------------------//
234 
235 # define TIMEMORY_CALIPER_REFERENCE(ID) std::ref(_TIM_VARIABLE(ID)).get()
236 
237 //--------------------------------------------------------------------------------------//
238 
239 # define TIMEMORY_CALIPER_APPLY(ID, FUNC, ...) _TIM_VARIABLE(ID).FUNC(__VA_ARGS__)
240 
241 //--------------------------------------------------------------------------------------//
242 
243 # define TIMEMORY_CALIPER_TYPE_APPLY(ID, TYPE, FUNC, ...) \
244  _TIM_VARIABLE(ID).type_apply<TYPE>(FUNC, __VA_ARGS__)
245 
246 //--------------------------------------------------------------------------------------//
247 
248 # define TIMEMORY_CALIPER_APPLY0(ID, FUNC) _TIM_VARIABLE(ID).FUNC()
249 
250 //--------------------------------------------------------------------------------------//
251 
252 # define TIMEMORY_CALIPER_TYPE_APPLY0(ID, TYPE, FUNC) \
253  _TIM_VARIABLE(ID).type_apply<TYPE>(FUNC)
254 
255 //--------------------------------------------------------------------------------------//
256 
257 # define TIMEMORY_CALIPER_LAMBDA(ID, LAMBDA, ...) \
258  LAMBDA(_TIM_VARIABLE(ID), __VA_ARGS__)
259 
260 //--------------------------------------------------------------------------------------//
261 
262 # define TIMEMORY_CALIPER_TYPE_LAMBDA(ID, TYPE, LAMBDA, ...) \
263  LAMBDA(_TIM_VARIABLE(ID).get<TYPE>(), __VA_ARGS__)
264 
265 //======================================================================================//
266 //
267 // HANDLE MACROS
268 //
269 //======================================================================================//
270 
271 # define TIMEMORY_BLANK_HANDLE(TYPE, ...) \
272  TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(blank, __VA_ARGS__))
273 
274 //--------------------------------------------------------------------------------------//
275 
276 # define TIMEMORY_BASIC_HANDLE(TYPE, ...) \
277  TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(basic, __VA_ARGS__))
278 
279 //--------------------------------------------------------------------------------------//
280 
281 # define TIMEMORY_HANDLE(TYPE, ...) \
282  TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(full, __VA_ARGS__))
283 
284 //--------------------------------------------------------------------------------------//
285 
286 # define TIMEMORY_BLANK_RAW_POINTER(TYPE, ...) \
287  (::tim::settings::enabled()) \
288  ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(blank, __VA_ARGS__)) \
289  : nullptr
290 
291 //--------------------------------------------------------------------------------------//
292 
293 # define TIMEMORY_BASIC_RAW_POINTER(TYPE, ...) \
294  (::tim::settings::enabled()) \
295  ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(basic, __VA_ARGS__)) \
296  : nullptr
297 
298 //--------------------------------------------------------------------------------------//
299 
300 # define TIMEMORY_RAW_POINTER(TYPE, ...) \
301  (::tim::settings::enabled()) \
302  ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(full, __VA_ARGS__)) \
303  : nullptr
304 
305 //======================================================================================//
306 //
307 // DEBUG MACROS
308 //
309 //======================================================================================//
310 
311 # if defined(DEBUG)
312 
313 //--------------------------------------------------------------------------------------//
314 
315 # define TIMEMORY_DEBUG_BLANK_MARKER(TYPE, ...) \
316  TIMEMORY_BASIC_MARKER(TYPE, __VA_ARGS__)
317 
318 //--------------------------------------------------------------------------------------//
319 
320 # define TIMEMORY_DEBUG_BASIC_MARKER(TYPE, ...) \
321  TIMEMORY_BASIC_MARKER(TYPE, __VA_ARGS__)
322 
323 //--------------------------------------------------------------------------------------//
324 
325 # define TIMEMORY_DEBUG_MARKER(TYPE, ...) TIMEMORY_MARKER(TYPE, __VA_ARGS__)
326 
327 //--------------------------------------------------------------------------------------//
328 
329 # else
330 # define TIMEMORY_DEBUG_BLANK_MARKER(TYPE, ...)
331 # define TIMEMORY_DEBUG_BASIC_MARKER(TYPE, ...)
332 # define TIMEMORY_DEBUG_MARKER(TYPE, ...)
333 # endif
334 
335 //--------------------------------------------------------------------------------------//
336 
337 # define TIMEMORY_CONFIGURE(TYPE, ...) TYPE::configure(__VA_ARGS__)
338 
339 //--------------------------------------------------------------------------------------//
340 
341 // deprecated macros
343 
344 //--------------------------------------------------------------------------------------//
345 
346 #endif // !defined(TIMEMORY_MACROS)
347 
348 //--------------------------------------------------------------------------------------//
Definition: kokkosp.cpp:38