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.
mark.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/or sell
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/**
26 * \file timemory/operations/types/mark_begin.hpp
27 * \brief Definition for various functions for mark_begin in operations
28 */
29
30#pragma once
31
35
36namespace tim
37{
38namespace operation
39{
40//
41//--------------------------------------------------------------------------------------//
42//
43///
44/// \struct tim::operation::mark
45/// \brief This operation class is used for marking some event (usually in some external
46/// profiler)
47///
48//
49//--------------------------------------------------------------------------------------//
50//
51template <typename Tp>
52struct mark
53{
54 using type = Tp;
55
56 TIMEMORY_DEFAULT_OBJECT(mark)
57
58 template <typename... Args>
59 explicit mark(type& obj, Args&&... args)
60 {
61 sfinae(obj, 0, std::forward<Args>(args)...);
62 }
63
64 template <typename... Args>
65 auto operator()(type& obj, Args&&... args)
66 {
67 return sfinae(obj, 0, std::forward<Args>(args)...);
68 }
69
70private:
71 // The equivalent of supports args
72 template <typename Up, typename... Args>
73 auto sfinae(Up& obj, int, Args&&... args)
74 -> decltype(obj.mark(std::forward<Args>(args)...))
75 {
76 return obj.mark(std::forward<Args>(args)...);
77 }
78
79 // No member function
80 template <typename Up, typename... Args>
81 void sfinae(Up&, long, Args&&...)
82 {}
83};
84//
85//--------------------------------------------------------------------------------------//
86//
87///
88/// \struct tim::operation::mark_begin
89/// \brief This operation class is used for asynchronous routines such as \ref cuda_event
90/// and \ref nvtx_marker which are passed cudaStream_t instances
91///
92//
93//--------------------------------------------------------------------------------------//
94//
95template <typename Tp>
97{
98 using type = Tp;
99
101
102 template <typename... Args>
103 explicit mark_begin(type& obj, Args&&... args);
104
105private:
106 // The equivalent of supports args
107 template <typename Up, typename... Args>
108 auto sfinae(Up& obj, int, int, Args&&... args)
109 -> decltype(obj.mark_begin(std::forward<Args>(args)...))
110 {
111 return obj.mark_begin(std::forward<Args>(args)...);
112 }
113
114 // Member function is provided
115 template <typename Up, typename... Args>
116 auto sfinae(Up& obj, int, long, Args&&...) -> decltype(obj.mark_begin())
117 {
118 return obj.mark_begin();
119 }
120
121 // No member function
122 template <typename Up, typename... Args>
123 void sfinae(Up&, long, long, Args&&...)
124 {}
125};
126//
127//--------------------------------------------------------------------------------------//
128//
129///
130/// \struct tim::operation::mark_end
131/// \brief This operation class is used for asynchronous routines such as \ref cuda_event
132/// and \ref nvtx_marker which are passed cudaStream_t instances
133///
134//
135//--------------------------------------------------------------------------------------//
136//
137template <typename Tp>
139{
140 using type = Tp;
141
143
144 template <typename... Args>
145 explicit mark_end(type& obj, Args&&... args);
146
147private:
148 // The equivalent of supports args
149 template <typename Up, typename... Args>
150 auto sfinae(Up& obj, int, int, Args&&... args)
151 -> decltype(obj.mark_end(std::forward<Args>(args)...))
152 {
153 return obj.mark_end(std::forward<Args>(args)...);
154 }
155
156 // Member function is provided
157 template <typename Up, typename... Args>
158 auto sfinae(Up& obj, int, long, Args&&...) -> decltype(obj.mark_end())
159 {
160 return obj.mark_end();
161 }
162
163 // No member function
164 template <typename Up, typename... Args>
165 void sfinae(Up&, long, long, Args&&...)
166 {}
167};
168//
169//--------------------------------------------------------------------------------------//
170//
171template <typename Tp>
172template <typename... Args>
173mark_begin<Tp>::mark_begin(type& obj, Args&&... args)
174{
175 sfinae(obj, 0, 0, std::forward<Args>(args)...);
176}
177//
178//--------------------------------------------------------------------------------------//
179//
180template <typename Tp>
181template <typename... Args>
182mark_end<Tp>::mark_end(type& obj, Args&&... args)
183{
184 sfinae(obj, 0, 0, std::forward<Args>(args)...);
185}
186//
187//--------------------------------------------------------------------------------------//
188//
189} // namespace operation
190} // namespace tim
void mark_begin(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:492
void mark_end(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:528
Definition: kokkosp.cpp:39
The declaration for the types for operations without definitions.
Include the macros for operations.
Declare the operations types.
This operation class is used for asynchronous routines such as cuda_event and nvtx_marker which are p...
Definition: mark.hpp:97
TIMEMORY_DELETED_OBJECT(mark_begin) template< typename... Args > explicit mark_begin(type &obj
This operation class is used for asynchronous routines such as cuda_event and nvtx_marker which are p...
Definition: mark.hpp:139
TIMEMORY_DELETED_OBJECT(mark_end) template< typename... Args > explicit mark_end(type &obj
This operation class is used for marking some event (usually in some external profiler)
Definition: mark.hpp:53
auto operator()(type &obj, Args &&... args)
Definition: mark.hpp:65
mark(type &obj, Args &&... args)
Definition: mark.hpp:59