| // RUN: %libomptarget-compile-generic | |
| // RUN: %libomptarget-run-generic 2>&1 \ | |
| // RUN: | %fcheck-generic | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #define N 1024 | |
| #define FROM 64 | |
| #define LENGTH 128 | |
| int main() { | |
| float *A = (float *)malloc(N * sizeof(float)); | |
| float *B = (float *)malloc(N * sizeof(float)); | |
| float *C = (float *)malloc(N * sizeof(float)); | |
| for (int i = 0; i < N; i++) { | |
| C[i] = 0.0; | |
| } | |
| for (int i = 0; i < N; i++) { | |
| A[i] = i; | |
| B[i] = 2 * i; | |
| } | |
| #pragma omp target enter data map(to : A[FROM : LENGTH], B[FROM : LENGTH]) | |
| #pragma omp target enter data map(alloc : C[FROM : LENGTH]) | |
| // A, B and C have been mapped starting at index FROM, but inside the kernel | |
| // they are captured implicitly so the library must look them up using their | |
| // base address. | |
| #pragma omp target | |
| { | |
| for (int i = FROM; i < FROM + LENGTH; i++) { | |
| C[i] = A[i] + B[i]; | |
| } | |
| } | |
| #pragma omp target exit data map(from : C[FROM : LENGTH]) | |
| #pragma omp target exit data map(delete : A[FROM : LENGTH], B[FROM : LENGTH]) | |
| int errors = 0; | |
| for (int i = FROM; i < FROM + LENGTH; i++) | |
| if (C[i] != A[i] + B[i]) | |
| ++errors; | |
| // CHECK: Success | |
| if (errors) | |
| fprintf(stderr, "Failure\n"); | |
| else | |
| fprintf(stderr, "Success\n"); | |
| free(A); | |
| free(B); | |
| free(C); | |
| return 0; | |
| } |