| // Unonptimized, we need 24000000 bytes heap | |
| // RUN: %libomptarget-compilexx-generic | |
| // RUN: env LIBOMPTARGET_HEAP_SIZE=24000000 \ | |
| // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic | |
| // RUN: %libomptarget-compileoptxx-run-and-check-generic | |
| // REQUIRES: libc | |
| #include <iostream> | |
| template <typename LOOP_BODY> | |
| inline void forall(int Begin, int End, LOOP_BODY LoopBody) { | |
| #pragma omp target parallel for schedule(static) | |
| for (int I = Begin; I < End; ++I) { | |
| LoopBody(I); | |
| } | |
| } | |
| #define N (1000) | |
| // | |
| // Demonstration of the RAJA abstraction using lambdas | |
| // Requires data mapping onto the target section | |
| // | |
| int main() { | |
| double A[N], B[N], C[N]; | |
| for (int I = 0; I < N; I++) { | |
| A[I] = I + 1; | |
| B[I] = -I; | |
| C[I] = -9; | |
| } | |
| #pragma omp target data map(tofrom : C[0 : N]) map(to : A[0 : N], B[0 : N]) | |
| { | |
| forall(0, N, [&](int I) { C[I] += A[I] + B[I]; }); | |
| } | |
| int Fail = 0; | |
| for (int I = 0; I < N; I++) { | |
| if (C[I] != -8) { | |
| std::cout << "Failed at " << I << " with val " << C[I] << std::endl; | |
| Fail = 1; | |
| } | |
| } | |
| // CHECK: Succeeded | |
| if (Fail) { | |
| std::cout << "Failed" << std::endl; | |
| } else { | |
| std::cout << "Succeeded" << std::endl; | |
| } | |
| return 0; | |
| } |