| 1 | // RUN: %libomp-compile-and-run | FileCheck %s |
| 2 | // REQUIRES: ompt |
| 3 | |
| 4 | #define USE_PRIVATE_TOOL 1 |
| 5 | #include "callback.h" |
| 6 | |
| 7 | __attribute__((noinline)) |
| 8 | int foo(int x) { |
| 9 | #pragma omp parallel num_threads(2) |
| 10 | { |
| 11 | #pragma omp atomic |
| 12 | x++; |
| 13 | } |
| 14 | return x; |
| 15 | } |
| 16 | |
| 17 | __attribute__((noinline)) |
| 18 | int bar(int x) { |
| 19 | #pragma omp parallel num_threads(2) |
| 20 | { |
| 21 | #pragma omp critical |
| 22 | x++; |
| 23 | } |
| 24 | return x; |
| 25 | } |
| 26 | |
| 27 | int main() { |
| 28 | int y; |
| 29 | y = foo(x: y); |
| 30 | y = bar(x: y); |
| 31 | y = foo(x: y); |
| 32 | return 0; |
| 33 | |
| 34 | // CHECK-NOT: {{^}}0: Could not register callback |
| 35 | // CHECK: 0: NULL_POINTER=[[NULL:.*$]] |
| 36 | |
| 37 | // First call to foo |
| 38 | // CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_parallel_begin |
| 39 | // CHECK-SAME: {{.*}}codeptr_ra=[[RETURN_ADDRESS:(0x)?[0-f]+]] |
| 40 | |
| 41 | // Call to bar |
| 42 | // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin |
| 43 | |
| 44 | // Second call to foo |
| 45 | // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_begin |
| 46 | // CHECK-SAME: {{.*}}codeptr_ra=[[RETURN_ADDRESS]] |
| 47 | |
| 48 | } |
| 49 | |
| 50 | static void on_ompt_callback_thread_begin( |
| 51 | ompt_thread_t thread_type, |
| 52 | ompt_data_t *thread_data) { |
| 53 | if (thread_data->ptr) |
| 54 | printf("%s\n" , "0: thread_data initially not null" ); |
| 55 | thread_data->value = ompt_get_unique_id(); |
| 56 | printf("%" PRIu64 ":" _TOOL_PREFIX |
| 57 | " ompt_event_thread_begin: thread_type=%s=%d, thread_id=%" PRIu64 "\n" , |
| 58 | ompt_get_thread_data()->value, ompt_thread_t_values[thread_type], |
| 59 | thread_type, thread_data->value); |
| 60 | } |
| 61 | |
| 62 | static void on_ompt_callback_parallel_begin( |
| 63 | ompt_data_t *encountering_task_data, |
| 64 | const ompt_frame_t *encountering_task_frame, ompt_data_t *parallel_data, |
| 65 | uint32_t requested_team_size, int flag, const void *codeptr_ra) { |
| 66 | if (parallel_data->ptr) |
| 67 | printf("0: parallel_data initially not null\n" ); |
| 68 | parallel_data->value = ompt_get_unique_id(); |
| 69 | int invoker = flag & 0xF; |
| 70 | const char *event = (flag & ompt_parallel_team) ? "parallel" : "teams" ; |
| 71 | const char *size = (flag & ompt_parallel_team) ? "team_size" : "num_teams" ; |
| 72 | printf("%" PRIu64 ":" _TOOL_PREFIX |
| 73 | " ompt_event_%s_begin: parent_task_id=%" PRIu64 |
| 74 | ", parent_task_frame.exit=%p, parent_task_frame.reenter=%p, " |
| 75 | "parallel_id=%" PRIu64 ", requested_%s=%" PRIu32 |
| 76 | ", codeptr_ra=%p, invoker=%d\n" , |
| 77 | ompt_get_thread_data()->value, event, encountering_task_data->value, |
| 78 | encountering_task_frame->exit_frame.ptr, |
| 79 | encountering_task_frame->enter_frame.ptr, parallel_data->value, size, |
| 80 | requested_team_size, codeptr_ra, invoker); |
| 81 | } |
| 82 | |
| 83 | int ompt_initialize(ompt_function_lookup_t lookup, int initial_device_num, |
| 84 | ompt_data_t *tool_data) { |
| 85 | ompt_set_callback = (ompt_set_callback_t)lookup("ompt_set_callback" ); |
| 86 | ompt_get_unique_id = (ompt_get_unique_id_t)lookup("ompt_get_unique_id" ); |
| 87 | ompt_get_thread_data = (ompt_get_thread_data_t)lookup("ompt_get_thread_data" ); |
| 88 | |
| 89 | register_ompt_callback(ompt_callback_thread_begin); |
| 90 | register_ompt_callback(ompt_callback_parallel_begin); |
| 91 | printf("0: NULL_POINTER=%p\n" , (void *)NULL); |
| 92 | return 1; // success |
| 93 | } |
| 94 | |
| 95 | void ompt_finalize(ompt_data_t *tool_data) {} |
| 96 | |
| 97 | ompt_start_tool_result_t *ompt_start_tool(unsigned int omp_version, |
| 98 | const char *runtime_version) { |
| 99 | static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize, |
| 100 | &ompt_finalize, 0}; |
| 101 | return &ompt_start_tool_result; |
| 102 | } |
| 103 | |