1*f5eebc25SShilei Tian // RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu 2*f5eebc25SShilei Tian // RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu 3*f5eebc25SShilei Tian // RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu 4*f5eebc25SShilei Tian // RUN: %libomptarget-compilexx-run-and-check-x86_64-pc-linux-gnu 5*f5eebc25SShilei Tian // RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda 6*f5eebc25SShilei Tian 7*f5eebc25SShilei Tian #include <cassert> 8*f5eebc25SShilei Tian #include <iostream> 9*f5eebc25SShilei Tian 10*f5eebc25SShilei Tian int main(int argc, char *argv[]) { 11*f5eebc25SShilei Tian constexpr const int num_threads = 64, N = 128; 12*f5eebc25SShilei Tian int array[num_threads] = {0}; 13*f5eebc25SShilei Tian 14*f5eebc25SShilei Tian #pragma omp parallel for 15*f5eebc25SShilei Tian for (int i = 0; i < num_threads; ++i) { 16*f5eebc25SShilei Tian int tmp[N]; 17*f5eebc25SShilei Tian 18*f5eebc25SShilei Tian for (int j = 0; j < N; ++j) { 19*f5eebc25SShilei Tian tmp[j] = i; 20*f5eebc25SShilei Tian } 21*f5eebc25SShilei Tian 22*f5eebc25SShilei Tian #pragma omp target teams distribute parallel for map(tofrom : tmp) 23*f5eebc25SShilei Tian for (int j = 0; j < N; ++j) { 24*f5eebc25SShilei Tian tmp[j] += j; 25*f5eebc25SShilei Tian } 26*f5eebc25SShilei Tian 27*f5eebc25SShilei Tian for (int j = 0; j < N; ++j) { 28*f5eebc25SShilei Tian array[i] += tmp[j]; 29*f5eebc25SShilei Tian } 30*f5eebc25SShilei Tian } 31*f5eebc25SShilei Tian 32*f5eebc25SShilei Tian // Verify 33*f5eebc25SShilei Tian for (int i = 0; i < num_threads; ++i) { 34*f5eebc25SShilei Tian const int ref = (0 + N - 1) * N / 2 + i * N; 35*f5eebc25SShilei Tian assert(array[i] == ref); 36*f5eebc25SShilei Tian } 37*f5eebc25SShilei Tian 38*f5eebc25SShilei Tian std::cout << "PASS\n"; 39*f5eebc25SShilei Tian 40*f5eebc25SShilei Tian return 0; 41*f5eebc25SShilei Tian } 42*f5eebc25SShilei Tian 43*f5eebc25SShilei Tian // CHECK: PASS 44