#include "omp-tools.h" #define ompt_start_tool disable_ompt_start_tool #define _TOOL_PREFIX " _first_tool:" #include "callback.h" #undef _TOOL_PREFIX #undef ompt_start_tool #define CLIENT_TOOL_LIBRARIES_VAR "CUSTOM_DATA_STORAGE_TOOL_LIBRARIES" static ompt_data_t *custom_get_client_ompt_data(ompt_data_t *); static void free_data_pair(ompt_data_t *); #define OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA custom_get_client_ompt_data #define OMPT_MULTIPLEX_CUSTOM_DELETE_THREAD_DATA free_data_pair #define OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_PARALLEL_DATA \ custom_get_client_ompt_data #define OMPT_MULTIPLEX_CUSTOM_DELETE_PARALLEL_DATA free_data_pair #define OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA custom_get_client_ompt_data #define OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA free_data_pair #include "ompt-multiplex.h" typedef struct custom_data_pair_s { ompt_data_t own_data; ompt_data_t client_data; } custom_data_pair_t; static ompt_data_t *custom_get_client_ompt_data(ompt_data_t *data) { if (data) return &(((custom_data_pair_t *)(data->ptr))->client_data); else return NULL; } static ompt_data_t *get_own_ompt_data(ompt_data_t *data) { if (data) return &(((custom_data_pair_t *)(data->ptr))->own_data); else return NULL; } static ompt_multiplex_data_pair_t * allocate_data_pair(ompt_data_t *data_pointer) { data_pointer->ptr = malloc(sizeof(ompt_multiplex_data_pair_t)); if (!data_pointer->ptr) { printf("Malloc ERROR\n"); exit(-1); } ompt_multiplex_data_pair_t *data_pair = (ompt_multiplex_data_pair_t *)data_pointer->ptr; data_pair->own_data.ptr = NULL; data_pair->client_data.ptr = NULL; return data_pair; } static void free_data_pair(ompt_data_t *data_pointer) { free((*data_pointer).ptr); } static void on_cds_ompt_callback_sync_region(ompt_sync_region_t kind, ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data, ompt_data_t *task_data, const void *codeptr_ra) { parallel_data = get_own_ompt_data(parallel_data); task_data = get_own_ompt_data(task_data); on_ompt_callback_sync_region(kind, endpoint, parallel_data, task_data, codeptr_ra); } static void on_cds_ompt_callback_sync_region_wait( ompt_sync_region_t kind, ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data, ompt_data_t *task_data, const void *codeptr_ra) { parallel_data = get_own_ompt_data(parallel_data); task_data = get_own_ompt_data(task_data); on_ompt_callback_sync_region_wait(kind, endpoint, parallel_data, task_data, codeptr_ra); } static void on_cds_ompt_callback_flush(ompt_data_t *thread_data, const void *codeptr_ra) { thread_data = get_own_ompt_data(thread_data); on_cds_ompt_callback_flush(thread_data, codeptr_ra); } static void on_cds_ompt_callback_cancel(ompt_data_t *task_data, int flags, const void *codeptr_ra) { task_data = get_own_ompt_data(task_data); on_ompt_callback_cancel(task_data, flags, codeptr_ra); } static void on_cds_ompt_callback_implicit_task(ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data, ompt_data_t *task_data, unsigned int team_size, unsigned int thread_num, int type) { if (endpoint == ompt_scope_begin && (type & ompt_task_initial)) { allocate_data_pair(parallel_data); } if (endpoint == ompt_scope_begin) { allocate_data_pair(task_data); } parallel_data = get_own_ompt_data(parallel_data); task_data = get_own_ompt_data(task_data); on_ompt_callback_implicit_task(endpoint, parallel_data, task_data, team_size, thread_num, type); } static void on_cds_ompt_callback_work(ompt_work_t wstype, ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data, ompt_data_t *task_data, uint64_t count, const void *codeptr_ra) { parallel_data = get_own_ompt_data(parallel_data); task_data = get_own_ompt_data(task_data); on_ompt_callback_work(wstype, endpoint, parallel_data, task_data, count, codeptr_ra); } static void on_cds_ompt_callback_master(ompt_scope_endpoint_t endpoint, ompt_data_t *parallel_data, ompt_data_t *task_data, const void *codeptr_ra) { parallel_data = get_own_ompt_data(parallel_data); task_data = get_own_ompt_data(task_data); on_ompt_callback_masked(endpoint, parallel_data, task_data, codeptr_ra); } static void on_cds_ompt_callback_parallel_begin( ompt_data_t *parent_task_data, const ompt_frame_t *parent_task_frame, ompt_data_t *parallel_data, uint32_t requested_team_size, int invoker, const void *codeptr_ra) { parent_task_data = get_own_ompt_data(parent_task_data); if (parallel_data->ptr) printf("%s\n", "0: parallel_data initially not null"); allocate_data_pair(parallel_data); parallel_data = get_own_ompt_data(parallel_data); on_ompt_callback_parallel_begin(parent_task_data, parent_task_frame, parallel_data, requested_team_size, invoker, codeptr_ra); } static void on_cds_ompt_callback_parallel_end(ompt_data_t *parallel_data, ompt_data_t *task_data, int invoker, const void *codeptr_ra) { task_data = get_own_ompt_data(task_data); parallel_data = get_own_ompt_data(parallel_data); on_ompt_callback_parallel_end(parallel_data, task_data, invoker, codeptr_ra); } static void on_cds_ompt_callback_task_create(ompt_data_t *parent_task_data, const ompt_frame_t *parent_frame, ompt_data_t *new_task_data, int type, int has_dependences, const void *codeptr_ra) { parent_task_data = get_own_ompt_data(parent_task_data); if (new_task_data->ptr) printf("%s\n", "0: new_task_data initially not null"); allocate_data_pair(new_task_data); new_task_data = get_own_ompt_data(new_task_data); on_ompt_callback_task_create(parent_task_data, parent_frame, new_task_data, type, has_dependences, codeptr_ra); } static void on_cds_ompt_callback_task_schedule(ompt_data_t *first_task_data, ompt_task_status_t prior_task_status, ompt_data_t *second_task_data) { ompt_data_t *original_first_task_data = first_task_data; first_task_data = get_own_ompt_data(first_task_data); second_task_data = get_own_ompt_data(second_task_data); on_ompt_callback_task_schedule(first_task_data, prior_task_status, second_task_data); } static void on_cds_ompt_callback_dependences(ompt_data_t *task_data, const ompt_dependence_t *deps, int ndeps) { task_data = get_own_ompt_data(task_data); on_ompt_callback_dependences(task_data, deps, ndeps); } static void on_cds_ompt_callback_task_dependence(ompt_data_t *first_task_data, ompt_data_t *second_task_data) { first_task_data = get_own_ompt_data(first_task_data); second_task_data = get_own_ompt_data(second_task_data); on_ompt_callback_task_dependence(first_task_data, second_task_data); } static void on_cds_ompt_callback_thread_begin(ompt_thread_t thread_type, ompt_data_t *thread_data) { if (thread_data->ptr) printf("%s\n", "0: thread_data initially not null"); allocate_data_pair(thread_data); thread_data = get_own_ompt_data(thread_data); on_ompt_callback_thread_begin(thread_type, thread_data); } static void on_cds_ompt_callback_thread_end(ompt_data_t *thread_data) { thread_data = get_own_ompt_data(thread_data); on_ompt_callback_thread_end(thread_data); } static int on_cds_ompt_callback_control_tool(uint64_t command, uint64_t modifier, void *arg, const void *codeptr_ra) { printf("%" PRIu64 ": _first_tool: ompt_event_control_tool: command=%" PRIu64 ", modifier=%" PRIu64 ", arg=%p, codeptr_ra=%p \n", ompt_get_thread_data()->value, command, modifier, arg, codeptr_ra); // print task data int task_level = 0; ompt_data_t *task_data; while (ompt_get_task_info(task_level, NULL, (ompt_data_t **)&task_data, NULL, NULL, NULL)) { task_data = get_own_ompt_data(task_data); printf("%" PRIu64 ": _first_tool: task level %d: task_id=%" PRIu64 "\n", ompt_get_thread_data()->value, task_level, task_data->value); task_level++; } // print parallel data int parallel_level = 0; ompt_data_t *parallel_data; while (ompt_get_parallel_info(parallel_level, (ompt_data_t **)¶llel_data, NULL)) { parallel_data = get_own_ompt_data(parallel_data); printf("%" PRIu64 ": _first_tool: parallel level %d: parallel_id=%" PRIu64 "\n", ompt_get_thread_data()->value, parallel_level, parallel_data->value); parallel_level++; } return 0; // success } static ompt_get_thread_data_t ompt_cds_get_thread_data; ompt_data_t *ompt_get_own_thread_data() { return get_own_ompt_data(ompt_cds_get_thread_data()); } #define register_ompt_callback2_t(name, type) \ do { \ type f_##name = &on_cds_##name; \ if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \ printf("0: Could not register callback '" #name "'\n"); \ } while (0) #define register_ompt_callback2(name) register_ompt_callback2_t(name, name##_t) int ompt_cds_initialize(ompt_function_lookup_t lookup, int initial_device_num, ompt_data_t *tool_data) { ompt_initialize(lookup, initial_device_num, tool_data); ompt_cds_get_thread_data = ompt_get_thread_data; ompt_get_thread_data = ompt_get_own_thread_data; register_ompt_callback(ompt_callback_mutex_acquire); register_ompt_callback_t(ompt_callback_mutex_acquired, ompt_callback_mutex_t); register_ompt_callback_t(ompt_callback_mutex_released, ompt_callback_mutex_t); register_ompt_callback(ompt_callback_nest_lock); register_ompt_callback2(ompt_callback_sync_region); register_ompt_callback2_t(ompt_callback_sync_region_wait, ompt_callback_sync_region_t); register_ompt_callback2(ompt_callback_control_tool); register_ompt_callback2(ompt_callback_flush); register_ompt_callback2(ompt_callback_cancel); register_ompt_callback2(ompt_callback_implicit_task); register_ompt_callback_t(ompt_callback_lock_init, ompt_callback_mutex_acquire_t); register_ompt_callback_t(ompt_callback_lock_destroy, ompt_callback_mutex_t); register_ompt_callback2(ompt_callback_work); register_ompt_callback2(ompt_callback_master); register_ompt_callback2(ompt_callback_parallel_begin); register_ompt_callback2(ompt_callback_parallel_end); register_ompt_callback2(ompt_callback_task_create); register_ompt_callback2(ompt_callback_task_schedule); register_ompt_callback2(ompt_callback_dependences); register_ompt_callback2(ompt_callback_task_dependence); register_ompt_callback2(ompt_callback_thread_begin); register_ompt_callback2(ompt_callback_thread_end); return 1; // success } void ompt_cds_finalize(ompt_data_t *tool_data) { printf("0: ompt_event_runtime_shutdown\n"); } ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version, const char *runtime_version) { static ompt_start_tool_result_t ompt_start_tool_result = { &ompt_cds_initialize, &ompt_cds_finalize, 0}; return &ompt_start_tool_result; }