xref: /llvm-project/openmp/runtime/test/ompt/parallel/repeated_calls.c (revision 35ab6d6390ecd285041590c00bac71a00e86aede)
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))
foo(int x)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))
bar(int x)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 
main()27 int main() {
28   int y;
29   y = foo(y);
30   y = bar(y);
31   y = foo(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 
on_ompt_callback_thread_begin(ompt_thread_t thread_type,ompt_data_t * thread_data)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 
on_ompt_callback_parallel_begin(ompt_data_t * encountering_task_data,const ompt_frame_t * encountering_task_frame,ompt_data_t * parallel_data,uint32_t requested_team_size,int flag,const void * codeptr_ra)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 
ompt_initialize(ompt_function_lookup_t lookup,int initial_device_num,ompt_data_t * tool_data)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 
ompt_finalize(ompt_data_t * tool_data)95 void ompt_finalize(ompt_data_t *tool_data) {}
96 
ompt_start_tool(unsigned int omp_version,const char * runtime_version)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