From 54544d93d7896dd00c0a1ae53531fe2a42506cff Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Tue, 30 Sep 2025 15:23:29 -0500 Subject: [PATCH 1/6] [OpenMP] Add test to print interop identifiers The test covers some of the identifier symbols in the interop runtime. --- offload/test/offloading/interop-print.c | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 offload/test/offloading/interop-print.c diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c new file mode 100644 index 0000000000000..cf59d03d3779e --- /dev/null +++ b/offload/test/offloading/interop-print.c @@ -0,0 +1,71 @@ +// RUN: %libomptarget-compile-amdgcn-amd-amdhsa +// RUN: %libomptarget-run-generic 2>&1 | \ +// RUN: %fcheck-generic -check-prefix=AMDCHECK + +// REQUIRES: amdgpu + +#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) { + omp_interop_t iobj = omp_interop_none; +#pragma omp interop init(targetsync : iobj) + + 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; + } + + // FIXME: This should be hsa instead of hip + // AMDCHECK: {{.*}} hip + 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; + } + + // AMDCHECK: {{.*}} amd + 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; + } + + // FIXME: This should be hsa instead of hip + // AMDCHECK: {{.*}} hip + printf("omp_get_interop_str returned %s\n", interop_fr_name); + +#pragma omp interop destroy(iobj) + return 0; +} From 2260660b4e51c7989d5255980a67b6060763049b Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Thu, 2 Oct 2025 02:44:59 -0500 Subject: [PATCH 2/6] Change 'hip' to correct 'hsa' The required linked PR got updated to include that fix. Adjusting the test to reflect the correct behavior. --- offload/test/offloading/interop-print.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index cf59d03d3779e..faf47e0a997cd 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -40,8 +40,7 @@ int main(int argc, char **argv) { return -1; } - // FIXME: This should be hsa instead of hip - // AMDCHECK: {{.*}} hip + // AMDCHECK: {{.*}} hsa printf("omp_get_interop_int returned %s\n", interop_int_to_string(interop_int)); @@ -62,8 +61,7 @@ int main(int argc, char **argv) { return -1; } - // FIXME: This should be hsa instead of hip - // AMDCHECK: {{.*}} hip + // AMDCHECK: {{.*}} hsa printf("omp_get_interop_str returned %s\n", interop_fr_name); #pragma omp interop destroy(iobj) From df676c1f1a218b8c6edf0e9556afda6cacf7c2f4 Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Thu, 2 Oct 2025 06:27:33 -0500 Subject: [PATCH 3/6] Address review feedback - Added Nvidia run line - Added loop around all devices --- offload/test/offloading/interop-print.c | 68 +++++++++++++++---------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index faf47e0a997cd..b0632626868d2 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -2,7 +2,11 @@ // RUN: %libomptarget-run-generic 2>&1 | \ // RUN: %fcheck-generic -check-prefix=AMDCHECK -// REQUIRES: amdgpu +// RUN: %libomptarget-compile-nvptx64-nvidia-cuda +// RUN: %libomptarget-run-generic 2>&1 | \ +// RUN: %fcheck-generic -check-prefix=NVIDIACHECK + +// REQUIRES: gpu #include #include @@ -29,41 +33,49 @@ const char *interop_int_to_string(const int interop_int) { } int main(int argc, char **argv) { - omp_interop_t iobj = omp_interop_none; -#pragma omp interop init(targetsync : iobj) - int err; - int interop_int = omp_get_interop_int(iobj, omp_ipr_fr_id, &err); + // Loop over all available devices + // XXX What happens in machines w/ GPUs from different vendors? + for (int id = 0; id < omp_get_num_devices(); ++id) { + omp_interop_t iobj = omp_interop_none; +#pragma omp interop init(target : iobj) device(id) - if (err) { - fprintf(stderr, "omp_get_interop_int failed: %d\n", err); - return -1; - } + int err; + int interop_int = omp_get_interop_int(iobj, omp_ipr_fr_id, &err); - // AMDCHECK: {{.*}} hsa - printf("omp_get_interop_int returned %s\n", - interop_int_to_string(interop_int)); + if (err) { + fprintf(stderr, "omp_get_interop_int failed: %d\n", err); + return -1; + } - 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; - } + // AMDCHECK: {{.*}} hsa + // NVIDIACHECK: {{.*}} cuda + printf("omp_get_interop_int returned %s\n", + interop_int_to_string(interop_int)); - // AMDCHECK: {{.*}} amd - printf("omp_get_interop_str returned %s\n", interop_vendor); + 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; + } - 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; - } + // AMDCHECK: {{.*}} amd + // NVIDIACHECK: {{.*}} 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; + } - // AMDCHECK: {{.*}} hsa - printf("omp_get_interop_str returned %s\n", interop_fr_name); + // AMDCHECK: {{.*}} hsa + // NVIDIACHECK: {{.*}} cuda + printf("omp_get_interop_str returned %s\n", interop_fr_name); #pragma omp interop destroy(iobj) + } return 0; } From 640ae2725f817036ee88449ba3e71e10a856408f Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Thu, 2 Oct 2025 06:55:08 -0500 Subject: [PATCH 4/6] Fix RUN line for both targets --- offload/test/offloading/interop-print.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index b0632626868d2..59f450e716b88 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -1,10 +1,10 @@ // RUN: %libomptarget-compile-amdgcn-amd-amdhsa // RUN: %libomptarget-run-generic 2>&1 | \ -// RUN: %fcheck-generic -check-prefix=AMDCHECK +// RUN: %fcheck-amdgcn-amd-amdhsa -check-prefixes=AMD // RUN: %libomptarget-compile-nvptx64-nvidia-cuda // RUN: %libomptarget-run-generic 2>&1 | \ -// RUN: %fcheck-generic -check-prefix=NVIDIACHECK +// RUN: %fcheck-nvptx64-nvidia-cuda -check-prefixes=NVIDIA // REQUIRES: gpu @@ -35,10 +35,9 @@ const char *interop_int_to_string(const int interop_int) { int main(int argc, char **argv) { // Loop over all available devices - // XXX What happens in machines w/ GPUs from different vendors? for (int id = 0; id < omp_get_num_devices(); ++id) { omp_interop_t iobj = omp_interop_none; -#pragma omp interop init(target : iobj) device(id) +#pragma omp interop init(targetsync : iobj) device(id) int err; int interop_int = omp_get_interop_int(iobj, omp_ipr_fr_id, &err); @@ -48,8 +47,8 @@ int main(int argc, char **argv) { return -1; } - // AMDCHECK: {{.*}} hsa - // NVIDIACHECK: {{.*}} cuda + // AMD: {{.*}} hsa + // NVIDIA: {{.*}} cuda printf("omp_get_interop_int returned %s\n", interop_int_to_string(interop_int)); @@ -60,8 +59,8 @@ int main(int argc, char **argv) { return -1; } - // AMDCHECK: {{.*}} amd - // NVIDIACHECK: {{.*}} nvidia + // AMD: {{.*}} amd + // NVIDIA: {{.*}} nvidia printf("omp_get_interop_str returned %s\n", interop_vendor); const char *interop_fr_name = @@ -71,8 +70,8 @@ int main(int argc, char **argv) { return -1; } - // AMDCHECK: {{.*}} hsa - // NVIDIACHECK: {{.*}} cuda + // AMD: {{.*}} hsa + // NVIDIA: {{.*}} cuda printf("omp_get_interop_str returned %s\n", interop_fr_name); #pragma omp interop destroy(iobj) From 658d7f290bffd2f9999727b1917198200225e005 Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Thu, 2 Oct 2025 07:38:23 -0500 Subject: [PATCH 5/6] XFAIL on Nvidia and add TODO for AMD --- offload/test/offloading/interop-print.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index 59f450e716b88..e48ddbb1a665c 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -7,6 +7,7 @@ // RUN: %fcheck-nvptx64-nvidia-cuda -check-prefixes=NVIDIA // REQUIRES: gpu +// XFAIL: nvptx64-nvidia-cuda #include #include @@ -37,6 +38,8 @@ 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(targetsync : iobj) device(id) int err; From 88fef28a8ce84959078d1935450d35f6b95baacb Mon Sep 17 00:00:00 2001 From: JP Lehr Date: Thu, 2 Oct 2025 10:00:01 -0500 Subject: [PATCH 6/6] Change targetsync to target after Alex changes --- offload/test/offloading/interop-print.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/offload/test/offloading/interop-print.c b/offload/test/offloading/interop-print.c index e48ddbb1a665c..a3864209e17bc 100644 --- a/offload/test/offloading/interop-print.c +++ b/offload/test/offloading/interop-print.c @@ -40,7 +40,7 @@ int main(int argc, char **argv) { omp_interop_t iobj = omp_interop_none; // TODO: Change targetsync to target when AMD toolchain supports it. -#pragma omp interop init(targetsync : iobj) device(id) +#pragma omp interop init(target : iobj) device(id) int err; int interop_int = omp_get_interop_int(iobj, omp_ipr_fr_id, &err);