1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-run-and-check-generic 2*330d8983SJohannes Doerfert 3*330d8983SJohannes Doerfert #include <cstdio> 4*330d8983SJohannes Doerfert #include <cstdlib> 5*330d8983SJohannes Doerfert 6*330d8983SJohannes Doerfert #define NUM 1024 7*330d8983SJohannes Doerfert 8*330d8983SJohannes Doerfert class C { 9*330d8983SJohannes Doerfert public: 10*330d8983SJohannes Doerfert int *a; 11*330d8983SJohannes Doerfert }; 12*330d8983SJohannes Doerfert 13*330d8983SJohannes Doerfert #pragma omp declare mapper(id : C s) map(s.a[0 : NUM]) 14*330d8983SJohannes Doerfert main()15*330d8983SJohannes Doerfertint main() { 16*330d8983SJohannes Doerfert C c; 17*330d8983SJohannes Doerfert int sum = 0; 18*330d8983SJohannes Doerfert c.a = (int *)malloc(sizeof(int) * NUM); 19*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 20*330d8983SJohannes Doerfert c.a[i] = 1; 21*330d8983SJohannes Doerfert } 22*330d8983SJohannes Doerfert #pragma omp target enter data map(mapper(id), alloc : c) 23*330d8983SJohannes Doerfert #pragma omp target teams distribute parallel for 24*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 25*330d8983SJohannes Doerfert c.a[i] = 0; 26*330d8983SJohannes Doerfert } 27*330d8983SJohannes Doerfert #pragma omp target update from(mapper(id) : c) 28*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 29*330d8983SJohannes Doerfert sum += c.a[i]; 30*330d8983SJohannes Doerfert } 31*330d8983SJohannes Doerfert // CHECK: Sum (after first update from) = 0 32*330d8983SJohannes Doerfert printf("Sum (after first update from) = %d\n", sum); 33*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 34*330d8983SJohannes Doerfert c.a[i] = 1; 35*330d8983SJohannes Doerfert } 36*330d8983SJohannes Doerfert #pragma omp target update to(mapper(id) : c) 37*330d8983SJohannes Doerfert #pragma omp target teams distribute parallel for 38*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 39*330d8983SJohannes Doerfert ++c.a[i]; 40*330d8983SJohannes Doerfert } 41*330d8983SJohannes Doerfert sum = 0; 42*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 43*330d8983SJohannes Doerfert sum += c.a[i]; 44*330d8983SJohannes Doerfert } 45*330d8983SJohannes Doerfert // CHECK: Sum (after update to) = 1024 46*330d8983SJohannes Doerfert printf("Sum (after update to) = %d\n", sum); 47*330d8983SJohannes Doerfert #pragma omp target update from(mapper(id) : c) 48*330d8983SJohannes Doerfert sum = 0; 49*330d8983SJohannes Doerfert for (int i = 0; i < NUM; i++) { 50*330d8983SJohannes Doerfert sum += c.a[i]; 51*330d8983SJohannes Doerfert } 52*330d8983SJohannes Doerfert // CHECK: Sum (after second update from) = 2048 53*330d8983SJohannes Doerfert printf("Sum (after second update from) = %d\n", sum); 54*330d8983SJohannes Doerfert #pragma omp target exit data map(mapper(id), delete : c) 55*330d8983SJohannes Doerfert return 0; 56*330d8983SJohannes Doerfert } 57