| #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; |
| } |