Dynamic Load Balance 3.7.0
ompt-multiplex.h
Go to the documentation of this file.
1/*********************************************************************************/
2/* Copyright 2009-2021 Barcelona Supercomputing Center */
3/* */
4/* This file is part of the DLB library. */
5/* */
6/* DLB is free software: you can redistribute it and/or modify */
7/* it under the terms of the GNU Lesser General Public License as published by */
8/* the Free Software Foundation, either version 3 of the License, or */
9/* (at your option) any later version. */
10/* */
11/* DLB is distributed in the hope that it will be useful, */
12/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
13/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
14/* GNU Lesser General Public License for more details. */
15/* */
16/* You should have received a copy of the GNU Lesser General Public License */
17/* along with DLB. If not, see <https://www.gnu.org/licenses/>. */
18/*********************************************************************************/
19
20//===--- ompt-multiplex.h - header-only multiplexing of OMPT tools -- C -*-===//
21//
22// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
23// See https://llvm.org/LICENSE.txt for license information.
24// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
25//
26//===----------------------------------------------------------------------===//
27//
28// This header file enables an OMPT tool to load another OMPT tool and
29// automatically forwards OMPT event-callbacks to the nested tool.
30//
31// For details see openmp/tools/multiplex/README.md
32//
33//===----------------------------------------------------------------------===//
34
35#ifndef OMPT_MULTIPLEX_H
36#define OMPT_MULTIPLEX_H
37
39#include "support/dlb_common.h"
40
41#ifndef _GNU_SOURCE
42#define _GNU_SOURCE
43#endif
44#include <dlfcn.h>
45#include <errno.h>
46#ifdef HAVE_EXECINFO_H
47#include <execinfo.h>
48#endif
49#include <inttypes.h>
50/* #include <omp-tools.h> */
51/* #include <omp.h> */
52#include <stdio.h>
53#include <string.h>
54#include <stdlib.h>
55
56static ompt_set_callback_t ompt_multiplex_set_callback;
57static ompt_get_task_info_t ompt_multiplex_get_task_info;
58static ompt_get_thread_data_t ompt_multiplex_get_thread_data;
59static ompt_get_parallel_info_t ompt_multiplex_get_parallel_info;
60
61// If OMPT_MULTIPLEX_TOOL_NAME is defined, use the tool name as prefix
62// contains name of the environment var in which the tool path is specified
63// for TOOL_LIBRARIES and VERBOSE_INIT variables. Only overwrite, if
64// they are not explicitly defined.
65#ifdef OMPT_MULTIPLEX_TOOL_NAME
66#ifndef CLIENT_TOOL_LIBRARIES_VAR
67#define CLIENT_TOOL_LIBRARIES_VAR OMPT_MULTIPLEX_TOOL_NAME "_TOOL_LIBRARIES"
68#endif
69#ifndef CLIENT_TOOL_VERBOSE_INIT_VAR
70#define CLIENT_TOOL_VERBOSE_INIT_VAR \
71 OMPT_MULTIPLEX_TOOL_NAME "_TOOL_VERBOSE_INIT"
72#endif
73#endif
74
75// If CLIENT_TOOL_VERBOSE_INIT_VAR is still not defined, use the OMPT
76// env var.
77#ifndef CLIENT_TOOL_VERBOSE_INIT_VAR
78#warning CLIENT_TOOL_VERBOSE_INIT_VAR redefined to OMP_TOOL_VERBOSE_INIT
79#define CLIENT_TOOL_VERBOSE_INIT_VAR "OMP_TOOL_VERBOSE_INIT"
80#endif
81
82// contains name of the environment var in which the tool path is specified
83#ifndef CLIENT_TOOL_LIBRARIES_VAR
84#error CLIENT_TOOL_LIBRARIES_VAR should be defined before including of ompt-multiplex.h
85#endif
86
87#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA) && \
88 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA)
89#error OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA must be set if OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA is set
90#endif
91
92#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA) && \
93 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA)
94#error OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA must be set if OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA is set
95#endif
96
97#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA) && \
98 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA)
99#error OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA must be set if OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA is set
100#endif
101
102#define OMPT_API_ROUTINE static
103
104#ifndef OMPT_STR_MATCH
105#define OMPT_STR_MATCH(haystack, needle) (!strcasecmp(haystack, needle))
106#endif
107
108// prints for an enabled OMP_TOOL_VERBOSE_INIT.
109// In the future a prefix could be added in the first define, the second define
110// omits the prefix to allow for continued lines. Example: "PREFIX: Start
111// tool... Success." instead of "PREFIX: Start tool... PREFIX: Success."
112#define OMPT_VERBOSE_INIT_PRINT(...) \
113 if (verbose_init) \
114 fprintf(verbose_file, __VA_ARGS__)
115#define OMPT_VERBOSE_INIT_CONTINUED_PRINT(...) \
116 if (verbose_init) \
117 fprintf(verbose_file, __VA_ARGS__)
118
119static FILE *verbose_file;
120static int verbose_init;
121
123 const char *ompt_env_verbose_init = getenv(CLIENT_TOOL_VERBOSE_INIT_VAR);
124 // possible options: disabled | stdout | stderr | <filename>
125 // if set, not empty and not disabled -> prepare for logging
126 if (ompt_env_verbose_init && strcmp(ompt_env_verbose_init, "") &&
127 !OMPT_STR_MATCH(ompt_env_verbose_init, "disabled")) {
128 verbose_init = 1;
129 if (OMPT_STR_MATCH(ompt_env_verbose_init, "STDERR"))
130 verbose_file = stderr;
131 else if (OMPT_STR_MATCH(ompt_env_verbose_init, "STDOUT"))
132 verbose_file = stdout;
133 else if (!OMPT_STR_MATCH(ompt_env_verbose_init,
134 getenv("OMP_TOOL_VERBOSE_INIT")))
135 verbose_file = fopen(ompt_env_verbose_init, "w");
136 else {
137 verbose_init = 0;
138 printf("Multiplex: Can not open file defined in OMP_TOOL_VERBOSE_INIT "
139 "twice.");
140 }
141 } else
142 verbose_init = 0;
143}
144
145#define OMPT_LOAD_CLIENT_FOREACH_OMPT_EVENT(macro) \
146 macro(callback_thread_begin, ompt_callback_thread_begin_t, 1); \
147 macro(callback_thread_end, ompt_callback_thread_end_t, 2); \
148 macro(callback_parallel_begin, ompt_callback_parallel_begin_t, 3); \
149 macro(callback_parallel_end, ompt_callback_parallel_end_t, 4); \
150 macro(callback_task_create, ompt_callback_task_create_t, 5); \
151 macro(callback_task_schedule, ompt_callback_task_schedule_t, 6); \
152 macro(callback_implicit_task, ompt_callback_implicit_task_t, 7); \
153 macro(callback_target, ompt_callback_target_t, 8); \
154 macro(callback_target_data_op, ompt_callback_target_data_op_t, 9); \
155 macro(callback_target_submit, ompt_callback_target_submit_t, 10); \
156 macro(callback_control_tool, ompt_callback_control_tool_t, 11); \
157 macro(callback_device_initialize, ompt_callback_device_initialize_t, 12); \
158 macro(callback_device_finalize, ompt_callback_device_finalize_t, 13); \
159 macro(callback_device_load, ompt_callback_device_load_t, 14); \
160 macro(callback_device_unload, ompt_callback_device_unload_t, 15); \
161 macro(callback_sync_region_wait, ompt_callback_sync_region_t, 16); \
162 macro(callback_mutex_released, ompt_callback_mutex_t, 17); \
163 macro(callback_dependences, ompt_callback_dependences_t, 18); \
164 macro(callback_task_dependence, ompt_callback_task_dependence_t, 19); \
165 macro(callback_work, ompt_callback_work_t, 20); \
166 macro(callback_masked, ompt_callback_masked_t, 21); \
167 macro(callback_target_map, ompt_callback_target_map_t, 22); \
168 macro(callback_sync_region, ompt_callback_sync_region_t, 23); \
169 macro(callback_lock_init, ompt_callback_mutex_acquire_t, 24); \
170 macro(callback_lock_destroy, ompt_callback_mutex_t, 25); \
171 macro(callback_mutex_acquire, ompt_callback_mutex_acquire_t, 26); \
172 macro(callback_mutex_acquired, ompt_callback_mutex_t, 27); \
173 macro(callback_nest_lock, ompt_callback_nest_lock_t, 28); \
174 macro(callback_flush, ompt_callback_flush_t, 29); \
175 macro(callback_cancel, ompt_callback_cancel_t, 30); \
176 macro(callback_reduction, ompt_callback_sync_region_t, 31); \
177 macro(callback_dispatch, ompt_callback_dispatch_t, 32); \
178 macro(callback_thread_role_shift, ompt_callback_thread_role_shift_t, 38);
179
180typedef struct ompt_multiplex_callbacks_s {
181#define ompt_event_macro(event, callback, eventid) callback ompt_##event
182
184
185#undef ompt_event_macro
187
188typedef struct ompt_multiplex_callback_implementation_status_s {
189#define ompt_event_macro(event, callback, eventid) int ompt_##event
190
192
193#undef ompt_event_macro
195
203
204typedef struct ompt_multiplex_data_pair_s {
208
209#if !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA) || \
210 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA) || \
211 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA)
213ompt_multiplex_allocate_data_pair(ompt_data_t *data_pointer) {
214 data_pointer->ptr = malloc(sizeof(ompt_multiplex_data_pair_t));
215 if (!data_pointer->ptr) {
216 printf("Malloc ERROR\n");
217 exit(-1);
218 }
219 ompt_multiplex_data_pair_t *data_pair =
220 (ompt_multiplex_data_pair_t *)data_pointer->ptr;
221 data_pair->own_data.ptr = NULL;
222 data_pair->client_data.ptr = NULL;
223 return data_pair;
224}
225
226static void ompt_multiplex_free_data_pair(ompt_data_t *data_pointer) {
227 free((*data_pointer).ptr);
228}
229
230static ompt_data_t *ompt_multiplex_get_own_ompt_data(ompt_data_t *data) {
231 if (!data)
232 return NULL;
233 if (!data->ptr)
234 return NULL;
235 ompt_multiplex_data_pair_t *data_pair =
237 return &(data_pair->own_data);
238}
239
240static ompt_data_t *ompt_multiplex_get_client_ompt_data(ompt_data_t *data) {
241 if (!data)
242 return NULL;
243 if (!data->ptr)
244 return NULL;
245 ompt_multiplex_data_pair_t *data_pair =
247 return &(data_pair->client_data);
248}
249#endif
252
253static ompt_data_t *ompt_multiplex_get_own_thread_data(ompt_data_t *data) {
254#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
255 return ompt_multiplex_get_own_ompt_data(data);
256#else
257 return data;
258#endif
259}
260
261static ompt_data_t *ompt_multiplex_get_own_parallel_data(ompt_data_t *data) {
262#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
263 return ompt_multiplex_get_own_ompt_data(data);
264#else
265 return data;
266#endif
267}
268
269static ompt_data_t *ompt_multiplex_get_own_task_data(ompt_data_t *data) {
270#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
271 return ompt_multiplex_get_own_ompt_data(data);
272#else
273 return data;
274#endif
275}
276
277static ompt_data_t *ompt_multiplex_get_client_thread_data(ompt_data_t *data) {
278#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
279 return ompt_multiplex_get_client_ompt_data(data);
280#else
281 return OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA(data);
282#endif
283}
284
285static ompt_data_t *ompt_multiplex_get_client_parallel_data(ompt_data_t *data) {
286#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
287 return ompt_multiplex_get_client_ompt_data(data);
288#else
289 return OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA(data);
290#endif
291}
292
293static ompt_data_t *ompt_multiplex_get_client_task_data(ompt_data_t *data) {
294#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
295 return ompt_multiplex_get_client_ompt_data(data);
296#else
297 return OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA(data);
298#endif
299}
300
301static void ompt_multiplex_callback_mutex_acquire(ompt_mutex_t kind,
302 unsigned int hint,
303 unsigned int impl,
304 ompt_wait_id_t wait_id,
305 const void *codeptr_ra) {
306 if (ompt_multiplex_own_callbacks.ompt_callback_mutex_acquire) {
307 ompt_multiplex_own_callbacks.ompt_callback_mutex_acquire(
308 kind, hint, impl, wait_id, codeptr_ra);
309 }
310 if (ompt_multiplex_client_callbacks.ompt_callback_mutex_acquire) {
311 ompt_multiplex_client_callbacks.ompt_callback_mutex_acquire(
312 kind, hint, impl, wait_id, codeptr_ra);
313 }
314}
315
316static void ompt_multiplex_callback_mutex_acquired(ompt_mutex_t kind,
317 ompt_wait_id_t wait_id,
318 const void *codeptr_ra) {
319 if (ompt_multiplex_own_callbacks.ompt_callback_mutex_acquired) {
320 ompt_multiplex_own_callbacks.ompt_callback_mutex_acquired(kind, wait_id,
321 codeptr_ra);
322 }
323 if (ompt_multiplex_client_callbacks.ompt_callback_mutex_acquired) {
324 ompt_multiplex_client_callbacks.ompt_callback_mutex_acquired(kind, wait_id,
325 codeptr_ra);
326 }
327}
328
329static void ompt_multiplex_callback_mutex_released(ompt_mutex_t kind,
330 ompt_wait_id_t wait_id,
331 const void *codeptr_ra) {
332 if (ompt_multiplex_own_callbacks.ompt_callback_mutex_released) {
333 ompt_multiplex_own_callbacks.ompt_callback_mutex_released(kind, wait_id,
334 codeptr_ra);
335 }
336 if (ompt_multiplex_client_callbacks.ompt_callback_mutex_released) {
337 ompt_multiplex_client_callbacks.ompt_callback_mutex_released(kind, wait_id,
338 codeptr_ra);
339 }
340}
341
342static void ompt_multiplex_callback_nest_lock(ompt_scope_endpoint_t endpoint,
343 ompt_wait_id_t wait_id,
344 const void *codeptr_ra) {
345 if (ompt_multiplex_own_callbacks.ompt_callback_nest_lock) {
346 ompt_multiplex_own_callbacks.ompt_callback_nest_lock(endpoint, wait_id,
347 codeptr_ra);
348 }
349 if (ompt_multiplex_client_callbacks.ompt_callback_nest_lock) {
350 ompt_multiplex_client_callbacks.ompt_callback_nest_lock(endpoint, wait_id,
351 codeptr_ra);
352 }
353}
354
355static void ompt_multiplex_callback_sync_region(ompt_sync_region_t kind,
356 ompt_scope_endpoint_t endpoint,
357 ompt_data_t *parallel_data,
358 ompt_data_t *task_data,
359 const void *codeptr_ra) {
360 if (ompt_multiplex_own_callbacks.ompt_callback_sync_region) {
361 ompt_multiplex_own_callbacks.ompt_callback_sync_region(
362 kind, endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
363 ompt_multiplex_get_own_task_data(task_data), codeptr_ra);
364 }
365 if (ompt_multiplex_client_callbacks.ompt_callback_sync_region) {
366 ompt_multiplex_client_callbacks.ompt_callback_sync_region(
367 kind, endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
368 ompt_multiplex_get_client_task_data(task_data), codeptr_ra);
369 }
370}
371
372static void ompt_multiplex_callback_sync_region_wait(
374 ompt_data_t *parallel_data, ompt_data_t *task_data,
375 const void *codeptr_ra) {
376 if (ompt_multiplex_own_callbacks.ompt_callback_sync_region_wait) {
377 ompt_multiplex_own_callbacks.ompt_callback_sync_region_wait(
378 kind, endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
379 ompt_multiplex_get_own_task_data(task_data), codeptr_ra);
380 }
381 if (ompt_multiplex_client_callbacks.ompt_callback_sync_region_wait) {
382 ompt_multiplex_client_callbacks.ompt_callback_sync_region_wait(
383 kind, endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
384 ompt_multiplex_get_client_task_data(task_data), codeptr_ra);
385 }
386}
387
388static void ompt_multiplex_callback_flush(ompt_data_t *thread_data,
389 const void *codeptr_ra) {
390 if (ompt_multiplex_own_callbacks.ompt_callback_flush) {
391 ompt_multiplex_own_callbacks.ompt_callback_flush(
392 ompt_multiplex_get_own_thread_data(thread_data), codeptr_ra);
393 }
394 if (ompt_multiplex_client_callbacks.ompt_callback_flush) {
395 ompt_multiplex_client_callbacks.ompt_callback_flush(
396 ompt_multiplex_get_client_thread_data(thread_data), codeptr_ra);
397 }
398}
399
400static void ompt_multiplex_callback_cancel(ompt_data_t *task_data, int flags,
401 const void *codeptr_ra) {
402 if (ompt_multiplex_own_callbacks.ompt_callback_cancel) {
403 ompt_multiplex_own_callbacks.ompt_callback_cancel(
404 ompt_multiplex_get_own_task_data(task_data), flags, codeptr_ra);
405 }
406 if (ompt_multiplex_client_callbacks.ompt_callback_cancel) {
407 ompt_multiplex_client_callbacks.ompt_callback_cancel(
408 ompt_multiplex_get_client_task_data(task_data), flags, codeptr_ra);
409 }
410}
411
412static void ompt_multiplex_callback_implicit_task(
413 ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data,
414 ompt_data_t *task_data, unsigned int team_size, unsigned int thread_num,
415 int flags) {
416 if (endpoint == ompt_scope_begin) {
417#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
418 ompt_multiplex_allocate_data_pair(task_data);
419#endif
420#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
421 if (flags & ompt_task_initial)
422 ompt_multiplex_allocate_data_pair(parallel_data);
423#endif
424 if (ompt_multiplex_own_callbacks.ompt_callback_implicit_task) {
425 ompt_multiplex_own_callbacks.ompt_callback_implicit_task(
426 endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
427 ompt_multiplex_get_own_task_data(task_data), team_size, thread_num,
428 flags);
429 }
430 if (ompt_multiplex_client_callbacks.ompt_callback_implicit_task) {
431 ompt_multiplex_client_callbacks.ompt_callback_implicit_task(
432 endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
433 ompt_multiplex_get_client_task_data(task_data), team_size, thread_num,
434 flags);
435 }
436 } else {
437// defines to make sure, callbacks are called in correct order depending on
438// defines set by the user
439#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA) || \
440 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA)
441 if (ompt_multiplex_own_callbacks.ompt_callback_implicit_task) {
442 ompt_multiplex_own_callbacks.ompt_callback_implicit_task(
443 endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
444 ompt_multiplex_get_own_task_data(task_data), team_size, thread_num,
445 flags);
446 }
447#endif
448
449 if (ompt_multiplex_client_callbacks.ompt_callback_implicit_task) {
450 ompt_multiplex_client_callbacks.ompt_callback_implicit_task(
451 endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
452 ompt_multiplex_get_client_task_data(task_data), team_size, thread_num,
453 flags);
454 }
455
456#if defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA) && \
457 !defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA)
458 if (ompt_multiplex_own_callbacks.ompt_callback_implicit_task) {
459 ompt_multiplex_own_callbacks.ompt_callback_implicit_task(
460 endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
461 ompt_multiplex_get_own_task_data(task_data), team_size, thread_num,
462 flags);
463 }
464#endif
465
466#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
467 ompt_multiplex_free_data_pair(task_data);
468#endif
469
470#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA)
471 if (flags & ompt_task_initial)
472 OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA(parallel_data);
473#endif
474#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA)
475 OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA(task_data);
476#endif
477 }
478}
479
480static void ompt_multiplex_callback_lock_init(ompt_mutex_t kind,
481 unsigned int hint,
482 unsigned int impl,
483 ompt_wait_id_t wait_id,
484 const void *codeptr_ra) {
485 if (ompt_multiplex_own_callbacks.ompt_callback_lock_init) {
486 ompt_multiplex_own_callbacks.ompt_callback_lock_init(kind, hint, impl,
487 wait_id, codeptr_ra);
488 }
489 if (ompt_multiplex_client_callbacks.ompt_callback_lock_init) {
490 ompt_multiplex_client_callbacks.ompt_callback_lock_init(
491 kind, hint, impl, wait_id, codeptr_ra);
492 }
493}
494
495static void ompt_multiplex_callback_lock_destroy(ompt_mutex_t kind,
496 ompt_wait_id_t wait_id,
497 const void *codeptr_ra) {
498 if (ompt_multiplex_own_callbacks.ompt_callback_lock_destroy) {
499 ompt_multiplex_own_callbacks.ompt_callback_lock_destroy(kind, wait_id,
500 codeptr_ra);
501 }
502 if (ompt_multiplex_client_callbacks.ompt_callback_lock_destroy) {
503 ompt_multiplex_client_callbacks.ompt_callback_lock_destroy(kind, wait_id,
504 codeptr_ra);
505 }
506}
507
508static void ompt_multiplex_callback_work(ompt_work_t wstype,
509 ompt_scope_endpoint_t endpoint,
510 ompt_data_t *parallel_data,
511 ompt_data_t *task_data, uint64_t count,
512 const void *codeptr_ra) {
513 if (ompt_multiplex_own_callbacks.ompt_callback_work) {
514 ompt_multiplex_own_callbacks.ompt_callback_work(
515 wstype, endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
516 ompt_multiplex_get_own_task_data(task_data), count, codeptr_ra);
517 }
518 if (ompt_multiplex_client_callbacks.ompt_callback_work) {
519 ompt_multiplex_client_callbacks.ompt_callback_work(
520 wstype, endpoint,
521 ompt_multiplex_get_client_parallel_data(parallel_data),
522 ompt_multiplex_get_client_task_data(task_data), count, codeptr_ra);
523 }
524}
525
526static void ompt_multiplex_callback_masked(ompt_scope_endpoint_t endpoint,
527 ompt_data_t *parallel_data,
528 ompt_data_t *task_data,
529 const void *codeptr_ra) {
530 if (ompt_multiplex_own_callbacks.ompt_callback_masked) {
531 ompt_multiplex_own_callbacks.ompt_callback_masked(
532 endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
533 ompt_multiplex_get_own_task_data(task_data), codeptr_ra);
534 }
535 if (ompt_multiplex_client_callbacks.ompt_callback_masked) {
536 ompt_multiplex_client_callbacks.ompt_callback_masked(
537 endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
538 ompt_multiplex_get_client_task_data(task_data), codeptr_ra);
539 }
540}
541
542static void ompt_multiplex_callback_thread_role_shift(ompt_data_t *thread_data,
543 ompt_role_t prior_role,
544 ompt_role_t next_role) {
545 if (ompt_multiplex_own_callbacks.ompt_callback_thread_role_shift) {
546 ompt_multiplex_own_callbacks.ompt_callback_thread_role_shift(
547 ompt_multiplex_get_own_thread_data(thread_data), prior_role, next_role);
548 }
549 if (ompt_multiplex_client_callbacks.ompt_callback_thread_role_shift) {
550 ompt_multiplex_client_callbacks.ompt_callback_thread_role_shift(
551 ompt_multiplex_get_client_thread_data(thread_data), prior_role, next_role);
552 }
553}
554
555static void ompt_multiplex_callback_parallel_begin(
556 ompt_data_t *parent_task_data, const ompt_frame_t *parent_task_frame,
557 ompt_data_t *parallel_data, uint32_t requested_team_size, int flag,
558 const void *codeptr_ra) {
559#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
560 ompt_multiplex_allocate_data_pair(parallel_data);
561#endif
562 if (ompt_multiplex_own_callbacks.ompt_callback_parallel_begin) {
563 ompt_multiplex_own_callbacks.ompt_callback_parallel_begin(
564 ompt_multiplex_get_own_task_data(parent_task_data), parent_task_frame,
565 ompt_multiplex_get_own_parallel_data(parallel_data),
566 requested_team_size, flag, codeptr_ra);
567 }
568 if (ompt_multiplex_client_callbacks.ompt_callback_parallel_begin) {
569 ompt_multiplex_client_callbacks.ompt_callback_parallel_begin(
570 ompt_multiplex_get_client_task_data(parent_task_data),
571 parent_task_frame,
572 ompt_multiplex_get_client_parallel_data(parallel_data),
573 requested_team_size, flag, codeptr_ra);
574 }
575}
576
577static void ompt_multiplex_callback_parallel_end(ompt_data_t *parallel_data,
578 ompt_data_t *task_data,
579 int flag,
580 const void *codeptr_ra) {
581// defines to make sure, callbacks are called in correct order depending on
582// defines set by the user
583#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA) || \
584 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA)
585 if (ompt_multiplex_own_callbacks.ompt_callback_parallel_end) {
586 ompt_multiplex_own_callbacks.ompt_callback_parallel_end(
587 ompt_multiplex_get_own_parallel_data(parallel_data),
588 ompt_multiplex_get_own_task_data(task_data), flag, codeptr_ra);
589 }
590#endif
591
592 if (ompt_multiplex_client_callbacks.ompt_callback_parallel_end) {
593 ompt_multiplex_client_callbacks.ompt_callback_parallel_end(
594 ompt_multiplex_get_client_parallel_data(parallel_data),
595 ompt_multiplex_get_client_task_data(task_data), flag, codeptr_ra);
596 }
597
598#if defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA) && \
599 !defined(OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA)
600 if (ompt_multiplex_own_callbacks.ompt_callback_parallel_end) {
601 ompt_multiplex_own_callbacks.ompt_callback_parallel_end(
602 ompt_multiplex_get_own_parallel_data(parallel_data),
603 ompt_multiplex_get_own_task_data(task_data), flag, codeptr_ra);
604 }
605#endif
606
607#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
608 ompt_multiplex_free_data_pair(parallel_data);
609#endif
610
611#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA)
612 OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA(parallel_data);
613#endif
614}
615
616static void ompt_multiplex_callback_task_create(
617 ompt_data_t *parent_task_data, const ompt_frame_t *parent_frame,
618 ompt_data_t *new_task_data, int type, int has_dependences,
619 const void *codeptr_ra) {
620#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
621 ompt_multiplex_allocate_data_pair(new_task_data);
622#endif
623
624#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
625 if (type & ompt_task_initial) {
626 ompt_data_t *parallel_data;
627 ompt_multiplex_get_parallel_info(0, &parallel_data, NULL);
628 ompt_multiplex_allocate_data_pair(parallel_data);
629 }
630#endif
631
632 if (ompt_multiplex_own_callbacks.ompt_callback_task_create) {
633 ompt_multiplex_own_callbacks.ompt_callback_task_create(
634 ompt_multiplex_get_own_task_data(parent_task_data), parent_frame,
635 ompt_multiplex_get_own_task_data(new_task_data), type, has_dependences,
636 codeptr_ra);
637 }
638 if (ompt_multiplex_client_callbacks.ompt_callback_task_create) {
639 ompt_multiplex_client_callbacks.ompt_callback_task_create(
640 ompt_multiplex_get_client_task_data(parent_task_data), parent_frame,
641 ompt_multiplex_get_client_task_data(new_task_data), type,
642 has_dependences, codeptr_ra);
643 }
644}
645
646static void
647ompt_multiplex_callback_task_schedule(ompt_data_t *first_task_data,
648 ompt_task_status_t prior_task_status,
649 ompt_data_t *second_task_data) {
650 if (prior_task_status != ompt_task_complete) {
651 if (ompt_multiplex_own_callbacks.ompt_callback_task_schedule) {
652 ompt_multiplex_own_callbacks.ompt_callback_task_schedule(
653 ompt_multiplex_get_own_task_data(first_task_data), prior_task_status,
654 ompt_multiplex_get_own_task_data(second_task_data));
655 }
656 if (ompt_multiplex_client_callbacks.ompt_callback_task_schedule) {
657 ompt_multiplex_client_callbacks.ompt_callback_task_schedule(
658 ompt_multiplex_get_client_task_data(first_task_data),
659 prior_task_status,
660 ompt_multiplex_get_client_task_data(second_task_data));
661 }
662 } else {
663// defines to make sure, callbacks are called in correct order depending on
664// defines set by the user
665#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA) || \
666 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA)
667 if (ompt_multiplex_own_callbacks.ompt_callback_task_schedule) {
668 ompt_multiplex_own_callbacks.ompt_callback_task_schedule(
669 ompt_multiplex_get_own_task_data(first_task_data), prior_task_status,
670 ompt_multiplex_get_own_task_data(second_task_data));
671 }
672#endif
673
674 if (ompt_multiplex_client_callbacks.ompt_callback_task_schedule) {
675 ompt_multiplex_client_callbacks.ompt_callback_task_schedule(
676 ompt_multiplex_get_client_task_data(first_task_data),
677 prior_task_status,
678 ompt_multiplex_get_client_task_data(second_task_data));
679 }
680
681#if defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA) && \
682 !defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA)
683 if (ompt_multiplex_own_callbacks.ompt_callback_task_schedule) {
684 ompt_multiplex_own_callbacks.ompt_callback_task_schedule(
685 ompt_multiplex_get_own_task_data(first_task_data), prior_task_status,
686 ompt_multiplex_get_own_task_data(second_task_data));
687 }
688#endif
689
690#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
691 ompt_multiplex_free_data_pair(first_task_data);
692#endif
693
694#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA)
695 OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA(first_task_data);
696#endif
697 }
698}
699
700static void ompt_multiplex_callback_dependences(ompt_data_t *task_data,
701 const ompt_dependence_t *deps,
702 int ndeps) {
703 if (ompt_multiplex_own_callbacks.ompt_callback_dependences) {
704 ompt_multiplex_own_callbacks.ompt_callback_dependences(
705 ompt_multiplex_get_own_task_data(task_data), deps, ndeps);
706 }
707 if (ompt_multiplex_client_callbacks.ompt_callback_dependences) {
708 ompt_multiplex_client_callbacks.ompt_callback_dependences(
709 ompt_multiplex_get_client_task_data(task_data), deps, ndeps);
710 }
711}
712
713static void
714ompt_multiplex_callback_task_dependence(ompt_data_t *first_task_data,
715 ompt_data_t *second_task_data) {
716 if (ompt_multiplex_own_callbacks.ompt_callback_task_dependence) {
717 ompt_multiplex_own_callbacks.ompt_callback_task_dependence(
718 ompt_multiplex_get_own_task_data(first_task_data),
719 ompt_multiplex_get_own_task_data(second_task_data));
720 }
721 if (ompt_multiplex_client_callbacks.ompt_callback_task_dependence) {
722 ompt_multiplex_client_callbacks.ompt_callback_task_dependence(
723 ompt_multiplex_get_client_task_data(first_task_data),
724 ompt_multiplex_get_client_task_data(second_task_data));
725 }
726}
727
728static void ompt_multiplex_callback_thread_begin(ompt_thread_t thread_type,
729 ompt_data_t *thread_data) {
730#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
731 ompt_multiplex_allocate_data_pair(thread_data);
732#endif
733 if (ompt_multiplex_own_callbacks.ompt_callback_thread_begin) {
734 ompt_multiplex_own_callbacks.ompt_callback_thread_begin(
735 thread_type, ompt_multiplex_get_own_thread_data(thread_data));
736 }
737 if (ompt_multiplex_client_callbacks.ompt_callback_thread_begin) {
738 ompt_multiplex_client_callbacks.ompt_callback_thread_begin(
739 thread_type, ompt_multiplex_get_client_thread_data(thread_data));
740 }
741}
742
743static void ompt_multiplex_callback_thread_end(ompt_data_t *thread_data) {
744// defines to make sure, callbacks are called in correct order depending on
745// defines set by the user
746#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA) || \
747 !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA)
748 if (ompt_multiplex_own_callbacks.ompt_callback_thread_end) {
749 ompt_multiplex_own_callbacks.ompt_callback_thread_end(
750 ompt_multiplex_get_own_thread_data(thread_data));
751 }
752#endif
753
754 if (ompt_multiplex_client_callbacks.ompt_callback_thread_end) {
755 ompt_multiplex_client_callbacks.ompt_callback_thread_end(
756 ompt_multiplex_get_client_thread_data(thread_data));
757 }
758
759#if defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA) && \
760 !defined(OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA)
761 if (ompt_multiplex_own_callbacks.ompt_callback_thread_end) {
762 ompt_multiplex_own_callbacks.ompt_callback_thread_end(
763 ompt_multiplex_get_own_thread_data(thread_data));
764 }
765#endif
766
767#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
768 ompt_multiplex_free_data_pair(thread_data);
769#endif
770
771#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA)
772 OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA(thread_data);
773#endif
774}
775
776static int ompt_multiplex_callback_control_tool(uint64_t command,
777 uint64_t modifier, void *arg,
778 const void *codeptr_ra) {
779 int ownRet = 0, clientRet = 0;
780 if (ompt_multiplex_own_callbacks.ompt_callback_control_tool) {
781 ownRet = ompt_multiplex_own_callbacks.ompt_callback_control_tool(
782 command, modifier, arg, codeptr_ra);
783 }
784 if (ompt_multiplex_client_callbacks.ompt_callback_control_tool) {
785 clientRet = ompt_multiplex_client_callbacks.ompt_callback_control_tool(
786 command, modifier, arg, codeptr_ra);
787 }
788 return ownRet < clientRet ? ownRet : clientRet;
789}
790
791static void ompt_multiplex_callback_target(
792 ompt_target_t kind, ompt_scope_endpoint_t endpoint, int device_num,
793 ompt_data_t *task_data, ompt_id_t target_id, const void *codeptr_ra) {
794 if (ompt_multiplex_own_callbacks.ompt_callback_target) {
795 ompt_multiplex_own_callbacks.ompt_callback_target(
796 kind, endpoint, device_num, ompt_multiplex_get_own_task_data(task_data),
797 target_id, codeptr_ra);
798 }
799 if (ompt_multiplex_client_callbacks.ompt_callback_target) {
800 ompt_multiplex_client_callbacks.ompt_callback_target(
801 kind, endpoint, device_num,
802 ompt_multiplex_get_client_task_data(task_data), target_id, codeptr_ra);
803 }
804}
805
806static void ompt_multiplex_callback_target_data_op(
807 ompt_id_t target_id, ompt_id_t host_op_id, ompt_target_data_op_t optype,
808 void *src_addr, int src_device_num, void *dest_addr, int dest_device_num,
809 size_t bytes, const void *codeptr_ra) {
810 if (ompt_multiplex_own_callbacks.ompt_callback_target_data_op) {
811 ompt_multiplex_own_callbacks.ompt_callback_target_data_op(
812 target_id, host_op_id, optype, src_addr, src_device_num, dest_addr,
813 dest_device_num, bytes, codeptr_ra);
814 }
815 if (ompt_multiplex_client_callbacks.ompt_callback_target_data_op) {
816 ompt_multiplex_client_callbacks.ompt_callback_target_data_op(
817 target_id, host_op_id, optype, src_addr, src_device_num, dest_addr,
818 dest_device_num, bytes, codeptr_ra);
819 }
820}
821
822static void
823ompt_multiplex_callback_target_submit(ompt_id_t target_id, ompt_id_t host_op_id,
824 unsigned int requested_num_teams) {
825 if (ompt_multiplex_own_callbacks.ompt_callback_target_submit) {
826 ompt_multiplex_own_callbacks.ompt_callback_target_submit(
827 target_id, host_op_id, requested_num_teams);
828 }
829 if (ompt_multiplex_client_callbacks.ompt_callback_target_submit) {
830 ompt_multiplex_client_callbacks.ompt_callback_target_submit(
831 target_id, host_op_id, requested_num_teams);
832 }
833}
834
835static void ompt_multiplex_callback_device_initialize(
836 int device_num, const char *type, ompt_device_t *device,
837 ompt_function_lookup_t lookup, const char *documentation) {
838 if (ompt_multiplex_own_callbacks.ompt_callback_device_initialize) {
839 ompt_multiplex_own_callbacks.ompt_callback_device_initialize(
840 device_num, type, device, lookup, documentation);
841 }
842 if (ompt_multiplex_client_callbacks.ompt_callback_device_initialize) {
843 ompt_multiplex_client_callbacks.ompt_callback_device_initialize(
844 device_num, type, device, lookup, documentation);
845 }
846}
847
848static void ompt_multiplex_callback_device_finalize(int device_num) {
849 if (ompt_multiplex_own_callbacks.ompt_callback_device_finalize) {
850 ompt_multiplex_own_callbacks.ompt_callback_device_finalize(device_num);
851 }
852 if (ompt_multiplex_client_callbacks.ompt_callback_device_finalize) {
853 ompt_multiplex_client_callbacks.ompt_callback_device_finalize(device_num);
854 }
855}
856
857static void
858ompt_multiplex_callback_device_load(int device_num, const char *filename,
859 int64_t offset_in_file, void *vma_in_file,
860 size_t bytes, void *host_addr,
861 void *device_addr, uint64_t module_id) {
862 if (ompt_multiplex_own_callbacks.ompt_callback_device_load) {
863 ompt_multiplex_own_callbacks.ompt_callback_device_load(
864 device_num, filename, offset_in_file, vma_in_file, bytes, host_addr,
865 device_addr, module_id);
866 }
867 if (ompt_multiplex_client_callbacks.ompt_callback_device_load) {
868 ompt_multiplex_client_callbacks.ompt_callback_device_load(
869 device_num, filename, offset_in_file, vma_in_file, bytes, host_addr,
870 device_addr, module_id);
871 }
872}
873
874static void ompt_multiplex_callback_device_unload(int device_num,
875 uint64_t module_id) {
876 if (ompt_multiplex_own_callbacks.ompt_callback_device_unload) {
877 ompt_multiplex_own_callbacks.ompt_callback_device_unload(device_num,
878 module_id);
879 }
880 if (ompt_multiplex_client_callbacks.ompt_callback_device_unload) {
881 ompt_multiplex_client_callbacks.ompt_callback_device_unload(device_num,
882 module_id);
883 }
884}
885
886static void
887ompt_multiplex_callback_target_map(ompt_id_t target_id, unsigned int nitems,
888 void **host_addr, void **device_addr,
889 size_t *bytes, unsigned int *mapping_flags,
890 const void *codeptr_ra) {
891 if (ompt_multiplex_own_callbacks.ompt_callback_target_map) {
892 ompt_multiplex_own_callbacks.ompt_callback_target_map(
893 target_id, nitems, host_addr, device_addr, bytes, mapping_flags,
894 codeptr_ra);
895 }
896 if (ompt_multiplex_client_callbacks.ompt_callback_target_map) {
897 ompt_multiplex_client_callbacks.ompt_callback_target_map(
898 target_id, nitems, host_addr, device_addr, bytes, mapping_flags,
899 codeptr_ra);
900 }
901}
902
903static void ompt_multiplex_callback_reduction(ompt_sync_region_t kind,
904 ompt_scope_endpoint_t endpoint,
905 ompt_data_t *parallel_data,
906 ompt_data_t *task_data,
907 const void *codeptr_ra) {
908 if (ompt_multiplex_own_callbacks.ompt_callback_reduction) {
909 ompt_multiplex_own_callbacks.ompt_callback_reduction(
910 kind, endpoint, ompt_multiplex_get_own_parallel_data(parallel_data),
911 ompt_multiplex_get_own_task_data(task_data), codeptr_ra);
912 }
913 if (ompt_multiplex_client_callbacks.ompt_callback_reduction) {
914 ompt_multiplex_client_callbacks.ompt_callback_reduction(
915 kind, endpoint, ompt_multiplex_get_client_parallel_data(parallel_data),
916 ompt_multiplex_get_client_task_data(task_data), codeptr_ra);
917 }
918}
919
920static void ompt_multiplex_callback_dispatch(ompt_data_t *parallel_data,
921 ompt_data_t *task_data,
922 ompt_dispatch_t kind,
923 ompt_data_t instance) {
924 if (ompt_multiplex_own_callbacks.ompt_callback_dispatch) {
925 ompt_multiplex_own_callbacks.ompt_callback_dispatch(
926 ompt_multiplex_get_own_parallel_data(parallel_data),
927 ompt_multiplex_get_own_task_data(task_data), kind, instance);
928 }
929 if (ompt_multiplex_client_callbacks.ompt_callback_dispatch) {
930 ompt_multiplex_client_callbacks.ompt_callback_dispatch(
931 ompt_multiplex_get_client_parallel_data(parallel_data),
932 ompt_multiplex_get_client_task_data(task_data), kind, instance);
933 }
934}
935
936// runtime entry functions
937
938int ompt_multiplex_own_get_task_info(int ancestor_level, int *type,
939 ompt_data_t **task_data,
940 ompt_frame_t **task_frame,
941 ompt_data_t **parallel_data,
942 int *thread_num) {
943 int ret = ompt_multiplex_get_task_info(ancestor_level, type, task_data,
944 task_frame, parallel_data, thread_num);
945
946#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
947 if (task_data)
948 *task_data = ompt_multiplex_get_own_ompt_data(*task_data);
949#endif
950#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
951 if (parallel_data)
952 *parallel_data = ompt_multiplex_get_own_ompt_data(*parallel_data);
953#endif
954 return ret;
955}
956
957int ompt_multiplex_client_get_task_info(int ancestor_level, int *type,
958 ompt_data_t **task_data,
959 ompt_frame_t **task_frame,
960 ompt_data_t **parallel_data,
961 int *thread_num) {
962 int ret = ompt_multiplex_get_task_info(ancestor_level, type, task_data,
963 task_frame, parallel_data, thread_num);
964
965 if (task_data)
966#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA
967 *task_data = ompt_multiplex_get_client_ompt_data(*task_data);
968#else
969 *task_data = OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA(*task_data);
970#endif
971
972 if (parallel_data)
973#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
974 *parallel_data = ompt_multiplex_get_client_ompt_data(*parallel_data);
975#else
976 *parallel_data =
977 OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA(*parallel_data);
978#endif
979 return ret;
980}
981
983 ompt_data_t *ret;
984#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
985 ret = ompt_multiplex_get_own_ompt_data(ompt_multiplex_get_thread_data());
986#else
987 ret = ompt_multiplex_get_thread_data();
988#endif
989 return ret;
990}
991
993 ompt_data_t *ret;
994#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA
995 ret = ompt_multiplex_get_client_ompt_data(ompt_multiplex_get_thread_data());
996#else
997 ret = OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA(
998 ompt_multiplex_get_thread_data());
999#endif
1000 return ret;
1001}
1002
1004 ompt_data_t **parallel_data,
1005 int *team_size) {
1006 int ret = ompt_multiplex_get_parallel_info(ancestor_level, parallel_data,
1007 team_size);
1008 if (parallel_data)
1009 *parallel_data = ompt_multiplex_get_own_parallel_data(*parallel_data);
1010 return ret;
1011}
1012
1014 ompt_data_t **parallel_data,
1015 int *team_size) {
1016 int ret = ompt_multiplex_get_parallel_info(ancestor_level, parallel_data,
1017 team_size);
1018 if (parallel_data)
1019#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA
1020 *parallel_data = ompt_multiplex_get_client_ompt_data(*parallel_data);
1021#else
1022 *parallel_data =
1023 OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA(*parallel_data);
1024#endif
1025 return ret;
1026}
1027
1029 ompt_callback_t callback) {
1030 switch (which) {
1031
1032#define ompt_event_macro(event_name, callback_type, event_id) \
1033 case ompt_##event_name: \
1034 ompt_multiplex_own_callbacks.ompt_##event_name = (callback_type)callback; \
1035 if (ompt_multiplex_implementation_status.ompt_##event_name == -1) \
1036 return ompt_multiplex_implementation_status.ompt_##event_name = \
1037 ompt_multiplex_set_callback( \
1038 ompt_##event_name, \
1039 (ompt_callback_t)&ompt_multiplex_##event_name); \
1040 else \
1041 return ompt_multiplex_implementation_status.ompt_##event_name
1042
1044
1045#undef ompt_event_macro
1046
1047 default:
1048 return ompt_set_error;
1049 }
1050}
1051
1054 ompt_callback_t callback) {
1055 switch (which) {
1056
1057#define ompt_event_macro(event_name, callback_type, event_id) \
1058 case ompt_##event_name: \
1059 ompt_multiplex_client_callbacks.ompt_##event_name = \
1060 (callback_type)callback; \
1061 if (ompt_multiplex_implementation_status.ompt_##event_name == -1) \
1062 return ompt_multiplex_implementation_status.ompt_##event_name = \
1063 ompt_multiplex_set_callback( \
1064 ompt_##event_name, \
1065 (ompt_callback_t)&ompt_multiplex_##event_name); \
1066 else \
1067 return ompt_multiplex_implementation_status.ompt_##event_name
1068
1070
1071#undef ompt_event_macro
1072
1073 default:
1074 return ompt_set_error;
1075 }
1076}
1077
1079 if (!strcmp(name, "ompt_set_callback"))
1081 else if (!strcmp(name, "ompt_get_task_info"))
1083 else if (!strcmp(name, "ompt_get_thread_data"))
1085 else if (!strcmp(name, "ompt_get_parallel_info"))
1087 else
1088 return ompt_multiplex_lookup_function(name);
1089}
1090
1092 if (!strcmp(name, "ompt_set_callback"))
1094 else if (!strcmp(name, "ompt_get_task_info"))
1096 else if (!strcmp(name, "ompt_get_thread_data"))
1098 else if (!strcmp(name, "ompt_get_parallel_info"))
1100 else
1101 return ompt_multiplex_lookup_function(name);
1102}
1103
1105 int initial_device_num, ompt_data_t *data) {
1107 ompt_multiplex_set_callback =
1108 (ompt_set_callback_t)lookup("ompt_set_callback");
1109 ompt_multiplex_get_task_info =
1110 (ompt_get_task_info_t)lookup("ompt_get_task_info");
1111 ompt_multiplex_get_thread_data =
1112 (ompt_get_thread_data_t)lookup("ompt_get_thread_data");
1113 ompt_multiplex_get_parallel_info =
1114 (ompt_get_parallel_info_t)lookup("ompt_get_parallel_info");
1115
1116 // initialize ompt_multiplex_implementation_status
1117#define ompt_event_macro(event_name, callback_type, event_id) \
1118 ompt_multiplex_implementation_status.ompt_##event_name = -1
1119
1121
1122#undef ompt_event_macro
1123
1124 int ownRet = ompt_multiplex_own_fns->initialize(
1125 ompt_multiplex_own_lookup, initial_device_num,
1127 int clientRet = 0;
1130 ompt_multiplex_client_lookup, initial_device_num,
1132
1133 return ownRet > clientRet ? ownRet : clientRet;
1134}
1135
1141}
1142
1143#ifdef __cplusplus
1144extern "C" {
1145#endif
1146
1147// forward declaration because of name shifting from ompt_start_tool
1148// to ompt_multiplex_own_start_tool below
1150ompt_multiplex_own_start_tool(unsigned int omp_version,
1151 const char *runtime_version);
1152
1155 const char *runtime_version) {
1158 "----- START LOGGING OF CLIENT TOOL REGISTRATION -----\n");
1159 // try loading client tool
1160 OMPT_VERBOSE_INIT_PRINT("Search for " CLIENT_TOOL_LIBRARIES_VAR
1161 " env var... ");
1162 const char *tool_libs = getenv(CLIENT_TOOL_LIBRARIES_VAR);
1163 if (tool_libs) {
1165 OMPT_VERBOSE_INIT_PRINT(CLIENT_TOOL_LIBRARIES_VAR " = %s\n", tool_libs);
1166 // copy environement variable
1167 char *tool_libs_buffer = strdup(tool_libs);
1168 if (!tool_libs_buffer) {
1169 printf("strdup Error (%i)\n", errno);
1170 exit(-1);
1171 }
1172
1173 size_t progress = 0;
1174 // Reset dl-error
1175 dlerror();
1176 while (progress < strlen(tool_libs)) {
1178 ompt_start_tool_result_t *(*client_start_tool)(unsigned int,
1179 const char *) = NULL;
1181 "Look for candidates within " CLIENT_TOOL_LIBRARIES_VAR "...\n");
1182 size_t tmp_progress = progress;
1183 while (tmp_progress < strlen(tool_libs) &&
1184 tool_libs_buffer[tmp_progress] != ':')
1185 tmp_progress++;
1186 if (tmp_progress < strlen(tool_libs))
1187 tool_libs_buffer[tmp_progress] = 0;
1188 OMPT_VERBOSE_INIT_PRINT("Try out one candidate...\n");
1189 char *fname = tool_libs_buffer + progress;
1190 OMPT_VERBOSE_INIT_PRINT("Opening %s... ", fname);
1191 void *h = dlopen(fname, RTLD_LAZY);
1192 if (h) {
1193 client_start_tool =
1194 (ompt_start_tool_result_t * (*)(unsigned int, const char *))
1195 dlsym(h, "ompt_start_tool");
1196 if (client_start_tool &&
1198 (*client_start_tool)(omp_version, runtime_version))) {
1201 "Tool was started and is using the OMPT interface.\n");
1202 break;
1203 } else {
1205 "Failed: client_start_tool = %p, ompt_multiplex_client_fns = %p, "
1206 "%s\n",
1207 client_start_tool, ompt_multiplex_client_fns, dlerror());
1208 }
1209 } else {
1210 OMPT_VERBOSE_INIT_CONTINUED_PRINT("Failed: %s\n", dlerror());
1211 printf("Loading %s from %s failed with: %s\n",
1212 tool_libs_buffer + progress, CLIENT_TOOL_LIBRARIES_VAR,
1213 dlerror());
1214 }
1215 progress = tmp_progress + 1;
1216 }
1217 free(tool_libs_buffer);
1219 "----- END LOGGING OF CLIENT TOOL REGISTRATION -----\n");
1220 }
1221 // load own tool
1223 "----- START LOGGING OF OWN TOOL REGISTRATION -----\n");
1225 ompt_multiplex_own_start_tool(omp_version, runtime_version);
1226 OMPT_VERBOSE_INIT_PRINT("ompt_multiplex_own_fns = %p\n",
1228 OMPT_VERBOSE_INIT_PRINT("----- END LOGGING OF OWN TOOL REGISTRATION -----\n");
1229 // return multiplexed versions
1230 static ompt_start_tool_result_t ompt_start_tool_result = {
1232 if (verbose_init && verbose_file != stderr && verbose_file != stdout)
1233 fclose(verbose_file);
1238 return &ompt_start_tool_result;
1239}
1240#ifdef __cplusplus
1241}
1242#endif
1243
1244// We rename the ompt_start_tool function of the OMPT tool and call the
1245// renamed function from the ompt_start_tool function defined above.
1246#define ompt_start_tool ompt_multiplex_own_start_tool
1247
1248#endif /* OMPT_MULTIPLEX_H */
#define DLB_EXPORT_SYMBOL
Definition: dlb_common.h:39
ompt_set_result_t(* ompt_set_callback_t)(ompt_callbacks_t event, ompt_callback_t callback)
Definition: omp-tools.h:594
ompt_task_status_t
Definition: omp-tools.h:370
@ ompt_task_complete
Definition: omp-tools.h:371
void(* ompt_interface_fn_t)(void)
Definition: omp-tools.h:515
ompt_data_t *(* ompt_get_thread_data_t)(void)
Definition: omp-tools.h:604
void(* ompt_callback_t)(void)
Definition: omp-tools.h:533
ompt_interface_fn_t(* ompt_function_lookup_t)(const char *interface_function_name)
Definition: omp-tools.h:517
ompt_mutex_t
Definition: omp-tools.h:336
@ ompt_task_initial
Definition: omp-tools.h:358
ompt_target_data_op_t
Definition: omp-tools.h:312
ompt_sync_region_t
Definition: omp-tools.h:299
ompt_work_t
Definition: omp-tools.h:325
uint64_t ompt_id_t
Definition: omp-tools.h:275
int(* ompt_get_parallel_info_t)(int ancestor_level, ompt_data_t **parallel_data, int *team_size)
Definition: omp-tools.h:629
ompt_dispatch_t
Definition: omp-tools.h:294
ompt_callbacks_t
Definition: omp-tools.h:207
uint64_t ompt_wait_id_t
Definition: omp-tools.h:435
ompt_scope_endpoint_t
Definition: omp-tools.h:288
@ ompt_scope_begin
Definition: omp-tools.h:289
ompt_target_t
Definition: omp-tools.h:381
@ ompt_set_error
Definition: omp-tools.h:267
int(* ompt_get_task_info_t)(int ancestor_level, int *flags, ompt_data_t **task_data, ompt_frame_t **task_frame, ompt_data_t **parallel_data, int *thread_num)
Definition: omp-tools.h:635
void ompt_device_t
Definition: omp-tools.h:535
ompt_role_t
Definition: omp-tools.h:255
ompt_thread_t
Definition: omp-tools.h:281
OMPT_API_ROUTINE int ompt_multiplex_own_set_callback(ompt_callbacks_t which, ompt_callback_t callback)
Definition: ompt-multiplex.h:1028
#define OMPT_VERBOSE_INIT_CONTINUED_PRINT(...)
Definition: ompt-multiplex.h:115
#define ompt_event_macro(event, callback, eventid)
Definition: ompt-multiplex.h:189
#define OMPT_STR_MATCH(haystack, needle)
Definition: ompt-multiplex.h:105
ompt_multiplex_callback_implementation_status_t ompt_multiplex_implementation_status
Definition: ompt-multiplex.h:202
#define ompt_start_tool
Definition: ompt-multiplex.h:1246
#define OMPT_VERBOSE_INIT_PRINT(...)
Definition: ompt-multiplex.h:112
ompt_interface_fn_t ompt_multiplex_client_lookup(const char *name)
Definition: ompt-multiplex.h:1091
int ompt_multiplex_own_get_parallel_info(int ancestor_level, ompt_data_t **parallel_data, int *team_size)
Definition: ompt-multiplex.h:1003
ompt_interface_fn_t ompt_multiplex_own_lookup(const char *name)
Definition: ompt-multiplex.h:1078
OMPT_API_ROUTINE int ompt_multiplex_client_set_callback(ompt_callbacks_t which, ompt_callback_t callback)
Definition: ompt-multiplex.h:1053
#define OMPT_LOAD_CLIENT_FOREACH_OMPT_EVENT(macro)
Definition: ompt-multiplex.h:145
ompt_data_t * ompt_multiplex_own_get_thread_data()
Definition: ompt-multiplex.h:982
ompt_function_lookup_t ompt_multiplex_lookup_function
Definition: ompt-multiplex.h:198
ompt_multiplex_callbacks_t ompt_multiplex_own_callbacks
Definition: ompt-multiplex.h:199
#define OMPT_API_ROUTINE
Definition: ompt-multiplex.h:102
void ompt_multiplex_finalize(ompt_data_t *fns)
Definition: ompt-multiplex.h:1136
ompt_start_tool_result_t * ompt_multiplex_own_fns
Definition: ompt-multiplex.h:196
int ompt_multiplex_own_get_task_info(int ancestor_level, int *type, ompt_data_t **task_data, ompt_frame_t **task_frame, ompt_data_t **parallel_data, int *thread_num)
Definition: ompt-multiplex.h:938
#define CLIENT_TOOL_VERBOSE_INIT_VAR
Definition: ompt-multiplex.h:79
int ompt_multiplex_initialize(ompt_function_lookup_t lookup, int initial_device_num, ompt_data_t *data)
Definition: ompt-multiplex.h:1104
int ompt_multiplex_client_get_parallel_info(int ancestor_level, ompt_data_t **parallel_data, int *team_size)
Definition: ompt-multiplex.h:1013
ompt_multiplex_callbacks_t ompt_multiplex_client_callbacks
Definition: ompt-multiplex.h:200
ompt_start_tool_result_t * ompt_multiplex_client_fns
Definition: ompt-multiplex.h:197
int ompt_multiplex_client_get_task_info(int ancestor_level, int *type, ompt_data_t **task_data, ompt_frame_t **task_frame, ompt_data_t **parallel_data, int *thread_num)
Definition: ompt-multiplex.h:957
void setup_verbose_init()
Definition: ompt-multiplex.h:122
ompt_data_t * ompt_multiplex_client_get_thread_data()
Definition: ompt-multiplex.h:992
Definition: omp-tools.h:577
Definition: omp-tools.h:526
Definition: ompt-multiplex.h:188
Definition: ompt-multiplex.h:180
Definition: ompt-multiplex.h:204
ompt_data_t own_data
Definition: ompt-multiplex.h:205
ompt_data_t client_data
Definition: ompt-multiplex.h:206
Definition: omp-tools.h:563
ompt_data_t tool_data
Definition: omp-tools.h:566
ompt_initialize_t initialize
Definition: omp-tools.h:564
ompt_finalize_t finalize
Definition: omp-tools.h:565
Definition: omp-tools.h:521
void * ptr
Definition: omp-tools.h:523