24 #ifndef GRAPHLAB_UTIL_TRACEPOINT_HPP
25 #define GRAPHLAB_UTIL_TRACEPOINT_HPP
29 #include <graphlab/util/timer.hpp>
30 #include <graphlab/util/branch_hints.hpp>
31 #include <graphlab/parallel/atomic.hpp>
32 #include <graphlab/parallel/atomic_ops.hpp>
38 std::string description;
39 bool print_on_destruct;
40 graphlab::atomic<unsigned long long> count;
41 graphlab::atomic<unsigned long long> total;
42 unsigned long long minimum;
43 unsigned long long maximum;
44 inline trace_count(std::string name =
"",
45 std::string description =
"",
46 bool print_on_destruct =
true):
48 description(description),
49 print_on_destruct(print_on_destruct),
52 minimum(std::numeric_limits<unsigned long long>::max()),
59 inline void initialize(std::string n,
61 bool print_out =
true) {
64 print_on_destruct = print_out;
70 inline void incorporate(
unsigned long long val) __attribute__((always_inline)) {
74 unsigned long long m = minimum;
78 unsigned long long m = maximum;
86 inline void incorporate(
const trace_count &val) __attribute__((always_inline)) {
87 count.inc(val.count.value);
88 total.inc(val.total.value);
90 unsigned long long m = minimum;
94 unsigned long long m = maximum;
102 inline trace_count& operator+=(trace_count &val) {
116 void print(std::ostream& out,
unsigned long long tpersec = 0)
const;
163 #ifdef USE_TRACEPOINT
164 #define DECLARE_TRACER(name) graphlab::trace_count name;
166 #define INITIALIZE_TRACER(name, description) name.initialize(#name, description);
167 #define INITIALIZE_TRACER_NO_PRINT(name, description) name.initialize(#name, description, false);
169 #define BEGIN_TRACEPOINT(name) unsigned long long __ ## name ## _trace_ = rdtsc();
170 #define END_TRACEPOINT(name) name.incorporate(rdtsc() - __ ## name ## _trace_);
171 #define END_AND_BEGIN_TRACEPOINT(endname, beginname) unsigned long long __ ## beginname ## _trace_ = rdtsc(); \
172 endname.incorporate(__ ## beginname ## _trace_ - __ ## endname ## _trace_);
174 #define CREATE_ACCUMULATING_TRACEPOINT(name) graphlab::trace_count __ ## name ## _acc_trace_; \
175 unsigned long long __ ## name ## _acc_trace_elem_;
176 #define BEGIN_ACCUMULATING_TRACEPOINT(name) __ ## name ## _acc_trace_elem_ = rdtsc();
177 #define END_ACCUMULATING_TRACEPOINT(name) __ ## name ## _acc_trace_.incorporate(rdtsc() - __ ## name ## _acc_trace_elem_);
179 #define END_AND_BEGIN_ACCUMULATING_TRACEPOINT(endname, beginname) __ ## beginname ## _acc_trace_elem_ = rdtsc(); \
180 __ ## endname ## _acc_trace_.incorporate(__ ## beginname ## _acc_trace_elem_ - __ ## endname ## _acc_trace_elem_)
182 #define STORE_ACCUMULATING_TRACEPOINT(name) name.incorporate(__ ## name ## _acc_trace_);
184 #define DECLARE_TRACER(name)
185 #define INITIALIZE_TRACER(name, description)
186 #define INITIALIZE_TRACER_NO_PRINT(name, description)
188 #define BEGIN_TRACEPOINT(name)
189 #define END_TRACEPOINT(name)
191 #define CREATE_ACCUMULATING_TRACEPOINT(name)
192 #define BEGIN_ACCUMULATING_TRACEPOINT(name)
193 #define END_ACCUMULATING_TRACEPOINT(name)
194 #define STORE_ACCUMULATING_TRACEPOINT(name)
196 #define END_AND_BEGIN_ACCUMULATING_TRACEPOINT(endname, beginname)
197 #define END_AND_BEGIN_TRACEPOINT(endname, beginname)