1*330d8983SJohannes Doerfert // Unonptimized, we need 24000000 bytes heap
2*330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-generic
3*330d8983SJohannes Doerfert // RUN: env LIBOMPTARGET_HEAP_SIZE=24000000 \
4*330d8983SJohannes Doerfert // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic
5*330d8983SJohannes Doerfert // RUN: %libomptarget-compileoptxx-run-and-check-generic
6*330d8983SJohannes Doerfert
7*330d8983SJohannes Doerfert #include <iostream>
8*330d8983SJohannes Doerfert
9*330d8983SJohannes Doerfert template <typename LOOP_BODY>
forall(int Begin,int End,LOOP_BODY LoopBody)10*330d8983SJohannes Doerfert inline void forall(int Begin, int End, LOOP_BODY LoopBody) {
11*330d8983SJohannes Doerfert #pragma omp target parallel for schedule(static)
12*330d8983SJohannes Doerfert for (int I = Begin; I < End; ++I) {
13*330d8983SJohannes Doerfert LoopBody(I);
14*330d8983SJohannes Doerfert }
15*330d8983SJohannes Doerfert }
16*330d8983SJohannes Doerfert
17*330d8983SJohannes Doerfert #define N (1000)
18*330d8983SJohannes Doerfert
19*330d8983SJohannes Doerfert //
20*330d8983SJohannes Doerfert // Demonstration of the RAJA abstraction using lambdas
21*330d8983SJohannes Doerfert // Requires data mapping onto the target section
22*330d8983SJohannes Doerfert //
main()23*330d8983SJohannes Doerfert int main() {
24*330d8983SJohannes Doerfert double A[N], B[N], C[N];
25*330d8983SJohannes Doerfert
26*330d8983SJohannes Doerfert for (int I = 0; I < N; I++) {
27*330d8983SJohannes Doerfert A[I] = I + 1;
28*330d8983SJohannes Doerfert B[I] = -I;
29*330d8983SJohannes Doerfert C[I] = -9;
30*330d8983SJohannes Doerfert }
31*330d8983SJohannes Doerfert
32*330d8983SJohannes Doerfert #pragma omp target data map(tofrom : C[0 : N]) map(to : A[0 : N], B[0 : N])
33*330d8983SJohannes Doerfert {
34*330d8983SJohannes Doerfert forall(0, N, [&](int I) { C[I] += A[I] + B[I]; });
35*330d8983SJohannes Doerfert }
36*330d8983SJohannes Doerfert
37*330d8983SJohannes Doerfert int Fail = 0;
38*330d8983SJohannes Doerfert for (int I = 0; I < N; I++) {
39*330d8983SJohannes Doerfert if (C[I] != -8) {
40*330d8983SJohannes Doerfert std::cout << "Failed at " << I << " with val " << C[I] << std::endl;
41*330d8983SJohannes Doerfert Fail = 1;
42*330d8983SJohannes Doerfert }
43*330d8983SJohannes Doerfert }
44*330d8983SJohannes Doerfert
45*330d8983SJohannes Doerfert // CHECK: Succeeded
46*330d8983SJohannes Doerfert if (Fail) {
47*330d8983SJohannes Doerfert std::cout << "Failed" << std::endl;
48*330d8983SJohannes Doerfert } else {
49*330d8983SJohannes Doerfert std::cout << "Succeeded" << std::endl;
50*330d8983SJohannes Doerfert }
51*330d8983SJohannes Doerfert
52*330d8983SJohannes Doerfert return 0;
53*330d8983SJohannes Doerfert }
54