1330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-run-and-check-generic 2330d8983SJohannes Doerfert 3*88234488SEthan Luis McDonough // REQUIRES: gpu 4330d8983SJohannes Doerfert 5330d8983SJohannes Doerfert #include <cassert> 6330d8983SJohannes Doerfert #include <iostream> 7330d8983SJohannes Doerfert main(int argc,char * argv[])8330d8983SJohannes Doerfertint main(int argc, char *argv[]) { 9330d8983SJohannes Doerfert constexpr const int num_threads = 64, N = 128; 10330d8983SJohannes Doerfert int array[num_threads] = {0}; 11330d8983SJohannes Doerfert 12330d8983SJohannes Doerfert #pragma omp parallel for 13330d8983SJohannes Doerfert for (int i = 0; i < num_threads; ++i) { 14330d8983SJohannes Doerfert int tmp[N]; 15330d8983SJohannes Doerfert 16330d8983SJohannes Doerfert for (int j = 0; j < N; ++j) { 17330d8983SJohannes Doerfert tmp[j] = i; 18330d8983SJohannes Doerfert } 19330d8983SJohannes Doerfert 20330d8983SJohannes Doerfert #pragma omp target teams distribute parallel for map(tofrom : tmp) 21330d8983SJohannes Doerfert for (int j = 0; j < N; ++j) { 22330d8983SJohannes Doerfert tmp[j] += j; 23330d8983SJohannes Doerfert } 24330d8983SJohannes Doerfert 25330d8983SJohannes Doerfert for (int j = 0; j < N; ++j) { 26330d8983SJohannes Doerfert array[i] += tmp[j]; 27330d8983SJohannes Doerfert } 28330d8983SJohannes Doerfert } 29330d8983SJohannes Doerfert 30330d8983SJohannes Doerfert // Verify 31330d8983SJohannes Doerfert for (int i = 0; i < num_threads; ++i) { 32330d8983SJohannes Doerfert const int ref = (0 + N - 1) * N / 2 + i * N; 33330d8983SJohannes Doerfert assert(array[i] == ref); 34330d8983SJohannes Doerfert } 35330d8983SJohannes Doerfert 36330d8983SJohannes Doerfert std::cout << "PASS\n"; 37330d8983SJohannes Doerfert 38330d8983SJohannes Doerfert return 0; 39330d8983SJohannes Doerfert } 40330d8983SJohannes Doerfert 41330d8983SJohannes Doerfert // CHECK: PASS 42