xref: /freebsd/lib/libomp/omp-tools.h (revision 6b1e5fae2cfc205d8c2e27bd8badebd1ee61500c)
1 // $FreeBSD$
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 
163 typedef 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 
173 typedef 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 
208 typedef enum ompt_record_t {
209   ompt_record_ompt               = 1,
210   ompt_record_native             = 2,
211   ompt_record_invalid            = 3
212 } ompt_record_t;
213 
214 typedef enum ompt_record_native_t {
215   ompt_record_native_info  = 1,
216   ompt_record_native_event = 2
217 } ompt_record_native_t;
218 
219 typedef 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 
228 typedef uint64_t ompt_id_t;
229 
230 typedef uint64_t ompt_device_time_t;
231 
232 typedef uint64_t ompt_buffer_cursor_t;
233 
234 typedef 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 
241 typedef enum ompt_scope_endpoint_t {
242   ompt_scope_begin                    = 1,
243   ompt_scope_end                      = 2
244 } ompt_scope_endpoint_t;
245 
246 typedef enum ompt_dispatch_t {
247   ompt_dispatch_iteration             = 1,
248   ompt_dispatch_section               = 2
249 } ompt_dispatch_t;
250 
251 typedef 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 
261 typedef 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 
270 typedef 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 
280 typedef 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 
290 typedef 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 
301 typedef 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 
313 typedef 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 
323 typedef 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 
330 typedef 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 
337 typedef 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 
346 typedef 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 
355 typedef 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 
365 typedef uint64_t ompt_hwid_t;
366 
367 typedef uint64_t ompt_wait_id_t;
368 
369 typedef 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 
377 typedef 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 
406 typedef uint64_t (*ompt_get_unique_id_t) (void);
407 
408 typedef uint64_t ompd_size_t;
409 
410 typedef uint64_t ompd_wait_id_t;
411 
412 typedef uint64_t ompd_addr_t;
413 typedef int64_t  ompd_word_t;
414 typedef uint64_t ompd_seg_t;
415 
416 typedef uint64_t ompd_device_t;
417 
418 typedef uint64_t ompd_thread_id_t;
419 
420 typedef 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 
429 typedef uint64_t ompd_icv_id_t;
430 
431 typedef 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 
445 typedef void (*ompt_interface_fn_t) (void);
446 
447 typedef ompt_interface_fn_t (*ompt_function_lookup_t) (
448   const char *interface_function_name
449 );
450 
451 typedef union ompt_data_t {
452   uint64_t value;
453   void *ptr;
454 } ompt_data_t;
455 
456 typedef 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 
463 typedef void (*ompt_callback_t) (void);
464 
465 typedef void ompt_device_t;
466 
467 typedef void ompt_buffer_t;
468 
469 typedef void (*ompt_callback_buffer_request_t) (
470   int device_num,
471   ompt_buffer_t **buffer,
472   size_t *bytes
473 );
474 
475 typedef 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 
483 typedef void (*ompt_finalize_t) (
484   ompt_data_t *tool_data
485 );
486 
487 typedef int (*ompt_initialize_t) (
488   ompt_function_lookup_t lookup,
489   int initial_device_num,
490   ompt_data_t *tool_data
491 );
492 
493 typedef 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 
499 typedef 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 
507 typedef struct ompt_dependence_t {
508   ompt_data_t variable;
509   ompt_dependence_type_t dependence_type;
510 } ompt_dependence_t;
511 
512 typedef int (*ompt_enumerate_states_t) (
513   int current_state,
514   int *next_state,
515   const char **next_state_name
516 );
517 
518 typedef int (*ompt_enumerate_mutex_impls_t) (
519   int current_impl,
520   int *next_impl,
521   const char **next_impl_name
522 );
523 
524 typedef ompt_set_result_t (*ompt_set_callback_t) (
525   ompt_callbacks_t event,
526   ompt_callback_t callback
527 );
528 
529 typedef int (*ompt_get_callback_t) (
530   ompt_callbacks_t event,
531   ompt_callback_t *callback
532 );
533 
534 typedef ompt_data_t *(*ompt_get_thread_data_t) (void);
535 
536 typedef int (*ompt_get_num_procs_t) (void);
537 
538 typedef int (*ompt_get_num_places_t) (void);
539 
540 typedef int (*ompt_get_place_proc_ids_t) (
541   int place_num,
542   int ids_size,
543   int *ids
544 );
545 
546 typedef int (*ompt_get_place_num_t) (void);
547 
548 typedef int (*ompt_get_partition_place_nums_t) (
549   int place_nums_size,
550   int *place_nums
551 );
552 
553 typedef int (*ompt_get_proc_id_t) (void);
554 
555 typedef int (*ompt_get_state_t) (
556   ompt_wait_id_t *wait_id
557 );
558 
559 typedef int (*ompt_get_parallel_info_t) (
560   int ancestor_level,
561   ompt_data_t **parallel_data,
562   int *team_size
563 );
564 
565 typedef 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 
574 typedef int (*ompt_get_task_memory_t)(
575   void **addr,
576   size_t *size,
577   int block
578 );
579 
580 typedef 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 
586 typedef int (*ompt_get_num_devices_t) (void);
587 
588 typedef void (*ompt_finalize_tool_t) (void);
589 
590 typedef int (*ompt_get_device_num_procs_t) (
591   ompt_device_t *device
592 );
593 
594 typedef ompt_device_time_t (*ompt_get_device_time_t) (
595   ompt_device_t *device
596 );
597 
598 typedef double (*ompt_translate_time_t) (
599   ompt_device_t *device,
600   ompt_device_time_t time
601 );
602 
603 typedef ompt_set_result_t (*ompt_set_trace_ompt_t) (
604   ompt_device_t *device,
605   unsigned int enable,
606   unsigned int etype
607 );
608 
609 typedef ompt_set_result_t (*ompt_set_trace_native_t) (
610   ompt_device_t *device,
611   int enable,
612   int flags
613 );
614 
615 typedef 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 
621 typedef int (*ompt_pause_trace_t) (
622   ompt_device_t *device,
623   int begin_pause
624 );
625 
626 typedef int (*ompt_flush_trace_t) (
627   ompt_device_t *device
628 );
629 
630 typedef int (*ompt_stop_trace_t) (
631   ompt_device_t *device
632 );
633 
634 typedef 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 
642 typedef ompt_record_t (*ompt_get_record_type_t) (
643   ompt_buffer_t *buffer,
644   ompt_buffer_cursor_t current
645 );
646 
647 typedef 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 
653 typedef ompt_record_abstract_t *
654 (*ompt_get_record_abstract_t) (
655   void *native_record
656 );
657 
658 typedef void (*ompt_callback_thread_begin_t) (
659   ompt_thread_t thread_type,
660   ompt_data_t *thread_data
661 );
662 
663 typedef struct ompt_record_thread_begin_t {
664   ompt_thread_t thread_type;
665 } ompt_record_thread_begin_t;
666 
667 typedef void (*ompt_callback_thread_end_t) (
668   ompt_data_t *thread_data
669 );
670 
671 typedef 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 
680 typedef 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 
688 typedef 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 
695 typedef 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 
702 typedef 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 
711 typedef 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 
720 typedef 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 
727 typedef 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 
734 typedef 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 
743 typedef 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 
751 typedef void (*ompt_callback_dependences_t) (
752   ompt_data_t *task_data,
753   const ompt_dependence_t *deps,
754   int ndeps
755 );
756 
757 typedef 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 
763 typedef void (*ompt_callback_task_dependence_t) (
764   ompt_data_t *src_task_data,
765   ompt_data_t *sink_task_data
766 );
767 
768 typedef 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 
773 typedef 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 
779 typedef 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 
785 typedef 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 
794 typedef 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 
803 typedef 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 
810 typedef 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 
817 typedef 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 
825 typedef 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 
833 typedef 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 
841 typedef 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 
849 typedef void (*ompt_callback_mutex_t) (
850   ompt_mutex_t kind,
851   ompt_wait_id_t wait_id,
852   const void *codeptr_ra
853 );
854 
855 typedef 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 
861 typedef 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 
867 typedef 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 
873 typedef void (*ompt_callback_flush_t) (
874   ompt_data_t *thread_data,
875   const void *codeptr_ra
876 );
877 
878 typedef struct ompt_record_flush_t {
879   const void *codeptr_ra;
880 } ompt_record_flush_t;
881 
882 typedef void (*ompt_callback_cancel_t) (
883   ompt_data_t *task_data,
884   int flags,
885   const void *codeptr_ra
886 );
887 
888 typedef 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 
894 typedef 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 
902 typedef void (*ompt_callback_device_finalize_t) (
903   int device_num
904 );
905 
906 typedef 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 
917 typedef void (*ompt_callback_device_unload_t) (
918   int device_num,
919   uint64_t module_id
920 );
921 
922 typedef 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 
934 typedef 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 
946 typedef 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 
955 typedef 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 
964 typedef 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 
974 typedef 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 
984 typedef 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 
990 typedef 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 
997 typedef int (*ompt_callback_control_tool_t) (
998   uint64_t command,
999   uint64_t modifier,
1000   void *arg,
1001   const void *codeptr_ra
1002 );
1003 
1004 typedef 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 
1010 typedef struct ompd_address_t {
1011   ompd_seg_t segment;
1012   ompd_addr_t address;
1013 } ompd_address_t;
1014 
1015 typedef struct ompd_frame_info_t {
1016   ompd_address_t frame_address;
1017   ompd_word_t frame_flag;
1018 } ompd_frame_info_t;
1019 
1020 typedef struct _ompd_aspace_handle ompd_address_space_handle_t;
1021 typedef struct _ompd_thread_handle ompd_thread_handle_t;
1022 typedef struct _ompd_parallel_handle ompd_parallel_handle_t;
1023 typedef struct _ompd_task_handle ompd_task_handle_t;
1024 
1025 typedef struct _ompd_aspace_cont ompd_address_space_context_t;
1026 typedef struct _ompd_thread_cont ompd_thread_context_t;
1027 
1028 typedef 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 
1037 typedef 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 
1068 typedef 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