1// RUN: %libomp-compile-and-run | %sort-threads | FileCheck %s
2// REQUIRES: ompt
3
4// GCC 9 introduced codegen for mutexinoutset
5// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8
6
7// icc does not yet support mutexinoutset
8// XFAIL: icc
9
10// clang 9 introduced codegen for mutexinoutset
11// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
12
13#include "callback.h"
14#include <omp.h>
15#include <math.h>
16#include <unistd.h>
17
18int main() {
19 int x = 0;
20#pragma omp parallel num_threads(2)
21 {
22#pragma omp master
23 {
24 print_ids(0);
25 printf("%" PRIu64 ": address of x: %p\n", ompt_get_thread_data()->value,
26 &x);
27#pragma omp task depend(out : x)
28 {
29 x++;
30 delay(100);
31 }
32 print_fuzzy_address(1);
33 print_ids(0);
34
35#pragma omp task depend(mutexinoutset : x)
36 {
37 x++;
38 delay(100);
39 }
40 print_fuzzy_address(2);
41 print_ids(0);
42
43#pragma omp task depend(in : x)
44 { x = -1; }
45 print_ids(0);
46 }
47 }
48
49 x++;
50
51 return 0;
52}
53
54// Check if libomp supports the callbacks for this test.
55// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_create'
56// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_dependences'
57// CHECK-NOT: {{^}}0: Could not register callback 'ompt_callback_task_depende
58
59// CHECK: {{^}}0: NULL_POINTER=[[NULL:.*$]]
60
61// make sure initial data pointers are null
62// CHECK-NOT: 0: new_task_data initially not null
63
64// CHECK: {{^}}[[MASTER_ID:[0-9]+]]: ompt_event_implicit_task_begin:
65// CHECK-SAME: parallel_id=[[PARALLEL_ID:[0-9]+]],
66// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID:[0-9]+]]
67
68// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]],
69// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT:0x[0-f]+]],
70// CHECK-SAME: reenter_frame=[[NULL]]
71
72// CHECK: {{^}}[[MASTER_ID]]: address of x: [[ADDRX:0x[0-f]+]]
73// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create:
74// CHECK-SAME: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[EXIT]],
75// CHECK-SAME: parent_task_frame.reenter={{0x[0-f]+}},
76// CHECK-SAME: new_task_id=[[FIRST_TASK:[0-f]+]],
77// CHECK-SAME: codeptr_ra=[[RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}},
78// CHECK-SAME: task_type=ompt_task_explicit=4, has_dependences=yes
79
80// CHECK: {{^}}[[MASTER_ID]]: ompt_event_dependences:
81// CHECK-SAME: task_id=[[FIRST_TASK]], deps=[([[ADDRX]],
82// CHECK-SAME: ompt_dependence_type_inout)], ndeps=1
83
84// CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS]]
85// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]],
86// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]],
87// CHECK-SAME: reenter_frame=[[NULL]]
88
89// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create:
90// CHECK-SAME: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[EXIT]],
91// CHECK-SAME: parent_task_frame.reenter={{0x[0-f]+}},
92// CHECK-SAME: new_task_id=[[SECOND_TASK:[0-f]+]],
93// CHECK-SAME: codeptr_ra=[[RETURN_ADDRESS:0x[0-f]+]]{{[0-f][0-f]}},
94// CHECK-SAME: task_type=ompt_task_explicit=4, has_dependences=yes
95
96// CHECK: {{^}}[[MASTER_ID]]: ompt_event_dependences:
97// CHECK-SAME: task_id=[[SECOND_TASK]], deps=[([[ADDRX]],
98// CHECK-SAME: ompt_dependence_type_mutexinoutset)], ndeps=1
99
100// CHECK: {{^}}[[MASTER_ID]]: fuzzy_address={{.*}}[[RETURN_ADDRESS]]
101// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]],
102// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]],
103// CHECK-SAME: reenter_frame=[[NULL]]
104
105// CHECK: {{^}}[[MASTER_ID]]: ompt_event_task_create:
106// CHECK-SAME: parent_task_id={{[0-9]+}}, parent_task_frame.exit=[[EXIT]],
107// CHECK-SAME: parent_task_frame.reenter={{0x[0-f]+}},
108// CHECK-SAME: new_task_id=[[THIRD_TASK:[0-f]+]], codeptr_ra={{0x[0-f]+}},
109// CHECK-SAME: task_type=ompt_task_explicit=4, has_dependences=yes
110
111// CHECK: {{^}}[[MASTER_ID]]: ompt_event_dependences:
112// CHECK-SAME: task_id=[[THIRD_TASK]], deps=[([[ADDRX]],
113// CHECK-SAME: ompt_dependence_type_in)], ndeps=1
114
115// CHECK: {{^}}[[MASTER_ID]]: task level 0: parallel_id=[[PARALLEL_ID]],
116// CHECK-SAME: task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[EXIT]],
117// CHECK-SAME: reenter_frame=[[NULL]]
118

source code of openmp/runtime/test/ompt/tasks/dependences_mutexinoutset.c