1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-generic 2*330d8983SJohannes Doerfert // RUN: %libomptarget-compileopt-generic 3*330d8983SJohannes Doerfert 4*330d8983SJohannes Doerfert #include <stdio.h> 5*330d8983SJohannes Doerfert #define N 10 6*330d8983SJohannes Doerfert main(void)7*330d8983SJohannes Doerfertint main(void) { 8*330d8983SJohannes Doerfert long int aa = 0; 9*330d8983SJohannes Doerfert int res = 0; 10*330d8983SJohannes Doerfert 11*330d8983SJohannes Doerfert int ng = 12; 12*330d8983SJohannes Doerfert int cmom = 14; 13*330d8983SJohannes Doerfert int nxyz = 5000; 14*330d8983SJohannes Doerfert 15*330d8983SJohannes Doerfert #pragma omp target teams distribute num_teams(nxyz) \ 16*330d8983SJohannes Doerfert thread_limit(ng *(cmom - 1)) map(tofrom : aa) 17*330d8983SJohannes Doerfert for (int gid = 0; gid < nxyz; gid++) { 18*330d8983SJohannes Doerfert #pragma omp parallel for collapse(2) 19*330d8983SJohannes Doerfert for (unsigned int g = 0; g < ng; g++) { 20*330d8983SJohannes Doerfert for (unsigned int l = 0; l < cmom - 1; l++) { 21*330d8983SJohannes Doerfert int a = 0; 22*330d8983SJohannes Doerfert #pragma omp parallel for reduction(+ : a) 23*330d8983SJohannes Doerfert for (int i = 0; i < N; i++) { 24*330d8983SJohannes Doerfert a += i; 25*330d8983SJohannes Doerfert } 26*330d8983SJohannes Doerfert #pragma omp atomic 27*330d8983SJohannes Doerfert aa += a; 28*330d8983SJohannes Doerfert } 29*330d8983SJohannes Doerfert } 30*330d8983SJohannes Doerfert } 31*330d8983SJohannes Doerfert long exp = (long)ng * (cmom - 1) * nxyz * (N * (N - 1) / 2); 32*330d8983SJohannes Doerfert printf("The result is = %ld exp:%ld!\n", aa, exp); 33*330d8983SJohannes Doerfert if (aa != exp) { 34*330d8983SJohannes Doerfert printf("Failed %ld\n", aa); 35*330d8983SJohannes Doerfert return 1; 36*330d8983SJohannes Doerfert } 37*330d8983SJohannes Doerfert // CHECK: Success 38*330d8983SJohannes Doerfert printf("Success\n"); 39*330d8983SJohannes Doerfert return 0; 40*330d8983SJohannes Doerfert } 41