// RUN: %libomptarget-compile-amdgcn-amd-amdhsa // RUN: %libomptarget-run-generic 2>&1 | \ // RUN: %fcheck-amdgcn-amd-amdhsa -check-prefixes=AMD // RUN: %libomptarget-compile-nvptx64-nvidia-cuda // RUN: %libomptarget-run-generic 2>&1 | \ // RUN: %fcheck-nvptx64-nvidia-cuda -check-prefixes=NVIDIA // REQUIRES: gpu // XFAIL: nvptx64-nvidia-cuda // XFAIL: nvptx64-nvidia-cuda-LTO #include #include const char *interop_int_to_string(const int interop_int) { switch (interop_int) { case 1: return "cuda"; case 2: return "cuda_driver"; case 3: return "opencl"; case 4: return "sycl"; case 5: return "hip"; case 6: return "level_zero"; case 7: return "hsa"; default: return "unknown"; } } int main(int argc, char **argv) { // Loop over all available devices for (int id = 0; id < omp_get_num_devices(); ++id) { omp_interop_t iobj = omp_interop_none; // TODO: Change targetsync to target when AMD toolchain supports it. #pragma omp interop init(target : iobj) device(id) int err; int interop_int = omp_get_interop_int(iobj, omp_ipr_fr_id, &err); if (err) { fprintf(stderr, "omp_get_interop_int failed: %d\n", err); return -1; } // AMD: {{.*}} hsa // NVIDIA: {{.*}} cuda printf("omp_get_interop_int returned %s\n", interop_int_to_string(interop_int)); const char *interop_vendor = omp_get_interop_str(iobj, omp_ipr_vendor_name, &err); if (err) { fprintf(stderr, "omp_get_interop_str failed: %d\n", err); return -1; } // AMD: {{.*}} amd // NVIDIA: {{.*}} nvidia printf("omp_get_interop_str returned %s\n", interop_vendor); const char *interop_fr_name = omp_get_interop_str(iobj, omp_ipr_fr_name, &err); if (err) { fprintf(stderr, "omp_get_interop_str failed: %d\n", err); return -1; } // AMD: {{.*}} hsa // NVIDIA: {{.*}} cuda printf("omp_get_interop_str returned %s\n", interop_fr_name); #pragma omp interop destroy(iobj) } return 0; }