timemory 3.3.0
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
40
41#include <cstdint>
42#include <string>
43
44//======================================================================================//
45//
46// CXX variadic macros
47//
48//======================================================================================//
49
50namespace tim
51{
52// e.g. tim::string::join(...)
54} // namespace tim
55
56//--------------------------------------------------------------------------------------//
57
58#if !defined(TIMEMORY_MACROS)
59
60# define TIMEMORY_MACROS
61
62//======================================================================================//
63//
64// HELPER MACROS
65//
66//======================================================================================//
67
68# if !defined(TIMEMORY_WINDOWS)
69# define TIMEMORY_OS_PATH_DELIMITER '/'
70# else
71# define TIMEMORY_OS_PATH_DELIMITER '\\'
72# endif
73
74//--------------------------------------------------------------------------------------//
75
76# if defined(__FILE_NAME__)
77# define _TIM_FILESTR __FILE_NAME__
78# else
79# define _TIM_FILESTR \
80 std::string(__FILE__).substr( \
81 std::string(__FILE__).find_last_of(TIMEMORY_OS_PATH_DELIMITER) + 1)
82# endif
83
84//--------------------------------------------------------------------------------------//
85
86# define _TIM_FILELINE ::tim::string::join(':', _TIM_FILESTR, _TIM_LINESTR)
87
88//--------------------------------------------------------------------------------------//
89
90# define TIMEMORY_JOIN(delim, ...) ::tim::string::join(delim, __VA_ARGS__)
91
92//--------------------------------------------------------------------------------------//
93
94# define TIMEMORY_BLANK_LABEL(...) ::tim::string::join("", __VA_ARGS__)
95
96//--------------------------------------------------------------------------------------//
97
98# define TIMEMORY_BASIC_LABEL(...) ::tim::string::join("", _TIM_FUNC, __VA_ARGS__)
99
100//--------------------------------------------------------------------------------------//
101
102# define TIMEMORY_FULL_LABEL ::tim::string::join('/', _TIM_FUNC, _TIM_FILELINE)
103
104//--------------------------------------------------------------------------------------//
105
106# define TIMEMORY_LABEL(...) TIMEMORY_JOIN("", TIMEMORY_FULL_LABEL, __VA_ARGS__)
107
108//--------------------------------------------------------------------------------------//
109
110# define TIMEMORY_AUTO_TYPE(TYPE) ::tim::concepts::auto_type_t<TYPE>
111
112//--------------------------------------------------------------------------------------//
113
114# define TIMEMORY_COMP_TYPE(TYPE) ::tim::concepts::component_type_t<TYPE>
115
116//======================================================================================//
117//
118// MARKER MACROS
119//
120//======================================================================================//
121
122# define TIMEMORY_BLANK_MARKER(TYPE, ...) \
123 _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
124 TIMEMORY_AUTO_TYPE(TYPE) \
125 _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
126
127//--------------------------------------------------------------------------------------//
128
129# define TIMEMORY_BASIC_MARKER(TYPE, ...) \
130 _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
131 TIMEMORY_AUTO_TYPE(TYPE) \
132 _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
133
134//--------------------------------------------------------------------------------------//
135
136# define TIMEMORY_MARKER(TYPE, ...) \
137 _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
138 TIMEMORY_AUTO_TYPE(TYPE) \
139 _TIM_VARIABLE(__LINE__)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
140
141//======================================================================================//
142//
143// CONDITIONAL MARKER MACROS
144//
145//======================================================================================//
146
147# define TIMEMORY_CONDITIONAL_BLANK_MARKER(COND, TYPE, ...) \
148 _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
149 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
150 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
151 ((COND)) \
152 ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
153 : nullptr)
154
155//--------------------------------------------------------------------------------------//
156
157# define TIMEMORY_CONDITIONAL_BASIC_MARKER(COND, TYPE, ...) \
158 _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
159 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
160 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
161 ((COND)) \
162 ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
163 : nullptr)
164
165//--------------------------------------------------------------------------------------//
166
167# define TIMEMORY_CONDITIONAL_MARKER(COND, TYPE, ...) \
168 _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
169 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)> _TIM_VARIABLE(__LINE__) = \
170 std::unique_ptr<TIMEMORY_AUTO_TYPE(TYPE)>( \
171 ((COND)) \
172 ? new TIMEMORY_AUTO_TYPE(TYPE)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__)) \
173 : nullptr)
174
175//======================================================================================//
176//
177// POINTER MACROS
178//
179//======================================================================================//
180
181# define TIMEMORY_BLANK_POINTER(TYPE, ...) \
182 TIMEMORY_CONDITIONAL_BLANK_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
183
184//--------------------------------------------------------------------------------------//
185
186# define TIMEMORY_BASIC_POINTER(TYPE, ...) \
187 TIMEMORY_CONDITIONAL_BASIC_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
188
189//--------------------------------------------------------------------------------------//
190
191# define TIMEMORY_POINTER(TYPE, ...) \
192 TIMEMORY_CONDITIONAL_MARKER(::tim::settings::enabled(), TYPE, __VA_ARGS__)
193
194//======================================================================================//
195//
196// CALIPER MACROS
197//
198//======================================================================================//
199
200# define TIMEMORY_BLANK_CALIPER(ID, TYPE, ...) \
201 _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
202 TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
203
204//--------------------------------------------------------------------------------------//
205
206# define TIMEMORY_BASIC_CALIPER(ID, TYPE, ...) \
207 _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
208 TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
209
210//--------------------------------------------------------------------------------------//
211
212# define TIMEMORY_CALIPER(ID, TYPE, ...) \
213 _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
214 TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
215
216//--------------------------------------------------------------------------------------//
217
218# define TIMEMORY_STATIC_BLANK_CALIPER(ID, TYPE, ...) \
219 _TIM_STATIC_SRC_LOCATION(blank, __VA_ARGS__); \
220 static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
221
222//--------------------------------------------------------------------------------------//
223
224# define TIMEMORY_STATIC_BASIC_CALIPER(ID, TYPE, ...) \
225 _TIM_STATIC_SRC_LOCATION(basic, __VA_ARGS__); \
226 static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
227
228//--------------------------------------------------------------------------------------//
229
230# define TIMEMORY_STATIC_CALIPER(ID, TYPE, ...) \
231 _TIM_STATIC_SRC_LOCATION(full, __VA_ARGS__); \
232 static TYPE _TIM_VARIABLE(ID)(TIMEMORY_CAPTURE_ARGS(__VA_ARGS__))
233
234//--------------------------------------------------------------------------------------//
235
236# define TIMEMORY_CALIPER_REFERENCE(ID) std::ref(_TIM_VARIABLE(ID)).get()
237
238//--------------------------------------------------------------------------------------//
239
240# define TIMEMORY_CALIPER_APPLY(ID, FUNC, ...) _TIM_VARIABLE(ID).FUNC(__VA_ARGS__)
241
242//--------------------------------------------------------------------------------------//
243
244# define TIMEMORY_CALIPER_TYPE_APPLY(ID, TYPE, FUNC, ...) \
245 _TIM_VARIABLE(ID).type_apply<TYPE>(FUNC, __VA_ARGS__)
246
247//--------------------------------------------------------------------------------------//
248
249# define TIMEMORY_CALIPER_APPLY0(ID, FUNC) _TIM_VARIABLE(ID).FUNC()
250
251//--------------------------------------------------------------------------------------//
252
253# define TIMEMORY_CALIPER_TYPE_APPLY0(ID, TYPE, FUNC) \
254 _TIM_VARIABLE(ID).type_apply<TYPE>(FUNC)
255
256//--------------------------------------------------------------------------------------//
257
258# define TIMEMORY_CALIPER_LAMBDA(ID, LAMBDA, ...) \
259 LAMBDA(_TIM_VARIABLE(ID), __VA_ARGS__)
260
261//--------------------------------------------------------------------------------------//
262
263# define TIMEMORY_CALIPER_TYPE_LAMBDA(ID, TYPE, LAMBDA, ...) \
264 LAMBDA(_TIM_VARIABLE(ID).get<TYPE>(), __VA_ARGS__)
265
266//======================================================================================//
267//
268// HANDLE MACROS
269//
270//======================================================================================//
271
272# define TIMEMORY_BLANK_HANDLE(TYPE, ...) \
273 TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(blank, __VA_ARGS__))
274
275//--------------------------------------------------------------------------------------//
276
277# define TIMEMORY_BASIC_HANDLE(TYPE, ...) \
278 TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(basic, __VA_ARGS__))
279
280//--------------------------------------------------------------------------------------//
281
282# define TIMEMORY_HANDLE(TYPE, ...) \
283 TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(full, __VA_ARGS__))
284
285//--------------------------------------------------------------------------------------//
286
287# define TIMEMORY_BLANK_RAW_POINTER(TYPE, ...) \
288 (::tim::settings::enabled()) \
289 ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(blank, __VA_ARGS__)) \
290 : nullptr
291
292//--------------------------------------------------------------------------------------//
293
294# define TIMEMORY_BASIC_RAW_POINTER(TYPE, ...) \
295 (::tim::settings::enabled()) \
296 ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(basic, __VA_ARGS__)) \
297 : nullptr
298
299//--------------------------------------------------------------------------------------//
300
301# define TIMEMORY_RAW_POINTER(TYPE, ...) \
302 (::tim::settings::enabled()) \
303 ? new TYPE(TIMEMORY_INLINE_SOURCE_LOCATION(full, __VA_ARGS__)) \
304 : nullptr
305
306//======================================================================================//
307//
308// DEBUG MACROS
309//
310//======================================================================================//
311
312# if defined(DEBUG)
313
314//--------------------------------------------------------------------------------------//
315
316# define TIMEMORY_DEBUG_BLANK_MARKER(TYPE, ...) \
317 TIMEMORY_BASIC_MARKER(TYPE, __VA_ARGS__)
318
319//--------------------------------------------------------------------------------------//
320
321# define TIMEMORY_DEBUG_BASIC_MARKER(TYPE, ...) \
322 TIMEMORY_BASIC_MARKER(TYPE, __VA_ARGS__)
323
324//--------------------------------------------------------------------------------------//
325
326# define TIMEMORY_DEBUG_MARKER(TYPE, ...) TIMEMORY_MARKER(TYPE, __VA_ARGS__)
327
328//--------------------------------------------------------------------------------------//
329
330# else
331# define TIMEMORY_DEBUG_BLANK_MARKER(TYPE, ...)
332# define TIMEMORY_DEBUG_BASIC_MARKER(TYPE, ...)
333# define TIMEMORY_DEBUG_MARKER(TYPE, ...)
334# endif
335
336//--------------------------------------------------------------------------------------//
337
338# define TIMEMORY_CONFIGURE(TYPE, ...) TYPE::configure(__VA_ARGS__)
339
340//--------------------------------------------------------------------------------------//
341
342// deprecated macros
344
345//--------------------------------------------------------------------------------------//
346
347#endif // !defined(TIMEMORY_MACROS)
348
349//--------------------------------------------------------------------------------------//
Definition: kokkosp.cpp:39