docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
daisy_rtl.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdbool.h>
4#include <stddef.h>
5
6#ifdef __cplusplus
7#include <cstddef>
8extern "C" {
9#endif
10
15
21
22typedef struct __daisy_metadata {
23 // Source location
24 const char* file_name;
25 const char* function_name;
30
31 // Docc metadata
32
33 // SDFG-scope
34 const char* sdfg_name;
35 const char* sdfg_file;
36 const char* arg_capture_path;
37 const char* features_file;
38 const char* opt_report_file;
39
40 // Element-scope
41 size_t element_id;
42 const char* element_type;
43 const char* target_type;
44
45 // Loop Info
47 size_t num_loops;
48 size_t num_maps;
49 size_t num_fors;
50 size_t num_whiles;
51 size_t max_depth;
56
57 // Example: sdfg_name + element_id
58 const char* region_uuid;
59
60 // Optional transfer-tuning session id (empty when the SDFG was not remote-tuned). Together with
61 // element_id it identifies which recorded cutout produced this region.
63
64 // Optional original loop ID shared by provenance-grouped instrumentation regions; zero when absent.
65 long long source_loop_id;
66
67 // Optional JSON array containing every member loop's ID and source range; "[]" when ungrouped.
68 const char* member_loops_json;
69
70 // Optional JSON object containing arbitrary expected performance metrics; null when absent.
74
75// Registers a region and returns a region ID
77
78// Finalizes a region
79void __daisy_instrumentation_finalize(size_t region_id);
80
81// Enter a region, starts measurement
82void __daisy_instrumentation_enter(size_t region_id);
83
84// Exit a region, stops measurement and saves data
85void __daisy_instrumentation_exit(size_t region_id);
86
87// Increments a counter with name statically
88// The counters appear with the "static:::" prefix in the output
89void __daisy_instrumentation_increment(size_t region_id, const char* name, long long value);
90void __daisy_instrumentation_metric(size_t region_id, const char* name, double value);
91
92// Read a region's running aggregate runtime stats (only populated in
93// __DAISY_INSTRUMENTATION_MODE=aggregate). ``mean_us`` and ``variance_us2`` are
94// in microseconds / microseconds^2. Returns false if the region has no samples
95// yet. Lets an in-process harness decide when to stop dynamic sampling.
96bool __daisy_instrumentation_stats(size_t region_id, double* mean_us, double* variance_us2, long long* count);
97
98// Decide whether a region's in-place sampling loop should take another sample.
99// Returns true while the running runtime confidence interval has not yet met the
100// target CV (DOCC_MEASURE_CV) and the sample/wall-time caps (DOCC_MEASURE_MAX_SAMPLES,
101// DOCC_MEASURE_MAX_SECONDS, min DOCC_MEASURE_MIN_SAMPLES) are not exhausted. Returns
102// false when no aggregate stats exist (not aggregate mode), so the loop takes a
103// single measurement. Only meaningful in __DAISY_INSTRUMENTATION_MODE=aggregate.
105
106// Cold-sampling primitive: evict the working set from every cache level (streaming
107// writes through a >LLC buffer) so the next sample re-incurs cold-start misses. No-op
108// unless DOCC_MEASURE_COLD is set. Buffer size is DOCC_MEASURE_FLUSH_BYTES (default 128MB).
110
111// Aggregate running runtime stats over ALL regions (aggregate mode): per-iteration
112// mean is the sum of the regions' means (mirrors the trace's summed durations),
113// variance the sum of variances, count the min sample count across regions.
114// Returns false if no region has samples yet. For the in-harness sampler.
115bool __daisy_instrumentation_total_stats(double* mean_us, double* variance_us2, long long* count);
116
117// Reset all regions' running aggregate stats (e.g. to drop warmup samples
118// before the timed sampling loop). Leaves region registration intact.
120
121// Globally enable/disable measurement. While disabled, __daisy_instrumentation_enter,
122// __daisy_instrumentation_exit and the metric/increment calls are no-ops, so no
123// runtime or counter samples are recorded. Registration and finalize are unaffected.
124// The shared RTL has a single process-global instance, so this toggles measurement
125// for every artifact loaded into the process at once. Enabled by default.
128
129// Query whether measurement is currently enabled (true by default).
131
132// Called at end of instrumented function to do any cleanup or post processing before handles and libraries might destr
134
135// Write the trace file now. The trace is otherwise only written at normal process exit, so call
136// this before ending a process without running destructors (e.g. _exit or os._exit in forked
137// workers). Returns false if the trace file could not be written.
139
141
142typedef struct __daisy_capture __daisy_capture_t;
143
144__daisy_capture_t* __daisy_capture_init(const char* name, const char* base_dir);
145
146bool __daisy_capture_enter(__daisy_capture_t* context, size_t element_id);
147
149
151 __daisy_capture_t* context,
152 int arg_idx,
153 const void* data,
154 size_t size,
155 int primitive_type,
156 bool after,
157 size_t element_id
158);
159
161 __daisy_capture_t* context,
162 int arg_idx,
163 const void* data,
164 size_t size,
165 int primitive_type,
166 size_t num_elements,
167 bool after,
168 size_t element_id
169);
170
172 __daisy_capture_t* context,
173 int arg_idx,
174 const void* data,
175 size_t size,
176 int primitive_type,
177 size_t num_rows,
178 size_t num_cols,
179 bool after,
180 size_t element_id
181);
182
184 __daisy_capture_t* context,
185 int arg_idx,
186 const void* data,
187 size_t size,
188 int primitive_type,
189 size_t num_x,
190 size_t num_y,
191 size_t num_z,
192 bool after,
193 size_t element_id
194);
195
196#ifdef __cplusplus
197}
198#endif
199
200#define __daisy_min(a, b) ((a) < (b) ? (a) : (b))
201#define __daisy_max(a, b) ((a) > (b) ? (a) : (b))
202#define __daisy_fma(a, b, c) a* b + c
203
204// Implementation of integer functions for symbolic expressions
205inline int __daisy_sym_pow(int base, int exp) {
206 if (exp < 0) {
207 return 0;
208 }
209
210 int result = 1;
211 while (exp) {
212 if (exp & 1) {
213 result *= base;
214 }
215 exp >>= 1;
216 base *= base;
217 }
218 return result;
219}
220
221#ifdef __DAISY_NVVM__
222
223// type conversion
224#define __daisy_d2i_hi __nvvm_d2i_hi
225#define __daisy_d2i_lo __nvvm_d2i_lo
226#define __daisy_lohi_i2d __nvvm_lohi_i2d
227
228#define __daisy_d2i_rn __nvvm_d2i_rn
229#define __daisy_d2i_rm __nvvm_d2i_rm
230#define __daisy_d2i_rp __nvvm_d2i_rp
231#define __daisy_d2i_rz __nvvm_d2i_rz
232
233#define __daisy_i2d_rn __nvvm_i2d_rn
234#define __daisy_i2d_rm __nvvm_i2d_rm
235#define __daisy_i2d_rp __nvvm_i2d_rp
236#define __daisy_i2d_rz __nvvm_i2d_rz
237
238#define __daisy_d2f_rn __nvvm_d2f_rn
239#define __daisy_d2f_rm __nvvm_d2f_rm
240#define __daisy_d2f_rp __nvvm_d2f_rp
241#define __daisy_d2f_rz __nvvm_d2f_rz
242
243#define __daisy_d2ui_rn __nvvm_d2ui_rn
244#define __daisy_d2ui_rm __nvvm_d2ui_rm
245#define __daisy_d2ui_rp __nvvm_d2ui_rp
246#define __daisy_d2ui_rz __nvvm_d2ui_rz
247
248#define __daisy_ui2d_rn __nvvm_ui2d_rn
249#define __daisy_ui2d_rm __nvvm_ui2d_rm
250#define __daisy_ui2d_rp __nvvm_ui2d_rp
251#define __daisy_ui2d_rz __nvvm_ui2d_rz
252
253#define __daisy_d2ll_rn __nvvm_d2ll_rn
254#define __daisy_d2ll_rm __nvvm_d2ll_rm
255#define __daisy_d2ll_rp __nvvm_d2ll_rp
256#define __daisy_d2ll_rz __nvvm_d2ll_rz
257
258#define __daisy_ll2d_rn __nvvm_ll2d_rn
259#define __daisy_ll2d_rm __nvvm_ll2d_rm
260#define __daisy_ll2d_rp __nvvm_ll2d_rp
261#define __daisy_ll2d_rz __nvvm_ll2d_rz
262
263#define __daisy_d2ull_rn __nvvm_d2ull_rn
264#define __daisy_d2ull_rm __nvvm_d2ull_rm
265#define __daisy_d2ull_rp __nvvm_d2ull_rp
266#define __daisy_d2ull_rz __nvvm_d2ull_rz
267
268#define __daisy_ull2d_rn __nvvm_ull2d_rn
269#define __daisy_ull2d_rm __nvvm_ull2d_rm
270#define __daisy_ull2d_rp __nvvm_ull2d_rp
271#define __daisy_ull2d_rz __nvvm_ull2d_rz
272
273#define __daisy_f2i_rn __nvvm_f2i_rn
274#define __daisy_f2i_rm __nvvm_f2i_rm
275#define __daisy_f2i_rp __nvvm_f2i_rp
276#define __daisy_f2i_rz __nvvm_f2i_rz
277
278#define __daisy_i2f_rn __nvvm_i2f_rn
279#define __daisy_i2f_rm __nvvm_i2f_rm
280#define __daisy_i2f_rp __nvvm_i2f_rp
281#define __daisy_i2f_rz __nvvm_i2f_rz
282
283#define __daisy_f2ui_rn __nvvm_f2ui_rn
284#define __daisy_f2ui_rm __nvvm_f2ui_rm
285#define __daisy_f2ui_rp __nvvm_f2ui_rp
286#define __daisy_f2ui_rz __nvvm_f2ui_rz
287
288#define __daisy_ui2f_rn __nvvm_ui2f_rn
289#define __daisy_ui2f_rm __nvvm_ui2f_rm
290#define __daisy_ui2f_rp __nvvm_ui2f_rp
291#define __daisy_ui2f_rz __nvvm_ui2f_rz
292
293#define __daisy_f2ll_rn __nvvm_f2ll_rn
294#define __daisy_f2ll_rm __nvvm_f2ll_rm
295#define __daisy_f2ll_rp __nvvm_f2ll_rp
296#define __daisy_f2ll_rz __nvvm_f2ll_rz
297
298#define __daisy_ll2f_rn __nvvm_ll2f_rn
299#define __daisy_ll2f_rm __nvvm_ll2f_rm
300#define __daisy_ll2f_rp __nvvm_ll2f_rp
301#define __daisy_ll2f_rz __nvvm_ll2f_rz
302
303#define __daisy_f2ull_rn __nvvm_f2ull_rn
304#define __daisy_f2ull_rm __nvvm_f2ull_rm
305#define __daisy_f2ull_rp __nvvm_f2ull_rp
306#define __daisy_f2ull_rz __nvvm_f2ull_rz
307
308#define __daisy_ull2f_rn __nvvm_ull2f_rn
309#define __daisy_ull2f_rm __nvvm_ull2f_rm
310#define __daisy_ull2f_rp __nvvm_ull2f_rp
311#define __daisy_ull2f_rz __nvvm_ull2f_rz
312
313#define __daisy_f2bf16_rn __nvvm_f2bf16_rn
314#define __daisy_f2bf16_rz __nvvm_f2bf16_rz
315
316#define __daisy_f2h_rn __nvvm_f2h_rn
317
318// saturate
319#define __daisy_saturate_f __nvvm_saturate_f
320#define __daisy_saturate_d __nvvm_saturate_d
321
322// fma instructions
323#define __daisy_fma_rn_f __nvvm_fma_rn_f
324#define __daisy_fma_rn_d __nvvm_fma_rn_d
325
326#define __daisy_fma_rm_f __nvvm_fma_rm_f
327#define __daisy_fma_rm_d __nvvm_fma_rm_d
328
329#define __daisy_fma_rp_f __nvvm_fma_rp_f
330#define __daisy_fma_rp_d __nvvm_fma_rp_d
331
332#define __daisy_fma_rz_f __nvvm_fma_rz_f
333#define __daisy_fma_rz_d __nvvm_fma_rz_d
334
335#define __daisy_fma_rn_ftz_f __nvvm_fma_rn_ftz_f
336
337#define __daisy_fma_rm_ftz_f __nvvm_fma_rm_ftz_f
338
339#define __daisy_fma_rp_ftz_f __nvvm_fma_rp_ftz_f
340
341#define __daisy_fma_rz_ftz_f __nvvm_fma_rz_ftz_f
342
343#endif // __DAISY_NVVM__
344
345// ---------------------------------------------------------------------------
346// Atomic reduce-combine helpers for nested GPU reductions.
347//
348// A parallel (e.g. CUDA-Y / HIP-Y scheduled) reduction merges each thread's
349// partial result into a single accumulator slot with an atomic. For `add` on
350// types with a native `atomicAdd` overload the code generator emits that
351// directly; every other operator/type uses one of the compare-and-swap (CAS)
352// helpers below. The names match what the reduce dispatchers emit:
353//
354// __daisy_reduce_combine_<op>_<ctype-with-spaces-as-underscores>
355//
356// e.g. `__daisy_reduce_combine_max_float`, `__daisy_reduce_combine_add_long_long`.
357//
358// Defined for every device translation unit (CUDA `.cu` / HIP `.cpp`), so they
359// are visible to the kernels regardless of which TU references them. They use
360// `atomicCAS` plus the `__uint_as_float` / `__float_as_uint` /
361// `__longlong_as_double` / `__double_as_longlong` bit-reinterpretation
362// intrinsics: CUDA provides them as builtins, while HIP declares them in its
363// runtime header, which may be included after this one; pull it in here so the
364// helpers are self-sufficient regardless of include order.
365#if defined(__CUDACC__) || defined(__HIPCC__)
366
367#if defined(__HIPCC__)
368#include <hip/hip_bfloat16.h>
369#include <hip/hip_runtime.h>
370#else
371#include <cuda_bf16.h>
372#include <cuda_runtime.h>
373#endif
374
375// Emit one CAS-loop combine function. TO_VAL reinterprets the CAS word as the
376// typed value; FROM_VAL reinterprets the combined typed value back to the CAS
377// word; COMBINE computes `cur OP val`.
378#define __DAISY_REDUCE_COMBINE(NAME, TYPE, CASTYPE, TO_VAL, FROM_VAL, COMBINE) \
379 static __device__ inline void NAME(TYPE* __daisy_addr, TYPE __daisy_val) { \
380 CASTYPE* __daisy_p = reinterpret_cast<CASTYPE*>(__daisy_addr); \
381 CASTYPE __daisy_old = *__daisy_p; \
382 CASTYPE __daisy_assumed; \
383 do { \
384 __daisy_assumed = __daisy_old; \
385 TYPE __daisy_cur = (TO_VAL); \
386 TYPE __daisy_new = (COMBINE); \
387 __daisy_old = atomicCAS(__daisy_p, __daisy_assumed, (FROM_VAL)); \
388 } while (__daisy_assumed != __daisy_old); \
389 }
390
391// Emit all four operators (add/mul/min/max) for a given accumulator type.
392#define __DAISY_REDUCE_COMBINE_ALL(SUFFIX, TYPE, CASTYPE, TO_VAL, FROM_VAL) \
393 __DAISY_REDUCE_COMBINE(__daisy_reduce_combine_add_##SUFFIX, TYPE, CASTYPE, TO_VAL, FROM_VAL, __daisy_cur + __daisy_val) \
394 __DAISY_REDUCE_COMBINE(__daisy_reduce_combine_mul_##SUFFIX, TYPE, CASTYPE, TO_VAL, FROM_VAL, __daisy_cur* __daisy_val) \
395 __DAISY_REDUCE_COMBINE( \
396 __daisy_reduce_combine_min_##SUFFIX, \
397 TYPE, \
398 CASTYPE, \
399 TO_VAL, \
400 FROM_VAL, \
401 __daisy_cur < __daisy_val ? __daisy_cur : __daisy_val \
402 ) \
403 __DAISY_REDUCE_COMBINE( \
404 __daisy_reduce_combine_max_##SUFFIX, \
405 TYPE, \
406 CASTYPE, \
407 TO_VAL, \
408 FROM_VAL, \
409 __daisy_cur > __daisy_val ? __daisy_cur : __daisy_val \
410 )
411
412#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 700
413__DAISY_REDUCE_COMBINE_ALL(
414 _Float16,
415 _Float16,
416 unsigned short,
417 __builtin_bit_cast(_Float16, __daisy_assumed),
418 __builtin_bit_cast(unsigned short, __daisy_new)
419)
420// Helper suffix/type follow the codegen's bf16 C type: hip_bfloat16 on ROCm, nv_bfloat16 on CUDA.
421#if defined(__HIPCC__)
422__DAISY_REDUCE_COMBINE_ALL(
423 hip_bfloat16,
424 hip_bfloat16,
425 unsigned short,
426 __builtin_bit_cast(hip_bfloat16, __daisy_assumed),
427 __builtin_bit_cast(unsigned short, __daisy_new)
428)
429#else
430__DAISY_REDUCE_COMBINE_ALL(
431 nv_bfloat16,
432 nv_bfloat16,
433 unsigned short,
434 __builtin_bit_cast(nv_bfloat16, __daisy_assumed),
435 __builtin_bit_cast(unsigned short, __daisy_new)
436)
437#endif
438#endif
439__DAISY_REDUCE_COMBINE_ALL(float, float, unsigned int, __uint_as_float(__daisy_assumed), __float_as_uint(__daisy_new))
440__DAISY_REDUCE_COMBINE_ALL(
441 double,
442 double,
443 unsigned long long,
444 __longlong_as_double((long long) __daisy_assumed),
445 (unsigned long long) __double_as_longlong(__daisy_new)
446)
447__DAISY_REDUCE_COMBINE_ALL(int, int, unsigned int, (int) __daisy_assumed, (unsigned int) __daisy_new)
448__DAISY_REDUCE_COMBINE_ALL(
449 unsigned_int, unsigned int, unsigned int, (unsigned int) __daisy_assumed, (unsigned int) __daisy_new
450)
451__DAISY_REDUCE_COMBINE_ALL(
452 long_long, long long, unsigned long long, (long long) __daisy_assumed, (unsigned long long) __daisy_new
453)
454__DAISY_REDUCE_COMBINE_ALL(
455 unsigned_long_long,
456 unsigned long long,
457 unsigned long long,
458 (unsigned long long) __daisy_assumed,
459 (unsigned long long) __daisy_new
460)
461
462#endif // defined(__CUDACC__) || defined(__HIPCC__)
struct __daisy_metadata __daisy_metadata_t
void __daisy_capture_2d(__daisy_capture_t *context, int arg_idx, const void *data, size_t size, int primitive_type, size_t num_rows, size_t num_cols, bool after, size_t element_id)
void __daisy_capture_raw(__daisy_capture_t *context, int arg_idx, const void *data, size_t size, int primitive_type, bool after, size_t element_id)
bool __daisy_capture_enter(__daisy_capture_t *context, size_t element_id)
__daisy_event_set
Definition daisy_rtl.h:16
@ __DAISY_EVENT_SET_NONE
Definition daisy_rtl.h:19
@ __DAISY_EVENT_SET_CUDA
Definition daisy_rtl.h:18
@ __DAISY_EVENT_SET_CPU
Definition daisy_rtl.h:17
void __daisy_capture_end(__daisy_capture_t *context)
void __daisy_instrumentation_finalize(size_t region_id)
void __daisy_instrumentation_finalize_all(void)
void __daisy_instrumentation_reset_all(void)
void __daisy_capture_3d(__daisy_capture_t *context, int arg_idx, const void *data, size_t size, int primitive_type, size_t num_x, size_t num_y, size_t num_z, bool after, size_t element_id)
__daisy_capture_t * __daisy_capture_init(const char *name, const char *base_dir)
bool __daisy_instrumentation_stats(size_t region_id, double *mean_us, double *variance_us2, long long *count)
bool __daisy_instrumentation_dump(void)
size_t __daisy_instrumentation_init(__daisy_metadata_t *metadata, enum __daisy_event_set event_set)
void __daisy_capture_1d(__daisy_capture_t *context, int arg_idx, const void *data, size_t size, int primitive_type, size_t num_elements, bool after, size_t element_id)
bool __daisy_instrumentation_is_enabled(void)
void __daisy_instrumentation_metric(size_t region_id, const char *name, double value)
void __daisy_instrumentation_start(void)
struct __daisy_capture __daisy_capture_t
Definition daisy_rtl.h:142
int __daisy_sym_pow(int base, int exp)
Definition daisy_rtl.h:205
bool __daisy_instrumentation_should_continue(size_t region_id)
__daisy_instrumentation_mode
Definition daisy_rtl.h:11
@ __DAISY_MODE_TRACE
Definition daisy_rtl.h:12
@ __DAISY_MODE_AGGREGATE
Definition daisy_rtl.h:13
void __daisy_instrumentation_stop(void)
bool __daisy_instrumentation_total_stats(double *mean_us, double *variance_us2, long long *count)
void __daisy_instrumentation_flush_caches(void)
enum __daisy_instrumentation_mode __daisy_instrumentation_mode_t
void __daisy_instrumentation_increment(size_t region_id, const char *name, long long value)
void __daisy_instrumentation_exit(size_t region_id)
void __daisy_instrumentation_enter(size_t region_id)
Definition daisy_rtl.h:22
bool is_perfectly_nested
Definition daisy_rtl.h:52
const char * element_type
Definition daisy_rtl.h:42
int loopnest_index
Definition daisy_rtl.h:46
const char * transfer_tuning_session_id
Definition daisy_rtl.h:62
size_t max_depth
Definition daisy_rtl.h:51
size_t num_loops
Definition daisy_rtl.h:47
const char * target_type
Definition daisy_rtl.h:43
double vector_distance
Definition daisy_rtl.h:72
size_t num_fors
Definition daisy_rtl.h:49
long long source_loop_id
Definition daisy_rtl.h:65
const char * opt_report_file
Definition daisy_rtl.h:38
bool is_elementwise
Definition daisy_rtl.h:54
const char * arg_capture_path
Definition daisy_rtl.h:36
const char * region_uuid
Definition daisy_rtl.h:58
const char * function_name
Definition daisy_rtl.h:25
const char * sdfg_file
Definition daisy_rtl.h:35
bool has_side_effects
Definition daisy_rtl.h:55
size_t num_whiles
Definition daisy_rtl.h:50
long line_end
Definition daisy_rtl.h:27
long line_begin
Definition daisy_rtl.h:26
const char * file_name
Definition daisy_rtl.h:24
long column_end
Definition daisy_rtl.h:29
long column_begin
Definition daisy_rtl.h:28
const char * expected_performance_json
Definition daisy_rtl.h:71
size_t element_id
Definition daisy_rtl.h:41
bool is_perfectly_parallel
Definition daisy_rtl.h:53
const char * sdfg_name
Definition daisy_rtl.h:34
const char * member_loops_json
Definition daisy_rtl.h:68
const char * features_file
Definition daisy_rtl.h:37
size_t num_maps
Definition daisy_rtl.h:48