1*c1a6fe19SYe Luo // RUN: %libomptarget-compile-generic -fopenmp-version=51 2*c1a6fe19SYe Luo // RUN: %libomptarget-run-generic 2>&1 \ 3*c1a6fe19SYe Luo // RUN: | %fcheck-generic 4*c1a6fe19SYe Luo 5*c1a6fe19SYe Luo #include <stdio.h> 6*c1a6fe19SYe Luo #include <stdlib.h> 7*c1a6fe19SYe Luo 8*c1a6fe19SYe Luo #define N 1024 9*c1a6fe19SYe Luo #define FROM 64 10*c1a6fe19SYe Luo #define LENGTH 128 11*c1a6fe19SYe Luo main()12*c1a6fe19SYe Luoint main() { 13*c1a6fe19SYe Luo float *A = (float *)malloc(N * sizeof(float)); 14*c1a6fe19SYe Luo float *B = (float *)malloc(N * sizeof(float)); 15*c1a6fe19SYe Luo float *C = (float *)malloc(N * sizeof(float)); 16*c1a6fe19SYe Luo 17*c1a6fe19SYe Luo for (int i = 0; i < N; i++) { 18*c1a6fe19SYe Luo C[i] = 0.0; 19*c1a6fe19SYe Luo } 20*c1a6fe19SYe Luo 21*c1a6fe19SYe Luo for (int i = 0; i < N; i++) { 22*c1a6fe19SYe Luo A[i] = i; 23*c1a6fe19SYe Luo B[i] = 2 * i; 24*c1a6fe19SYe Luo } 25*c1a6fe19SYe Luo 26*c1a6fe19SYe Luo #pragma omp target enter data map(to : A [FROM:LENGTH], B [FROM:LENGTH]) 27*c1a6fe19SYe Luo #pragma omp target enter data map(alloc : C [FROM:LENGTH]) 28*c1a6fe19SYe Luo 29*c1a6fe19SYe Luo // A, B and C have been mapped starting at index FROM, but inside the kernel 30*c1a6fe19SYe Luo // they are captured implicitly so the library must look them up using their 31*c1a6fe19SYe Luo // base address. 32*c1a6fe19SYe Luo #pragma omp target 33*c1a6fe19SYe Luo { 34*c1a6fe19SYe Luo for (int i = FROM; i < FROM + LENGTH; i++) { 35*c1a6fe19SYe Luo C[i] = A[i] + B[i]; 36*c1a6fe19SYe Luo } 37*c1a6fe19SYe Luo } 38*c1a6fe19SYe Luo 39*c1a6fe19SYe Luo #pragma omp target exit data map(from : C [FROM:LENGTH]) 40*c1a6fe19SYe Luo #pragma omp target exit data map(delete : A [FROM:LENGTH], B [FROM:LENGTH]) 41*c1a6fe19SYe Luo 42*c1a6fe19SYe Luo int errors = 0; 43*c1a6fe19SYe Luo for (int i = FROM; i < FROM + LENGTH; i++) 44*c1a6fe19SYe Luo if (C[i] != A[i] + B[i]) 45*c1a6fe19SYe Luo ++errors; 46*c1a6fe19SYe Luo 47*c1a6fe19SYe Luo // CHECK: Success 48*c1a6fe19SYe Luo if (errors) 49*c1a6fe19SYe Luo fprintf(stderr, "Failure\n"); 50*c1a6fe19SYe Luo else 51*c1a6fe19SYe Luo fprintf(stderr, "Success\n"); 52*c1a6fe19SYe Luo 53*c1a6fe19SYe Luo free(A); 54*c1a6fe19SYe Luo free(B); 55*c1a6fe19SYe Luo free(C); 56*c1a6fe19SYe Luo 57*c1a6fe19SYe Luo return 0; 58*c1a6fe19SYe Luo } 59