xref: /llvm-project/clang/test/OpenMP/loop_bind_messages.cpp (revision 782c5250077cf472941f0ab7555f87ff22d6e724)
1 #ifndef HEADER
2 #define HEADER
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -verify %s
4 
5 #define NNN 50
6 int aaa[NNN];
7 int aaa2[NNN][NNN];
8 
parallel_loop()9 void parallel_loop() {
10   #pragma omp parallel
11   {
12      #pragma omp loop
13      for (int j = 0 ; j < NNN ; j++) {
14        aaa[j] = j*NNN;
15      }
16    }
17 
18   #pragma omp parallel for
19   for (int i = 0 ; i < NNN ; i++) {
20     #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
21     for (int j = 0 ; j < NNN ; j++) {
22       aaa2[i][j] = i+j;
23     }
24   }
25 
26   #pragma omp parallel
27   #pragma omp for nowait
28   for (int i = 0 ; i < NNN ; i++) {
29     #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
30     for (int j = 0 ; j < NNN ; j++) {
31       aaa2[i][j] = i+j;
32     }
33   }
34 
35   #pragma omp parallel for
36   for (int i = 0 ; i < NNN ; i++) {
37     #pragma omp nothing
38     #pragma omp loop
39     for (int j = 0 ; j < NNN ; j++) {
40       aaa2[i][j] = i+j;
41     }
42   }
43 
44   #pragma omp target teams distribute parallel for
45   for (int i = 0 ; i < NNN ; i++) {
46     #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
47     for (int j = 0 ; j < NNN ; j++) {
48       aaa2[i][j] = i+j;
49     }
50   }
51 
52   #pragma omp target parallel
53   for (int i = 0 ; i < NNN ; i++) {
54     #pragma omp loop bind(parallel)
55     for (int j = 0 ; j < NNN ; j++) {
56       aaa2[i][j] = i+j;
57     }
58   }
59 
60   #pragma omp parallel for
61   for (int i = 0; i < 100; ++i) {
62     #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
63     for (int i = 0 ; i < NNN ; i++) {
64       #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'loop' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
65       for (int j = 0 ; j < NNN ; j++) {
66         aaa[j] = j*NNN;
67       }
68     }
69   }
70 
71   #pragma omp parallel
72   {
73      #pragma omp sections
74      {
75         for (int i = 0 ; i < NNN ; i++) {
76           #pragma omp loop bind(parallel) // expected-error{{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp loop' directive into a parallel region?}}
77           for (int j = 0 ; j < NNN ; j++) {
78             aaa2[i][j] = i+j;
79           }
80         }
81 
82         #pragma omp section
83 	{
84           aaa[NNN-1] = NNN;
85         }
86      }
87   }
88 }
89 
teams_loop()90 void teams_loop() {
91   int var1;
92   int total = 0;
93 
94   #pragma omp teams
95   {
96      #pragma omp loop bind(teams)
97      for (int j = 0 ; j < NNN ; j++) {
98        aaa[j] = j*NNN;
99      }
100 
101      #pragma omp loop bind(teams) collapse(2) private(var1)
102      for (int i = 0 ; i < 3 ; i++) {
103        for (int j = 0 ; j < NNN ; j++) {
104          var1 += aaa[j];
105        }
106      }
107    }
108 
109   #pragma omp target teams
110   for (int i = 0 ; i < NNN ; i++) {
111     #pragma omp loop bind(teams)
112     for (int j = 0 ; j < NNN ; j++) {
113       aaa2[i][j] = i+j;
114     }
115   }
116 
117   #pragma omp target teams distribute parallel for
118   for (int i = 0 ; i < NNN ; i++) {
119     #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'target teams distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}}
120     for (int j = 0 ; j < NNN ; j++) {
121       aaa2[i][j] = i+j;
122     }
123   }
124 
125   #pragma omp teams
126   {
127      #pragma omp loop bind(teams)
128      for (int j = 0 ; j < NNN ; j++) {
129        aaa[j] = j*NNN;
130      }
131 
132      #pragma omp loop bind(teams) reduction(+:total) // expected-error{{'reduction' clause not allowed with '#pragma omp loop bind(teams)'}}
133      for (int j = 0 ; j < NNN ; j++) {
134        total+=aaa[j];
135      }
136    }
137 
138   #pragma omp teams num_teams(8) thread_limit(256)
139   #pragma omp distribute parallel for dist_schedule(static, 1024) \
140                                       schedule(static, 64)
141   for (int i = 0; i < NNN; i++) {
142     #pragma omp loop bind(teams) // expected-error{{'distribute parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}}
143     for (int j = 0; j < NNN; j++) {
144       aaa2[i][j] = i+j;
145     }
146   }
147 
148   #pragma omp teams
149   for (int i = 0; i < NNN; i++) {
150     #pragma omp loop bind(thread)
151     for (int j = 0 ; j < NNN ; j++) {
152       aaa[i] = i+i*NNN;
153     }
154   }
155 
156   #pragma omp teams loop
157   for (int i = 0; i < NNN; i++) {
158     #pragma omp loop
159     for (int j = 0 ; j < NNN ; j++) {
160       aaa[i] = i+i*NNN;
161     }
162   }
163 
164   #pragma omp teams loop
165   for (int i = 0; i < NNN; i++) {
166     #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'teams loop' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}}
167     for (int j = 0 ; j < NNN ; j++) {
168       aaa[i] = i+i*NNN;
169     }
170   }
171 }
172 
thread_loop()173 void thread_loop() {
174   #pragma omp parallel
175   for (int i = 0; i < NNN; i++) {
176     #pragma omp loop bind(thread)
177     for (int j = 0 ; j < NNN ; j++) {
178       aaa[i] = i+i*NNN;
179     }
180   }
181 
182   #pragma omp teams
183   for (int i = 0; i < NNN; i++) {
184     #pragma omp loop bind(thread)
185     for (int j = 0 ; j < NNN ; j++) {
186       aaa[i] = i+i*NNN;
187     }
188   }
189 }
190 
parallel_for_with_loop_teams_bind()191 void parallel_for_with_loop_teams_bind(){
192   #pragma omp parallel for
193   for (int i = 0; i < NNN; i++) {
194     #pragma omp loop bind(teams) // expected-error{{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp loop' directive into a teams region?}}
195     for (int j = 0 ; j < NNN ; j++) {
196       aaa[i] = i+i*NNN;
197     }
198   }
199 }
200 
orphan_loops()201 void orphan_loops() {
202   #pragma omp loop  // expected-error{{expected 'bind' clause for 'loop' construct without an enclosing OpenMP construct}}
203   for (int j = 0 ; j < NNN ; j++) {
204     aaa[j] = j*NNN;
205   }
206 
207   #pragma omp loop bind(parallel)
208   for (int j = 0 ; j < NNN ; j++) {
209     aaa[j] = j*NNN;
210   }
211 
212   #pragma omp loop bind(teams)
213   for (int i = 0; i < NNN; i++) {
214     aaa[i] = i+i*NNN;
215   }
216 
217   #pragma omp loop bind(thread)
218   for (int i = 0; i < NNN; i++) {
219     aaa[i] = i+i*NNN;
220   }
221 }
222 
main(int argc,char * argv[])223 int main(int argc, char *argv[]) {
224   parallel_loop();
225   teams_loop();
226   thread_loop();
227   parallel_for_with_loop_teams_bind();
228   orphan_loops();
229 }
230 
231 #endif
232