xref: /llvm-project/openmp/runtime/test/ompt/worksharing/for/base_split.h (revision a707d0883b5ab9de6a0a864df614ef14909a4de1)
1 #include "callback.h"
2 #include <omp.h>
3 #include <stdio.h>
4 
5 #define STRINGIFY(x) #x
6 #define STR(x) STRINGIFY(x)
7 #ifndef SCHED_OUTPUT
8 #define SCHED_OUTPUT STR(SCHEDULE)
9 #endif
10 
11 /* With the combined parallel-for construct (base.h), the return-addresses are hard to compare.
12    With the separate parallel and for-nowait construct, the addresses become more predictable,
13    but the begin of the for-loop still generates additional code, so the offset of loop-begin
14    to the label is >4 Byte.
15 */
16 
main()17 int main()
18 {
19   unsigned int i;
20   printf("0: Schedule: " SCHED_OUTPUT "\n");
21 
22 #pragma omp parallel num_threads(4)
23   {
24     print_current_address(0);
25     #pragma omp for schedule(SCHEDULE) nowait
26     for (i = 0; i < 64; i++) {
27       print_fuzzy_address(1);
28     }
29     print_fuzzy_address(2);
30   }
31   print_fuzzy_address(3);
32 
33   // clang-format off
34   // Check if libomp supports the callbacks for this test.
35   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_begin'
36   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_parallel_end'
37   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_implicit_task'
38   // CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_work'
39 
40 
41   // CHECK: 0: NULL_POINTER=[[NULL:.*$]]
42   // CHECK: 0: Schedule: [[SCHED:[a-z]+]]
43   // CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_parallel_begin: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[NULL]], parent_task_frame.reenter={{0x[0-f]+}}, parallel_id=[[PARALLEL_ID:[0-9]+]], requested_team_size=4, codeptr_ra=[[PARALLEL_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}, invoker={{[0-9]+}}
44 
45   // CHECK: {{^}}[[MASTER_ID]]: ompt_event_loop_[[SCHED]]_begin: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_BEGIN_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
46   // CHECK: {{^}}[[MASTER_ID]]: ompt_event_loop_[[SCHED]]_end: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_END_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
47   // CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[LOOP_END_RETURN_ADDRESS]]
48 
49   // CHECK: {{^}}[[MASTER_ID]]: ompt_event_parallel_end: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, invoker={{[0-9]+}}, codeptr_ra=[[PARALLEL_RETURN_ADDRESS]]
50   // CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[PARALLEL_RETURN_ADDRESS]]
51 
52   // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_loop_[[SCHED]]_begin: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=0x{{[0-f]+}}
53   // CHECK: {{^}}[[THREAD_ID]]: ompt_event_loop_[[SCHED]]_end: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_END_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
54   // CHECK: {{^}}[[THREAD_ID]]: fuzzy_address={{.*}}[[LOOP_END_RETURN_ADDRESS]]
55 
56   // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_loop_[[SCHED]]_begin: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=0x{{[0-f]+}}
57   // CHECK: {{^}}[[THREAD_ID]]: ompt_event_loop_[[SCHED]]_end: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_END_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
58   // CHECK: {{^}}[[THREAD_ID]]: fuzzy_address={{.*}}[[LOOP_END_RETURN_ADDRESS]]
59 
60   // CHECK: {{^}}[[THREAD_ID:[0-9]+]]: ompt_event_loop_[[SCHED]]_begin: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=0x{{[0-f]+}}
61   // CHECK: {{^}}[[THREAD_ID]]: ompt_event_loop_[[SCHED]]_end: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_END_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
62   // CHECK: {{^}}[[THREAD_ID]]: fuzzy_address={{.*}}[[LOOP_END_RETURN_ADDRESS]]
63 
64 
65   // CHECK-LOOP: 0: NULL_POINTER=[[NULL:.*$]]
66   // CHECK-LOOP: 0: Schedule: [[SCHED:[a-z]+]]
67   // CHECK-LOOP: 0: ompt_event_runtime_shutdown
68   // CHECK-LOOP: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_parallel_begin: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[NULL]], parent_task_frame.reenter={{0x[0-f]+}}, parallel_id=[[PARALLEL_ID:[0-9]+]], requested_team_size=4, codeptr_ra={{0x[0-f]+}}, invoker={{[0-9]+}}
69   // CHECK-LOOP: {{^}}[[MASTER_ID]]: ompt_event_loop_[[SCHED]]_begin: parallel_id=[[PARALLEL_ID]], task_id={{[0-9]+}}, codeptr_ra=[[LOOP_BEGIN_RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}}
70   // CHECK-LOOP: {{^}}{{[0-9]+}}: fuzzy_address={{.*}}[[LOOP_BEGIN_RETURN_ADDRESS]]
71   // CHECK-LOOP: {{^}}{{[0-9]+}}: fuzzy_address={{.*}}[[LOOP_BEGIN_RETURN_ADDRESS]]
72   // CHECK-LOOP: {{^}}{{[0-9]+}}: fuzzy_address={{.*}}[[LOOP_BEGIN_RETURN_ADDRESS]]
73   // CHECK-LOOP: {{^}}{{[0-9]+}}: fuzzy_address={{.*}}[[LOOP_BEGIN_RETURN_ADDRESS]]
74   // clang-format on
75 
76   return 0;
77 }
78