// RUN: %libomptarget-compile-run-and-check-aarch64-unknown-linux-gnu // RUN: %libomptarget-compile-run-and-check-powerpc64-ibm-linux-gnu // RUN: %libomptarget-compile-run-and-check-powerpc64le-ibm-linux-gnu // RUN: %libomptarget-compile-run-and-check-x86_64-pc-linux-gnu // UNSUPPORTED: clang-6, clang-7, clang-8, clang-9 #include #include #pragma omp requires unified_shared_memory #define N 1024 int main(int argc, char *argv[]) { int fails; void *host_alloc = 0, *device_alloc = 0; int *a = (int *)malloc(N * sizeof(int)); // Init for (int i = 0; i < N; ++i) { a[i] = 10; } host_alloc = &a[0]; // // map + target no close // #pragma omp target data map(tofrom : a[ : N]) map(tofrom : device_alloc) { #pragma omp target map(tofrom : device_alloc) { device_alloc = &a[0]; } } // CHECK: a used from unified memory. if (device_alloc == host_alloc) printf("a used from unified memory.\n"); // // map + target with close // device_alloc = 0; #pragma omp target data map(close, tofrom : a[ : N]) map(tofrom : device_alloc) { #pragma omp target map(tofrom : device_alloc) { device_alloc = &a[0]; } } // CHECK: a copied to device. if (device_alloc != host_alloc) printf("a copied to device.\n"); // // map + use_device_ptr no close // device_alloc = 0; #pragma omp target data map(tofrom : a[ : N]) use_device_ptr(a) { device_alloc = &a[0]; } // CHECK: a used from unified memory with use_device_ptr. if (device_alloc == host_alloc) printf("a used from unified memory with use_device_ptr.\n"); // // map + use_device_ptr close // device_alloc = 0; #pragma omp target data map(close, tofrom : a[ : N]) use_device_ptr(a) { device_alloc = &a[0]; } // CHECK: a used from device memory with use_device_ptr. if (device_alloc != host_alloc) printf("a used from device memory with use_device_ptr.\n"); // // map enter/exit + close // device_alloc = 0; #pragma omp target enter data map(close, to : a[ : N]) #pragma omp target map(from : device_alloc) { device_alloc = &a[0]; } #pragma omp target exit data map(from : a[ : N]) // CHECK: a has been mapped to the device. if (device_alloc != host_alloc) printf("a has been mapped to the device.\n"); free(a); // CHECK: Done! printf("Done!\n"); return 0; }