// RUN: %compilexx-run-and-check #include #include int main(void) { int isHost = -1; int ParallelLevel1 = -1, ParallelLevel2 = -1; int Count = 0; #pragma omp target parallel for map(tofrom \ : isHost, ParallelLevel1, ParallelLevel2), reduction(+: Count) schedule(static, 1) for (int J = 0; J < 10; ++J) { #pragma omp critical { isHost = (isHost < 0 || isHost == 0) ? omp_is_initial_device() : isHost; ParallelLevel1 = (ParallelLevel1 < 0 || ParallelLevel1 == 1) ? omp_get_level() : ParallelLevel1; } if (omp_get_thread_num() > 5) { int L2; #pragma omp parallel for schedule(dynamic) lastprivate(L2) reduction(+: Count) for (int I = 0; I < 10; ++I) { L2 = omp_get_level(); Count += omp_get_level(); // (10-6)*10*2 = 80 } #pragma omp critical ParallelLevel2 = (ParallelLevel2 < 0 || ParallelLevel2 == 2) ? L2 : ParallelLevel2; } else { Count += omp_get_level(); // 6 * 1 = 6 } } if (isHost < 0) { printf("Runtime error, isHost=%d\n", isHost); } // CHECK: Target region executed on the device printf("Target region executed on the %s\n", isHost ? "host" : "device"); // CHECK: Parallel level in SPMD mode: L1 is 1, L2 is 2 printf("Parallel level in SPMD mode: L1 is %d, L2 is %d\n", ParallelLevel1, ParallelLevel2); // Final result of Count is (10-6)(num of loops)*10(num of iterations)*2(par // level) + 6(num of iterations) * 1(par level) // CHECK: Expected count = 86 printf("Expected count = %d\n", Count); return isHost; }