1// $FreeBSD: stable/11/lib/libomp/omp-tools.h 360658 2020-05-05 12:59:04Z dim $
2/*
3 * include/omp-tools.h.var
4 */
5
6//===----------------------------------------------------------------------===//
7//
8// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
9// See https://llvm.org/LICENSE.txt for license information.
10// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef __OMPT__
15#define __OMPT__
16
17/*****************************************************************************
18 * system include files
19 *****************************************************************************/
20
21#include <stdint.h>
22#include <stddef.h>
23
24/*****************************************************************************
25 * iteration macros
26 *****************************************************************************/
27
28#define FOREACH_OMPT_INQUIRY_FN(macro)      \
29    macro (ompt_enumerate_states)           \
30    macro (ompt_enumerate_mutex_impls)      \
31                                            \
32    macro (ompt_set_callback)               \
33    macro (ompt_get_callback)               \
34                                            \
35    macro (ompt_get_state)                  \
36                                            \
37    macro (ompt_get_parallel_info)          \
38    macro (ompt_get_task_info)              \
39    macro (ompt_get_task_memory)            \
40    macro (ompt_get_thread_data)            \
41    macro (ompt_get_unique_id)              \
42    macro (ompt_finalize_tool)              \
43                                            \
44    macro(ompt_get_num_procs)               \
45    macro(ompt_get_num_places)              \
46    macro(ompt_get_place_proc_ids)          \
47    macro(ompt_get_place_num)               \
48    macro(ompt_get_partition_place_nums)    \
49    macro(ompt_get_proc_id)                 \
50                                            \
51    macro(ompt_get_target_info)             \
52    macro(ompt_get_num_devices)
53
54#define FOREACH_OMPT_STATE(macro)                                                                \
55                                                                                                \
56    /* first available state */                                                                 \
57    macro (ompt_state_undefined, 0x102)      /* undefined thread state */                        \
58                                                                                                \
59    /* work states (0..15) */                                                                   \
60    macro (ompt_state_work_serial, 0x000)    /* working outside parallel */                      \
61    macro (ompt_state_work_parallel, 0x001)  /* working within parallel */                       \
62    macro (ompt_state_work_reduction, 0x002) /* performing a reduction */                        \
63                                                                                                \
64    /* barrier wait states (16..31) */                                                          \
65    macro (ompt_state_wait_barrier, 0x010)   /* waiting at a barrier */                          \
66    macro (ompt_state_wait_barrier_implicit_parallel, 0x011)                                     \
67                                            /* implicit barrier at the end of parallel region */\
68    macro (ompt_state_wait_barrier_implicit_workshare, 0x012)                                    \
69                                            /* implicit barrier at the end of worksharing */    \
70    macro (ompt_state_wait_barrier_implicit, 0x013)  /* implicit barrier */                      \
71    macro (ompt_state_wait_barrier_explicit, 0x014)  /* explicit barrier */                      \
72                                                                                                \
73    /* task wait states (32..63) */                                                             \
74    macro (ompt_state_wait_taskwait, 0x020)  /* waiting at a taskwait */                         \
75    macro (ompt_state_wait_taskgroup, 0x021) /* waiting at a taskgroup */                        \
76                                                                                                \
77    /* mutex wait states (64..127) */                                                           \
78    macro (ompt_state_wait_mutex, 0x040)                                                         \
79    macro (ompt_state_wait_lock, 0x041)      /* waiting for lock */                              \
80    macro (ompt_state_wait_critical, 0x042)  /* waiting for critical */                          \
81    macro (ompt_state_wait_atomic, 0x043)    /* waiting for atomic */                            \
82    macro (ompt_state_wait_ordered, 0x044)   /* waiting for ordered */                           \
83                                                                                                \
84    /* target wait states (128..255) */                                                         \
85    macro (ompt_state_wait_target, 0x080)        /* waiting for target region */                 \
86    macro (ompt_state_wait_target_map, 0x081)    /* waiting for target data mapping operation */ \
87    macro (ompt_state_wait_target_update, 0x082) /* waiting for target update operation */       \
88                                                                                                \
89    /* misc (256..511) */                                                                       \
90    macro (ompt_state_idle, 0x100)           /* waiting for work */                              \
91    macro (ompt_state_overhead, 0x101)       /* overhead excluding wait states */                \
92                                                                                                \
93    /* implementation-specific states (512..) */
94
95
96#define FOREACH_KMP_MUTEX_IMPL(macro)                                                \
97    macro (kmp_mutex_impl_none, 0)         /* unknown implementation */              \
98    macro (kmp_mutex_impl_spin, 1)         /* based on spin */                       \
99    macro (kmp_mutex_impl_queuing, 2)      /* based on some fair policy */           \
100    macro (kmp_mutex_impl_speculative, 3)  /* based on HW-supported speculation */
101
102#define FOREACH_OMPT_EVENT(macro)                                                                                        \
103                                                                                                                         \
104    /*--- Mandatory Events ---*/                                                                                         \
105    macro (ompt_callback_thread_begin,      ompt_callback_thread_begin_t,       1) /* thread begin                    */ \
106    macro (ompt_callback_thread_end,        ompt_callback_thread_end_t,         2) /* thread end                      */ \
107                                                                                                                         \
108    macro (ompt_callback_parallel_begin,    ompt_callback_parallel_begin_t,     3) /* parallel begin                  */ \
109    macro (ompt_callback_parallel_end,      ompt_callback_parallel_end_t,       4) /* parallel end                    */ \
110                                                                                                                         \
111    macro (ompt_callback_task_create,       ompt_callback_task_create_t,        5) /* task begin                      */ \
112    macro (ompt_callback_task_schedule,     ompt_callback_task_schedule_t,      6) /* task schedule                   */ \
113    macro (ompt_callback_implicit_task,     ompt_callback_implicit_task_t,      7) /* implicit task                   */ \
114                                                                                                                         \
115    macro (ompt_callback_target,            ompt_callback_target_t,             8) /* target                          */ \
116    macro (ompt_callback_target_data_op,    ompt_callback_target_data_op_t,     9) /* target data op                  */ \
117    macro (ompt_callback_target_submit,     ompt_callback_target_submit_t,     10) /* target  submit                  */ \
118                                                                                                                         \
119    macro (ompt_callback_control_tool,      ompt_callback_control_tool_t,      11) /* control tool                    */ \
120                                                                                                                         \
121    macro (ompt_callback_device_initialize, ompt_callback_device_initialize_t, 12) /* device initialize               */ \
122    macro (ompt_callback_device_finalize,   ompt_callback_device_finalize_t,   13) /* device finalize                 */ \
123                                                                                                                         \
124    macro (ompt_callback_device_load,       ompt_callback_device_load_t,       14) /* device load                     */ \
125    macro (ompt_callback_device_unload,     ompt_callback_device_unload_t,     15) /* device unload                   */ \
126                                                                                                                         \
127    /* Optional Events */                                                                                                \
128    macro (ompt_callback_sync_region_wait,  ompt_callback_sync_region_t,       16) /* sync region wait begin or end   */ \
129                                                                                                                         \
130    macro (ompt_callback_mutex_released,    ompt_callback_mutex_t,             17) /* mutex released                  */ \
131                                                                                                                         \
132    macro (ompt_callback_dependences,       ompt_callback_dependences_t,       18) /* report task dependences         */ \
133    macro (ompt_callback_task_dependence,   ompt_callback_task_dependence_t,   19) /* report task dependence          */ \
134                                                                                                                         \
135    macro (ompt_callback_work,              ompt_callback_work_t,              20) /* task at work begin or end       */ \
136                                                                                                                         \
137    macro (ompt_callback_master,            ompt_callback_master_t,            21) /* task at master begin or end     */ \
138                                                                                                                         \
139    macro (ompt_callback_target_map,        ompt_callback_target_map_t,        22) /* target map                      */ \
140                                                                                                                         \
141    macro (ompt_callback_sync_region,       ompt_callback_sync_region_t,       23) /* sync region begin or end        */ \
142                                                                                                                         \
143    macro (ompt_callback_lock_init,         ompt_callback_mutex_acquire_t,     24) /* lock init                       */ \
144    macro (ompt_callback_lock_destroy,      ompt_callback_mutex_t,             25) /* lock destroy                    */ \
145                                                                                                                         \
146    macro (ompt_callback_mutex_acquire,     ompt_callback_mutex_acquire_t,     26) /* mutex acquire                   */ \
147    macro (ompt_callback_mutex_acquired,    ompt_callback_mutex_t,             27) /* mutex acquired                  */ \
148                                                                                                                         \
149    macro (ompt_callback_nest_lock,         ompt_callback_nest_lock_t,         28) /* nest lock                       */ \
150                                                                                                                         \
151    macro (ompt_callback_flush,             ompt_callback_flush_t,             29) /* after executing flush           */ \
152                                                                                                                         \
153    macro (ompt_callback_cancel,            ompt_callback_cancel_t,            30) /* cancel innermost binding region */ \
154                                                                                                                         \
155    macro (ompt_callback_reduction,         ompt_callback_sync_region_t,       31) /* reduction                       */ \
156                                                                                                                         \
157    macro (ompt_callback_dispatch,          ompt_callback_dispatch_t,          32) /* dispatch of work                */
158
159/*****************************************************************************
160 * implementation specific types
161 *****************************************************************************/
162
163typedef enum kmp_mutex_impl_t {
164#define kmp_mutex_impl_macro(impl, code) impl = code,
165    FOREACH_KMP_MUTEX_IMPL(kmp_mutex_impl_macro)
166#undef kmp_mutex_impl_macro
167} kmp_mutex_impl_t;
168
169/*****************************************************************************
170 * definitions generated from spec
171 *****************************************************************************/
172
173typedef enum ompt_callbacks_t {
174  ompt_callback_thread_begin             = 1,
175  ompt_callback_thread_end               = 2,
176  ompt_callback_parallel_begin           = 3,
177  ompt_callback_parallel_end             = 4,
178  ompt_callback_task_create              = 5,
179  ompt_callback_task_schedule            = 6,
180  ompt_callback_implicit_task            = 7,
181  ompt_callback_target                   = 8,
182  ompt_callback_target_data_op           = 9,
183  ompt_callback_target_submit            = 10,
184  ompt_callback_control_tool             = 11,
185  ompt_callback_device_initialize        = 12,
186  ompt_callback_device_finalize          = 13,
187  ompt_callback_device_load              = 14,
188  ompt_callback_device_unload            = 15,
189  ompt_callback_sync_region_wait         = 16,
190  ompt_callback_mutex_released           = 17,
191  ompt_callback_dependences              = 18,
192  ompt_callback_task_dependence          = 19,
193  ompt_callback_work                     = 20,
194  ompt_callback_master                   = 21,
195  ompt_callback_target_map               = 22,
196  ompt_callback_sync_region              = 23,
197  ompt_callback_lock_init                = 24,
198  ompt_callback_lock_destroy             = 25,
199  ompt_callback_mutex_acquire            = 26,
200  ompt_callback_mutex_acquired           = 27,
201  ompt_callback_nest_lock                = 28,
202  ompt_callback_flush                    = 29,
203  ompt_callback_cancel                   = 30,
204  ompt_callback_reduction                = 31,
205  ompt_callback_dispatch                 = 32
206} ompt_callbacks_t;
207
208typedef enum ompt_record_t {
209  ompt_record_ompt               = 1,
210  ompt_record_native             = 2,
211  ompt_record_invalid            = 3
212} ompt_record_t;
213
214typedef enum ompt_record_native_t {
215  ompt_record_native_info  = 1,
216  ompt_record_native_event = 2
217} ompt_record_native_t;
218
219typedef enum ompt_set_result_t {
220  ompt_set_error            = 0,
221  ompt_set_never            = 1,
222  ompt_set_impossible       = 2,
223  ompt_set_sometimes        = 3,
224  ompt_set_sometimes_paired = 4,
225  ompt_set_always           = 5
226} ompt_set_result_t;
227
228typedef uint64_t ompt_id_t;
229
230typedef uint64_t ompt_device_time_t;
231
232typedef uint64_t ompt_buffer_cursor_t;
233
234typedef enum ompt_thread_t {
235  ompt_thread_initial                 = 1,
236  ompt_thread_worker                  = 2,
237  ompt_thread_other                   = 3,
238  ompt_thread_unknown                 = 4
239} ompt_thread_t;
240
241typedef enum ompt_scope_endpoint_t {
242  ompt_scope_begin                    = 1,
243  ompt_scope_end                      = 2
244} ompt_scope_endpoint_t;
245
246typedef enum ompt_dispatch_t {
247  ompt_dispatch_iteration             = 1,
248  ompt_dispatch_section               = 2
249} ompt_dispatch_t;
250
251typedef enum ompt_sync_region_t {
252  ompt_sync_region_barrier                = 1,
253  ompt_sync_region_barrier_implicit       = 2,
254  ompt_sync_region_barrier_explicit       = 3,
255  ompt_sync_region_barrier_implementation = 4,
256  ompt_sync_region_taskwait               = 5,
257  ompt_sync_region_taskgroup              = 6,
258  ompt_sync_region_reduction              = 7
259} ompt_sync_region_t;
260
261typedef enum ompt_target_data_op_t {
262  ompt_target_data_alloc                = 1,
263  ompt_target_data_transfer_to_device   = 2,
264  ompt_target_data_transfer_from_device = 3,
265  ompt_target_data_delete               = 4,
266  ompt_target_data_associate            = 5,
267  ompt_target_data_disassociate         = 6
268} ompt_target_data_op_t;
269
270typedef enum ompt_work_t {
271  ompt_work_loop               = 1,
272  ompt_work_sections           = 2,
273  ompt_work_single_executor    = 3,
274  ompt_work_single_other       = 4,
275  ompt_work_workshare          = 5,
276  ompt_work_distribute         = 6,
277  ompt_work_taskloop           = 7
278} ompt_work_t;
279
280typedef enum ompt_mutex_t {
281  ompt_mutex_lock                     = 1,
282  ompt_mutex_test_lock                = 2,
283  ompt_mutex_nest_lock                = 3,
284  ompt_mutex_test_nest_lock           = 4,
285  ompt_mutex_critical                 = 5,
286  ompt_mutex_atomic                   = 6,
287  ompt_mutex_ordered                  = 7
288} ompt_mutex_t;
289
290typedef enum ompt_native_mon_flag_t {
291  ompt_native_data_motion_explicit    = 0x01,
292  ompt_native_data_motion_implicit    = 0x02,
293  ompt_native_kernel_invocation       = 0x04,
294  ompt_native_kernel_execution        = 0x08,
295  ompt_native_driver                  = 0x10,
296  ompt_native_runtime                 = 0x20,
297  ompt_native_overhead                = 0x40,
298  ompt_native_idleness                = 0x80
299} ompt_native_mon_flag_t;
300
301typedef enum ompt_task_flag_t {
302  ompt_task_initial                   = 0x00000001,
303  ompt_task_implicit                  = 0x00000002,
304  ompt_task_explicit                  = 0x00000004,
305  ompt_task_target                    = 0x00000008,
306  ompt_task_undeferred                = 0x08000000,
307  ompt_task_untied                    = 0x10000000,
308  ompt_task_final                     = 0x20000000,
309  ompt_task_mergeable                 = 0x40000000,
310  ompt_task_merged                    = 0x80000000
311} ompt_task_flag_t;
312
313typedef enum ompt_task_status_t {
314  ompt_task_complete      = 1,
315  ompt_task_yield         = 2,
316  ompt_task_cancel        = 3,
317  ompt_task_detach        = 4,
318  ompt_task_early_fulfill = 5,
319  ompt_task_late_fulfill  = 6,
320  ompt_task_switch        = 7
321} ompt_task_status_t;
322
323typedef enum ompt_target_t {
324  ompt_target                         = 1,
325  ompt_target_enter_data              = 2,
326  ompt_target_exit_data               = 3,
327  ompt_target_update                  = 4
328} ompt_target_t;
329
330typedef enum ompt_parallel_flag_t {
331  ompt_parallel_invoker_program = 0x00000001,
332  ompt_parallel_invoker_runtime = 0x00000002,
333  ompt_parallel_league          = 0x40000000,
334  ompt_parallel_team            = 0x80000000
335} ompt_parallel_flag_t;
336
337typedef enum ompt_target_map_flag_t {
338  ompt_target_map_flag_to             = 0x01,
339  ompt_target_map_flag_from           = 0x02,
340  ompt_target_map_flag_alloc          = 0x04,
341  ompt_target_map_flag_release        = 0x08,
342  ompt_target_map_flag_delete         = 0x10,
343  ompt_target_map_flag_implicit       = 0x20
344} ompt_target_map_flag_t;
345
346typedef enum ompt_dependence_type_t {
347  ompt_dependence_type_in              = 1,
348  ompt_dependence_type_out             = 2,
349  ompt_dependence_type_inout           = 3,
350  ompt_dependence_type_mutexinoutset   = 4,
351  ompt_dependence_type_source          = 5,
352  ompt_dependence_type_sink            = 6
353} ompt_dependence_type_t;
354
355typedef enum ompt_cancel_flag_t {
356  ompt_cancel_parallel       = 0x01,
357  ompt_cancel_sections       = 0x02,
358  ompt_cancel_loop           = 0x04,
359  ompt_cancel_taskgroup      = 0x08,
360  ompt_cancel_activated      = 0x10,
361  ompt_cancel_detected       = 0x20,
362  ompt_cancel_discarded_task = 0x40
363} ompt_cancel_flag_t;
364
365typedef uint64_t ompt_hwid_t;
366
367typedef uint64_t ompt_wait_id_t;
368
369typedef enum ompt_frame_flag_t {
370  ompt_frame_runtime        = 0x00,
371  ompt_frame_application    = 0x01,
372  ompt_frame_cfa            = 0x10,
373  ompt_frame_framepointer   = 0x20,
374  ompt_frame_stackaddress   = 0x30
375} ompt_frame_flag_t;
376
377typedef enum ompt_state_t {
378  ompt_state_work_serial                      = 0x000,
379  ompt_state_work_parallel                    = 0x001,
380  ompt_state_work_reduction                   = 0x002,
381
382  ompt_state_wait_barrier                     = 0x010,
383  ompt_state_wait_barrier_implicit_parallel   = 0x011,
384  ompt_state_wait_barrier_implicit_workshare  = 0x012,
385  ompt_state_wait_barrier_implicit            = 0x013,
386  ompt_state_wait_barrier_explicit            = 0x014,
387
388  ompt_state_wait_taskwait                    = 0x020,
389  ompt_state_wait_taskgroup                   = 0x021,
390
391  ompt_state_wait_mutex                       = 0x040,
392  ompt_state_wait_lock                        = 0x041,
393  ompt_state_wait_critical                    = 0x042,
394  ompt_state_wait_atomic                      = 0x043,
395  ompt_state_wait_ordered                     = 0x044,
396
397  ompt_state_wait_target                      = 0x080,
398  ompt_state_wait_target_map                  = 0x081,
399  ompt_state_wait_target_update               = 0x082,
400
401  ompt_state_idle                             = 0x100,
402  ompt_state_overhead                         = 0x101,
403  ompt_state_undefined                        = 0x102
404} ompt_state_t;
405
406typedef uint64_t (*ompt_get_unique_id_t) (void);
407
408typedef uint64_t ompd_size_t;
409
410typedef uint64_t ompd_wait_id_t;
411
412typedef uint64_t ompd_addr_t;
413typedef int64_t  ompd_word_t;
414typedef uint64_t ompd_seg_t;
415
416typedef uint64_t ompd_device_t;
417
418typedef uint64_t ompd_thread_id_t;
419
420typedef enum ompd_scope_t {
421  ompd_scope_global = 1,
422  ompd_scope_address_space = 2,
423  ompd_scope_thread = 3,
424  ompd_scope_parallel = 4,
425  ompd_scope_implicit_task = 5,
426  ompd_scope_task = 6
427} ompd_scope_t;
428
429typedef uint64_t ompd_icv_id_t;
430
431typedef enum ompd_rc_t {
432  ompd_rc_ok = 0,
433  ompd_rc_unavailable = 1,
434  ompd_rc_stale_handle = 2,
435  ompd_rc_bad_input = 3,
436  ompd_rc_error = 4,
437  ompd_rc_unsupported = 5,
438  ompd_rc_needs_state_tracking = 6,
439  ompd_rc_incompatible = 7,
440  ompd_rc_device_read_error = 8,
441  ompd_rc_device_write_error = 9,
442  ompd_rc_nomem = 10,
443} ompd_rc_t;
444
445typedef void (*ompt_interface_fn_t) (void);
446
447typedef ompt_interface_fn_t (*ompt_function_lookup_t) (
448  const char *interface_function_name
449);
450
451typedef union ompt_data_t {
452  uint64_t value;
453  void *ptr;
454} ompt_data_t;
455
456typedef struct ompt_frame_t {
457  ompt_data_t exit_frame;
458  ompt_data_t enter_frame;
459  int exit_frame_flags;
460  int enter_frame_flags;
461} ompt_frame_t;
462
463typedef void (*ompt_callback_t) (void);
464
465typedef void ompt_device_t;
466
467typedef void ompt_buffer_t;
468
469typedef void (*ompt_callback_buffer_request_t) (
470  int device_num,
471  ompt_buffer_t **buffer,
472  size_t *bytes
473);
474
475typedef void (*ompt_callback_buffer_complete_t) (
476  int device_num,
477  ompt_buffer_t *buffer,
478  size_t bytes,
479  ompt_buffer_cursor_t begin,
480  int buffer_owned
481);
482
483typedef void (*ompt_finalize_t) (
484  ompt_data_t *tool_data
485);
486
487typedef int (*ompt_initialize_t) (
488  ompt_function_lookup_t lookup,
489  int initial_device_num,
490  ompt_data_t *tool_data
491);
492
493typedef struct ompt_start_tool_result_t {
494  ompt_initialize_t initialize;
495  ompt_finalize_t finalize;
496  ompt_data_t tool_data;
497} ompt_start_tool_result_t;
498
499typedef struct ompt_record_abstract_t {
500  ompt_record_native_t rclass;
501  const char *type;
502  ompt_device_time_t start_time;
503  ompt_device_time_t end_time;
504  ompt_hwid_t hwid;
505} ompt_record_abstract_t;
506
507typedef struct ompt_dependence_t {
508  ompt_data_t variable;
509  ompt_dependence_type_t dependence_type;
510} ompt_dependence_t;
511
512typedef int (*ompt_enumerate_states_t) (
513  int current_state,
514  int *next_state,
515  const char **next_state_name
516);
517
518typedef int (*ompt_enumerate_mutex_impls_t) (
519  int current_impl,
520  int *next_impl,
521  const char **next_impl_name
522);
523
524typedef ompt_set_result_t (*ompt_set_callback_t) (
525  ompt_callbacks_t event,
526  ompt_callback_t callback
527);
528
529typedef int (*ompt_get_callback_t) (
530  ompt_callbacks_t event,
531  ompt_callback_t *callback
532);
533
534typedef ompt_data_t *(*ompt_get_thread_data_t) (void);
535
536typedef int (*ompt_get_num_procs_t) (void);
537
538typedef int (*ompt_get_num_places_t) (void);
539
540typedef int (*ompt_get_place_proc_ids_t) (
541  int place_num,
542  int ids_size,
543  int *ids
544);
545
546typedef int (*ompt_get_place_num_t) (void);
547
548typedef int (*ompt_get_partition_place_nums_t) (
549  int place_nums_size,
550  int *place_nums
551);
552
553typedef int (*ompt_get_proc_id_t) (void);
554
555typedef int (*ompt_get_state_t) (
556  ompt_wait_id_t *wait_id
557);
558
559typedef int (*ompt_get_parallel_info_t) (
560  int ancestor_level,
561  ompt_data_t **parallel_data,
562  int *team_size
563);
564
565typedef int (*ompt_get_task_info_t) (
566  int ancestor_level,
567  int *flags,
568  ompt_data_t **task_data,
569  ompt_frame_t **task_frame,
570  ompt_data_t **parallel_data,
571  int *thread_num
572);
573
574typedef int (*ompt_get_task_memory_t)(
575  void **addr,
576  size_t *size,
577  int block
578);
579
580typedef int (*ompt_get_target_info_t) (
581  uint64_t *device_num,
582  ompt_id_t *target_id,
583  ompt_id_t *host_op_id
584);
585
586typedef int (*ompt_get_num_devices_t) (void);
587
588typedef void (*ompt_finalize_tool_t) (void);
589
590typedef int (*ompt_get_device_num_procs_t) (
591  ompt_device_t *device
592);
593
594typedef ompt_device_time_t (*ompt_get_device_time_t) (
595  ompt_device_t *device
596);
597
598typedef double (*ompt_translate_time_t) (
599  ompt_device_t *device,
600  ompt_device_time_t time
601);
602
603typedef ompt_set_result_t (*ompt_set_trace_ompt_t) (
604  ompt_device_t *device,
605  unsigned int enable,
606  unsigned int etype
607);
608
609typedef ompt_set_result_t (*ompt_set_trace_native_t) (
610  ompt_device_t *device,
611  int enable,
612  int flags
613);
614
615typedef int (*ompt_start_trace_t) (
616  ompt_device_t *device,
617  ompt_callback_buffer_request_t request,
618  ompt_callback_buffer_complete_t complete
619);
620
621typedef int (*ompt_pause_trace_t) (
622  ompt_device_t *device,
623  int begin_pause
624);
625
626typedef int (*ompt_flush_trace_t) (
627  ompt_device_t *device
628);
629
630typedef int (*ompt_stop_trace_t) (
631  ompt_device_t *device
632);
633
634typedef int (*ompt_advance_buffer_cursor_t) (
635  ompt_device_t *device,
636  ompt_buffer_t *buffer,
637  size_t size,
638  ompt_buffer_cursor_t current,
639  ompt_buffer_cursor_t *next
640);
641
642typedef ompt_record_t (*ompt_get_record_type_t) (
643  ompt_buffer_t *buffer,
644  ompt_buffer_cursor_t current
645);
646
647typedef void *(*ompt_get_record_native_t) (
648  ompt_buffer_t *buffer,
649  ompt_buffer_cursor_t current,
650  ompt_id_t *host_op_id
651);
652
653typedef ompt_record_abstract_t *
654(*ompt_get_record_abstract_t) (
655  void *native_record
656);
657
658typedef void (*ompt_callback_thread_begin_t) (
659  ompt_thread_t thread_type,
660  ompt_data_t *thread_data
661);
662
663typedef struct ompt_record_thread_begin_t {
664  ompt_thread_t thread_type;
665} ompt_record_thread_begin_t;
666
667typedef void (*ompt_callback_thread_end_t) (
668  ompt_data_t *thread_data
669);
670
671typedef void (*ompt_callback_parallel_begin_t) (
672  ompt_data_t *encountering_task_data,
673  const ompt_frame_t *encountering_task_frame,
674  ompt_data_t *parallel_data,
675  unsigned int requested_parallelism,
676  int flags,
677  const void *codeptr_ra
678);
679
680typedef struct ompt_record_parallel_begin_t {
681  ompt_id_t encountering_task_id;
682  ompt_id_t parallel_id;
683  unsigned int requested_parallelism;
684  int flags;
685  const void *codeptr_ra;
686} ompt_record_parallel_begin_t;
687
688typedef void (*ompt_callback_parallel_end_t) (
689  ompt_data_t *parallel_data,
690  ompt_data_t *encountering_task_data,
691  int flags,
692  const void *codeptr_ra
693);
694
695typedef struct ompt_record_parallel_end_t {
696  ompt_id_t parallel_id;
697  ompt_id_t encountering_task_id;
698  int flags;
699  const void *codeptr_ra;
700} ompt_record_parallel_end_t;
701
702typedef void (*ompt_callback_work_t) (
703  ompt_work_t wstype,
704  ompt_scope_endpoint_t endpoint,
705  ompt_data_t *parallel_data,
706  ompt_data_t *task_data,
707  uint64_t count,
708  const void *codeptr_ra
709);
710
711typedef struct ompt_record_work_t {
712  ompt_work_t wstype;
713  ompt_scope_endpoint_t endpoint;
714  ompt_id_t parallel_id;
715  ompt_id_t task_id;
716  uint64_t count;
717  const void *codeptr_ra;
718} ompt_record_work_t;
719
720typedef void (*ompt_callback_dispatch_t) (
721  ompt_data_t *parallel_data,
722  ompt_data_t *task_data,
723  ompt_dispatch_t kind,
724  ompt_data_t instance
725);
726
727typedef struct ompt_record_dispatch_t {
728  ompt_id_t parallel_id;
729  ompt_id_t task_id;
730  ompt_dispatch_t kind;
731  ompt_data_t instance;
732} ompt_record_dispatch_t;
733
734typedef void (*ompt_callback_task_create_t) (
735  ompt_data_t *encountering_task_data,
736  const ompt_frame_t *encountering_task_frame,
737  ompt_data_t *new_task_data,
738  int flags,
739  int has_dependences,
740  const void *codeptr_ra
741);
742
743typedef struct ompt_record_task_create_t {
744  ompt_id_t encountering_task_id;
745  ompt_id_t new_task_id;
746  int flags;
747  int has_dependences;
748  const void *codeptr_ra;
749} ompt_record_task_create_t;
750
751typedef void (*ompt_callback_dependences_t) (
752  ompt_data_t *task_data,
753  const ompt_dependence_t *deps,
754  int ndeps
755);
756
757typedef struct ompt_record_dependences_t {
758  ompt_id_t task_id;
759  ompt_dependence_t dep;
760  int ndeps;
761} ompt_record_dependences_t;
762
763typedef void (*ompt_callback_task_dependence_t) (
764  ompt_data_t *src_task_data,
765  ompt_data_t *sink_task_data
766);
767
768typedef struct ompt_record_task_dependence_t {
769  ompt_id_t src_task_id;
770  ompt_id_t sink_task_id;
771} ompt_record_task_dependence_t;
772
773typedef void (*ompt_callback_task_schedule_t) (
774  ompt_data_t *prior_task_data,
775  ompt_task_status_t prior_task_status,
776  ompt_data_t *next_task_data
777);
778
779typedef struct ompt_record_task_schedule_t {
780  ompt_id_t prior_task_id;
781  ompt_task_status_t prior_task_status;
782  ompt_id_t next_task_id;
783} ompt_record_task_schedule_t;
784
785typedef void (*ompt_callback_implicit_task_t) (
786  ompt_scope_endpoint_t endpoint,
787  ompt_data_t *parallel_data,
788  ompt_data_t *task_data,
789  unsigned int actual_parallelism,
790  unsigned int index,
791  int flags
792);
793
794typedef struct ompt_record_implicit_task_t {
795  ompt_scope_endpoint_t endpoint;
796  ompt_id_t parallel_id;
797  ompt_id_t task_id;
798  unsigned int actual_parallelism;
799  unsigned int index;
800  int flags;
801} ompt_record_implicit_task_t;
802
803typedef void (*ompt_callback_master_t) (
804  ompt_scope_endpoint_t endpoint,
805  ompt_data_t *parallel_data,
806  ompt_data_t *task_data,
807  const void *codeptr_ra
808);
809
810typedef struct ompt_record_master_t {
811  ompt_scope_endpoint_t endpoint;
812  ompt_id_t parallel_id;
813  ompt_id_t task_id;
814  const void *codeptr_ra;
815} ompt_record_master_t;
816
817typedef void (*ompt_callback_sync_region_t) (
818  ompt_sync_region_t kind,
819  ompt_scope_endpoint_t endpoint,
820  ompt_data_t *parallel_data,
821  ompt_data_t *task_data,
822  const void *codeptr_ra
823);
824
825typedef struct ompt_record_sync_region_t {
826  ompt_sync_region_t kind;
827  ompt_scope_endpoint_t endpoint;
828  ompt_id_t parallel_id;
829  ompt_id_t task_id;
830  const void *codeptr_ra;
831} ompt_record_sync_region_t;
832
833typedef void (*ompt_callback_mutex_acquire_t) (
834  ompt_mutex_t kind,
835  unsigned int hint,
836  unsigned int impl,
837  ompt_wait_id_t wait_id,
838  const void *codeptr_ra
839);
840
841typedef struct ompt_record_mutex_acquire_t {
842  ompt_mutex_t kind;
843  unsigned int hint;
844  unsigned int impl;
845  ompt_wait_id_t wait_id;
846  const void *codeptr_ra;
847} ompt_record_mutex_acquire_t;
848
849typedef void (*ompt_callback_mutex_t) (
850  ompt_mutex_t kind,
851  ompt_wait_id_t wait_id,
852  const void *codeptr_ra
853);
854
855typedef struct ompt_record_mutex_t {
856  ompt_mutex_t kind;
857  ompt_wait_id_t wait_id;
858  const void *codeptr_ra;
859} ompt_record_mutex_t;
860
861typedef void (*ompt_callback_nest_lock_t) (
862  ompt_scope_endpoint_t endpoint,
863  ompt_wait_id_t wait_id,
864  const void *codeptr_ra
865);
866
867typedef struct ompt_record_nest_lock_t {
868  ompt_scope_endpoint_t endpoint;
869  ompt_wait_id_t wait_id;
870  const void *codeptr_ra;
871} ompt_record_nest_lock_t;
872
873typedef void (*ompt_callback_flush_t) (
874  ompt_data_t *thread_data,
875  const void *codeptr_ra
876);
877
878typedef struct ompt_record_flush_t {
879  const void *codeptr_ra;
880} ompt_record_flush_t;
881
882typedef void (*ompt_callback_cancel_t) (
883  ompt_data_t *task_data,
884  int flags,
885  const void *codeptr_ra
886);
887
888typedef struct ompt_record_cancel_t {
889  ompt_id_t task_id;
890  int flags;
891  const void *codeptr_ra;
892} ompt_record_cancel_t;
893
894typedef void (*ompt_callback_device_initialize_t) (
895  int device_num,
896  const char *type,
897  ompt_device_t *device,
898  ompt_function_lookup_t lookup,
899  const char *documentation
900);
901
902typedef void (*ompt_callback_device_finalize_t) (
903  int device_num
904);
905
906typedef void (*ompt_callback_device_load_t) (
907  int device_num,
908  const char *filename,
909  int64_t offset_in_file,
910  void *vma_in_file,
911  size_t bytes,
912  void *host_addr,
913  void *device_addr,
914  uint64_t module_id
915);
916
917typedef void (*ompt_callback_device_unload_t) (
918  int device_num,
919  uint64_t module_id
920);
921
922typedef void (*ompt_callback_target_data_op_t) (
923  ompt_id_t target_id,
924  ompt_id_t host_op_id,
925  ompt_target_data_op_t optype,
926  void *src_addr,
927  int src_device_num,
928  void *dest_addr,
929  int dest_device_num,
930  size_t bytes,
931  const void *codeptr_ra
932);
933
934typedef struct ompt_record_target_data_op_t {
935  ompt_id_t host_op_id;
936  ompt_target_data_op_t optype;
937  void *src_addr;
938  int src_device_num;
939  void *dest_addr;
940  int dest_device_num;
941  size_t bytes;
942  ompt_device_time_t end_time;
943  const void *codeptr_ra;
944} ompt_record_target_data_op_t;
945
946typedef void (*ompt_callback_target_t) (
947  ompt_target_t kind,
948  ompt_scope_endpoint_t endpoint,
949  int device_num,
950  ompt_data_t *task_data,
951  ompt_id_t target_id,
952  const void *codeptr_ra
953);
954
955typedef struct ompt_record_target_t {
956  ompt_target_t kind;
957  ompt_scope_endpoint_t endpoint;
958  int device_num;
959  ompt_id_t task_id;
960  ompt_id_t target_id;
961  const void *codeptr_ra;
962} ompt_record_target_t;
963
964typedef void (*ompt_callback_target_map_t) (
965  ompt_id_t target_id,
966  unsigned int nitems,
967  void **host_addr,
968  void **device_addr,
969  size_t *bytes,
970  unsigned int *mapping_flags,
971  const void *codeptr_ra
972);
973
974typedef struct ompt_record_target_map_t {
975  ompt_id_t target_id;
976  unsigned int nitems;
977  void **host_addr;
978  void **device_addr;
979  size_t *bytes;
980  unsigned int *mapping_flags;
981  const void *codeptr_ra;
982} ompt_record_target_map_t;
983
984typedef void (*ompt_callback_target_submit_t) (
985  ompt_id_t target_id,
986  ompt_id_t host_op_id,
987  unsigned int requested_num_teams
988);
989
990typedef struct ompt_record_target_kernel_t {
991  ompt_id_t host_op_id;
992  unsigned int requested_num_teams;
993  unsigned int granted_num_teams;
994  ompt_device_time_t end_time;
995} ompt_record_target_kernel_t;
996
997typedef int (*ompt_callback_control_tool_t) (
998  uint64_t command,
999  uint64_t modifier,
1000  void *arg,
1001  const void *codeptr_ra
1002);
1003
1004typedef struct ompt_record_control_tool_t {
1005  uint64_t command;
1006  uint64_t modifier;
1007  const void *codeptr_ra;
1008} ompt_record_control_tool_t;
1009
1010typedef struct ompd_address_t {
1011  ompd_seg_t segment;
1012  ompd_addr_t address;
1013} ompd_address_t;
1014
1015typedef struct ompd_frame_info_t {
1016  ompd_address_t frame_address;
1017  ompd_word_t frame_flag;
1018} ompd_frame_info_t;
1019
1020typedef struct _ompd_aspace_handle ompd_address_space_handle_t;
1021typedef struct _ompd_thread_handle ompd_thread_handle_t;
1022typedef struct _ompd_parallel_handle ompd_parallel_handle_t;
1023typedef struct _ompd_task_handle ompd_task_handle_t;
1024
1025typedef struct _ompd_aspace_cont ompd_address_space_context_t;
1026typedef struct _ompd_thread_cont ompd_thread_context_t;
1027
1028typedef struct ompd_device_type_sizes_t {
1029  uint8_t sizeof_char;
1030  uint8_t sizeof_short;
1031  uint8_t sizeof_int;
1032  uint8_t sizeof_long;
1033  uint8_t sizeof_long_long;
1034  uint8_t sizeof_pointer;
1035} ompd_device_type_sizes_t;
1036
1037typedef struct ompt_record_ompt_t {
1038  ompt_callbacks_t type;
1039  ompt_device_time_t time;
1040  ompt_id_t thread_id;
1041  ompt_id_t target_id;
1042  union {
1043    ompt_record_thread_begin_t thread_begin;
1044    ompt_record_parallel_begin_t parallel_begin;
1045    ompt_record_parallel_end_t parallel_end;
1046    ompt_record_work_t work;
1047    ompt_record_dispatch_t dispatch;
1048    ompt_record_task_create_t task_create;
1049    ompt_record_dependences_t dependences;
1050    ompt_record_task_dependence_t task_dependence;
1051    ompt_record_task_schedule_t task_schedule;
1052    ompt_record_implicit_task_t implicit_task;
1053    ompt_record_master_t master;
1054    ompt_record_sync_region_t sync_region;
1055    ompt_record_mutex_acquire_t mutex_acquire;
1056    ompt_record_mutex_t mutex;
1057    ompt_record_nest_lock_t nest_lock;
1058    ompt_record_flush_t flush;
1059    ompt_record_cancel_t cancel;
1060    ompt_record_target_t target;
1061    ompt_record_target_data_op_t target_data_op;
1062    ompt_record_target_map_t target_map;
1063    ompt_record_target_kernel_t target_kernel;
1064    ompt_record_control_tool_t control_tool;
1065  } record;
1066} ompt_record_ompt_t;
1067
1068typedef ompt_record_ompt_t *(*ompt_get_record_ompt_t) (
1069  ompt_buffer_t *buffer,
1070  ompt_buffer_cursor_t current
1071);
1072
1073#define ompt_id_none 0
1074#define ompt_data_none {0}
1075#define ompt_time_none 0
1076#define ompt_hwid_none 0
1077#define ompt_addr_none ~0
1078#define ompt_mutex_impl_none 0
1079#define ompt_wait_id_none 0
1080
1081#define ompd_segment_none 0
1082
1083#endif /* __OMPT__ */
1084