294 lines
12 KiB
C
294 lines
12 KiB
C
#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;
|
|
}
|