xref: /llvm-project/offload/test/mapping/lambda_mapping.cpp (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
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