[llvm] [OFFLOAD] Restore interop functionality (PR #161429)
Alex Duran via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 1 13:32:26 PDT 2025
https://github.com/adurang updated https://github.com/llvm/llvm-project/pull/161429
>From 0082f58ca1affea188e66817fb91b4a6438d7c08 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 30 Sep 2025 14:43:31 +0200
Subject: [PATCH 1/8] [OFFLOAD] Restore old interop API entries
Implement them as wrappers to the new API
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 32 +++++++++++++++++++++-
offload/libomptarget/exports | 5 +++-
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index eb5425ecbf062..3782dc2ac013c 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -275,7 +275,7 @@ omp_interop_val_t *__tgt_interop_get(ident_t *LocRef, int32_t InteropType,
return Interop;
}
-int __tgt_interop_use(ident_t *LocRef, omp_interop_val_t *Interop,
+int __tgt_interop_use60(ident_t *LocRef, omp_interop_val_t *Interop,
interop_ctx_t *Ctx, dep_pack_t *Deps) {
bool Nowait = Ctx->flags.nowait;
DP("Call to %s with interop " DPxMOD ", nowait %" PRId32 "\n", __func__,
@@ -359,6 +359,36 @@ EXTERN int ompx_interop_add_completion_callback(omp_interop_val_t *Interop,
return omp_irc_success;
}
+// Backwards compatibility wrappers
+void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
+ omp_interop_val_t *&InteropPtr,
+ kmp_interop_type_t InteropType, int32_t DeviceId,
+ int32_t Ndeps, kmp_depend_info_t *DepList,
+ int32_t HaveNowait) {
+ interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
+ dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
+ InteropPtr = __tgt_interop_get(LocRef, InteropType, DeviceId, 0, nullptr,
+ &Ctx, Ndeps ? &Deps : nullptr);
+}
+
+void __tgt_interop_use(ident_t *LocRef, int32_t Gtid,
+ omp_interop_val_t *&InteropPtr, int32_t DeviceId,
+ int32_t Ndeps, kmp_depend_info_t *DepList,
+ int32_t HaveNowait) {
+ interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
+ dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
+ __tgt_interop_use60(LocRef, InteropPtr, &Ctx, Ndeps ? &Deps : nullptr);
+}
+
+void __tgt_interop_destroy(ident_t *LocRef, int32_t Gtid,
+ omp_interop_val_t *&InteropPtr, int32_t DeviceId,
+ int32_t Ndeps, kmp_depend_info_t *DepList,
+ int32_t HaveNowait) {
+ interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
+ dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
+ __tgt_interop_release(LocRef, InteropPtr, &Ctx, Ndeps ? &Deps : nullptr);
+}
+
} // extern "C"
llvm::Expected<DeviceTy &> omp_interop_val_t::getDevice() const {
diff --git a/offload/libomptarget/exports b/offload/libomptarget/exports
index 8e2db6ba8bba4..1374bfea81511 100644
--- a/offload/libomptarget/exports
+++ b/offload/libomptarget/exports
@@ -68,8 +68,11 @@ VERS1.0 {
omp_get_interop_int;
omp_get_interop_name;
omp_get_interop_type_desc;
- __tgt_interop_get;
+ __tgt_interop_init;
__tgt_interop_use;
+ __tgt_interop_destroy;
+ __tgt_interop_get;
+ __tgt_interop_use60;
__tgt_interop_release;
__tgt_target_sync;
__llvmPushCallConfiguration;
>From e520b93e523e066e49b08d7715c227a891a23e21 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 30 Sep 2025 17:19:49 +0200
Subject: [PATCH 2/8] convert interop type correctly
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index 3782dc2ac013c..7aa3a6b019627 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -367,8 +367,8 @@ void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
int32_t HaveNowait) {
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
- InteropPtr = __tgt_interop_get(LocRef, InteropType, DeviceId, 0, nullptr,
- &Ctx, Ndeps ? &Deps : nullptr);
+ InteropPtr = __tgt_interop_get(LocRef, InteropType == 2 ? 1 : 0, DeviceId, 0,
+ nullptr, &Ctx, Ndeps ? &Deps : nullptr);
}
void __tgt_interop_use(ident_t *LocRef, int32_t Gtid,
>From 39175038b75344e1702de8389237935bffef8a04 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 30 Sep 2025 19:08:52 +0200
Subject: [PATCH 3/8] Add cuda plugin interfaces
---
offload/plugins-nextgen/cuda/src/rtl.cpp | 47 ++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp
index b30c651223cad..74fc50c6bbcda 100644
--- a/offload/plugins-nextgen/cuda/src/rtl.cpp
+++ b/offload/plugins-nextgen/cuda/src/rtl.cpp
@@ -917,6 +917,53 @@ struct CUDADeviceTy : public GenericDeviceTy {
return Plugin::success();
}
+ interop_spec_t selectInteropPreference(int32_t InteropType,
+ int32_t NumPrefers,
+ interop_spec_t *Prefers) override {
+ return interop_spec_t{tgt_fr_cuda, {true, 0}, 0};
+ }
+
+ Expected<omp_interop_val_t *>
+ createInterop(int32_t InteropType, interop_spec_t &InteropSpec) override {
+ auto *Ret = new omp_interop_val_t(
+ DeviceId, static_cast<kmp_interop_type_t>(InteropType));
+ Ret->fr_id = tgt_fr_cuda;
+ Ret->vendor_id = omp_vendor_nvidia;
+
+ if (InteropType == kmp_interop_type_target ||
+ InteropType == kmp_interop_type_targetsync) {
+ Ret->device_info.Platform = nullptr;
+ Ret->device_info.Device = reinterpret_cast<void *>(Device);
+ Ret->device_info.Context = Context;
+ }
+
+ if (InteropType == kmp_interop_type_targetsync) {
+ Ret->async_info = new __tgt_async_info();
+ if (auto Err = setContext())
+ return Err;
+ CUstream Stream;
+ if (auto Err = CUDAStreamManager.getResource(
+ *reinterpret_cast<CUstream *>(&Stream)))
+ return Err;
+
+ Ret->async_info->Queue = Stream;
+ }
+ return Ret;
+ }
+
+ Error releaseInterop(omp_interop_val_t *Interop) override {
+ if (!Interop)
+ return Plugin::success();
+
+ if (Interop->async_info) {
+ // TODO: release the stream back to the pool?
+ delete Interop->async_info;
+ }
+ delete Interop;
+
+ return Plugin::success();
+ }
+
Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
AsyncInfoWrapperTy &AsyncInfo) override {
if (auto Err = setContext())
>From f88de96e76ef5a425f4866664ec015acad8960b5 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 30 Sep 2025 19:57:39 +0200
Subject: [PATCH 4/8] Add amd plugin interfaces
---
offload/plugins-nextgen/amdgpu/src/rtl.cpp | 32 ++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
index 7b834ee346e5d..086220cb0057d 100644
--- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp
+++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
@@ -2712,6 +2712,38 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
return Plugin::success();
}
+ interop_spec_t selectInteropPreference(int32_t InteropType,
+ int32_t NumPrefers,
+ interop_spec_t *Prefers) override {
+ // TODO: update once targetsync is supported
+ if (InteropType != kmp_interop_type_target)
+ return interop_spec_t{tgt_fr_hip, {false, 0}, 0};
+ return interop_spec_t{tgt_fr_none, {false, 0}, 0};
+ }
+
+ Expected<omp_interop_val_t *>
+ createInterop(int32_t InteropType, interop_spec_t &InteropSpec) override {
+ auto *Ret = new omp_interop_val_t(
+ DeviceId, static_cast<kmp_interop_type_t>(InteropType));
+ Ret->fr_id = tgt_fr_hip;
+ Ret->vendor_id = omp_vendor_amd;
+
+ // TODO: implement targetsync support
+
+ Ret->device_info.Platform = nullptr;
+ Ret->device_info.Device = reinterpret_cast<void *>(Agent.handle);
+ Ret->device_info.Context = nullptr;
+
+ return Ret;
+ }
+
+ Error releaseInterop(omp_interop_val_t *Interop) override {
+ if (!Interop)
+ return Plugin::success();
+ delete Interop;
+ return Plugin::success();
+ }
+
Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
AsyncInfoWrapperTy &AsyncInfo) override {
AMDGPUStreamTy *Stream = nullptr;
>From a19daf602a28d20a9f8f8a41b6b3575f09c115d8 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Tue, 30 Sep 2025 22:19:30 +0200
Subject: [PATCH 5/8] format nit
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index 7aa3a6b019627..ecf1980af394e 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -276,7 +276,7 @@ omp_interop_val_t *__tgt_interop_get(ident_t *LocRef, int32_t InteropType,
}
int __tgt_interop_use60(ident_t *LocRef, omp_interop_val_t *Interop,
- interop_ctx_t *Ctx, dep_pack_t *Deps) {
+ interop_ctx_t *Ctx, dep_pack_t *Deps) {
bool Nowait = Ctx->flags.nowait;
DP("Call to %s with interop " DPxMOD ", nowait %" PRId32 "\n", __func__,
DPxPTR(Interop), Nowait);
>From e409d5e6556649965b6ccd990e89470485b81bec Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Wed, 1 Oct 2025 16:02:43 +0200
Subject: [PATCH 6/8] fix warning
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index ecf1980af394e..cc318933529af 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -362,7 +362,7 @@ EXTERN int ompx_interop_add_completion_callback(omp_interop_val_t *Interop,
// Backwards compatibility wrappers
void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
omp_interop_val_t *&InteropPtr,
- kmp_interop_type_t InteropType, int32_t DeviceId,
+ int32_t InteropType, int32_t DeviceId,
int32_t Ndeps, kmp_depend_info_t *DepList,
int32_t HaveNowait) {
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
>From 506169f12ee9b987fad9733308352ccfd94befa3 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Wed, 1 Oct 2025 16:09:23 +0200
Subject: [PATCH 7/8] format
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index cc318933529af..5f6708d525d98 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -361,10 +361,9 @@ EXTERN int ompx_interop_add_completion_callback(omp_interop_val_t *Interop,
// Backwards compatibility wrappers
void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
- omp_interop_val_t *&InteropPtr,
- int32_t InteropType, int32_t DeviceId,
- int32_t Ndeps, kmp_depend_info_t *DepList,
- int32_t HaveNowait) {
+ omp_interop_val_t *&InteropPtr, int32_t InteropType,
+ int32_t DeviceId, int32_t Ndeps,
+ kmp_depend_info_t *DepList, int32_t HaveNowait) {
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
InteropPtr = __tgt_interop_get(LocRef, InteropType == 2 ? 1 : 0, DeviceId, 0,
>From 07594d0cb9d50f475582cf3175216a49d35f0c83 Mon Sep 17 00:00:00 2001
From: Alex Duran <alejandro.duran at intel.com>
Date: Wed, 1 Oct 2025 22:32:05 +0200
Subject: [PATCH 8/8] address reviews
---
offload/libomptarget/OpenMP/InteropAPI.cpp | 9 +++++++--
offload/plugins-nextgen/amdgpu/src/rtl.cpp | 5 ++---
offload/plugins-nextgen/cuda/src/rtl.cpp | 3 +--
3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/offload/libomptarget/OpenMP/InteropAPI.cpp b/offload/libomptarget/OpenMP/InteropAPI.cpp
index 5f6708d525d98..d803a71c4d5be 100644
--- a/offload/libomptarget/OpenMP/InteropAPI.cpp
+++ b/offload/libomptarget/OpenMP/InteropAPI.cpp
@@ -364,10 +364,15 @@ void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
omp_interop_val_t *&InteropPtr, int32_t InteropType,
int32_t DeviceId, int32_t Ndeps,
kmp_depend_info_t *DepList, int32_t HaveNowait) {
+ constexpr int32_t old_kmp_interop_type_targetsync = 2;
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
- InteropPtr = __tgt_interop_get(LocRef, InteropType == 2 ? 1 : 0, DeviceId, 0,
- nullptr, &Ctx, Ndeps ? &Deps : nullptr);
+ InteropPtr =
+ __tgt_interop_get(LocRef,
+ InteropType == old_kmp_interop_type_targetsync
+ ? kmp_interop_type_targetsync
+ : kmp_interop_type_target,
+ DeviceId, 0, nullptr, &Ctx, Ndeps ? &Deps : nullptr);
}
void __tgt_interop_use(ident_t *LocRef, int32_t Gtid,
diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
index 086220cb0057d..965a38ae9ef24 100644
--- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp
+++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
@@ -2738,9 +2738,8 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
}
Error releaseInterop(omp_interop_val_t *Interop) override {
- if (!Interop)
- return Plugin::success();
- delete Interop;
+ if (Interop)
+ delete Interop;
return Plugin::success();
}
diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp
index 74fc50c6bbcda..c863e5cb602f1 100644
--- a/offload/plugins-nextgen/cuda/src/rtl.cpp
+++ b/offload/plugins-nextgen/cuda/src/rtl.cpp
@@ -942,8 +942,7 @@ struct CUDADeviceTy : public GenericDeviceTy {
if (auto Err = setContext())
return Err;
CUstream Stream;
- if (auto Err = CUDAStreamManager.getResource(
- *reinterpret_cast<CUstream *>(&Stream)))
+ if (auto Err = CUDAStreamManager.getResource(Stream))
return Err;
Ret->async_info->Queue = Stream;
More information about the llvm-commits
mailing list