232 lines · cpp
1#ifndef HEADER2#define HEADER3// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -verify %s4 5#define NNN 506int aaa[NNN];7int aaa2[NNN][NNN];8 9void parallel_loop() {10 #pragma omp parallel11 {12 #pragma omp loop13 for (int j = 0 ; j < NNN ; j++) {14 aaa[j] = j*NNN;15 }16 }17 18 #pragma omp parallel for19 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 parallel27 #pragma omp for nowait28 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 for36 for (int i = 0 ; i < NNN ; i++) {37 #pragma omp nothing38 #pragma omp loop39 for (int j = 0 ; j < NNN ; j++) {40 aaa2[i][j] = i+j;41 }42 }43 44 #pragma omp target teams distribute parallel for45 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 parallel53 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 for61 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 parallel72 {73 #pragma omp sections74 {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 section83 {84 aaa[NNN-1] = NNN;85 }86 }87 }88}89 90void teams_loop() {91 int var1;92 int total = 0;93 94 #pragma omp teams95 {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 teams110 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 for118 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 teams126 {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 teams149 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 loop157 for (int i = 0; i < NNN; i++) {158 #pragma omp loop159 for (int j = 0 ; j < NNN ; j++) {160 aaa[i] = i+i*NNN;161 }162 }163 164 #pragma omp teams loop165 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 173void thread_loop() {174 #pragma omp parallel175 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 teams183 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 191void parallel_for_with_loop_teams_bind(){192 #pragma omp parallel for193 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 201void 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 223int 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#endif232