// RUN: %libomptarget-compile-generic // RUN: %libomptarget-run-generic 2>&1 \ // RUN: | %fcheck-generic #include #include #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; }