Skip to content

Commit 01439f9

Browse files
adurangmahesh-attarde
authored andcommitted
[OFFLOAD] Restore interop functionality (llvm#161429)
This implements two pieces to restore the interop functionality (that I broke) when the 6.0 interfaces were added: * A set of wrappers that support the old interfaces on top of the new ones * The same level of interop support for the CUDA amd AMD plugins
1 parent 7b2f3db commit 01439f9

File tree

4 files changed

+116
-5
lines changed

4 files changed

+116
-5
lines changed

offload/libomptarget/OpenMP/InteropAPI.cpp

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void *getProperty<void *>(omp_interop_val_t &InteropVal,
124124
case omp_ipr_device_context:
125125
return InteropVal.device_info.Context;
126126
case omp_ipr_targetsync:
127-
return InteropVal.async_info->Queue;
127+
return InteropVal.async_info ? InteropVal.async_info->Queue : nullptr;
128128
default:;
129129
}
130130
getTypeMismatch(Property, Err);
@@ -167,7 +167,6 @@ bool getPropertyCheck(omp_interop_val_t **InteropPtr,
167167
omp_interop_property_t property_id, \
168168
int *err) { \
169169
omp_interop_val_t *interop_val = (omp_interop_val_t *)interop; \
170-
assert((interop_val)->interop_type == kmp_interop_type_targetsync); \
171170
if (!getPropertyCheck(&interop_val, property_id, err)) { \
172171
return (RETURN_TYPE)(0); \
173172
} \
@@ -275,8 +274,8 @@ omp_interop_val_t *__tgt_interop_get(ident_t *LocRef, int32_t InteropType,
275274
return Interop;
276275
}
277276

278-
int __tgt_interop_use(ident_t *LocRef, omp_interop_val_t *Interop,
279-
interop_ctx_t *Ctx, dep_pack_t *Deps) {
277+
int __tgt_interop_use60(ident_t *LocRef, omp_interop_val_t *Interop,
278+
interop_ctx_t *Ctx, dep_pack_t *Deps) {
280279
bool Nowait = Ctx->flags.nowait;
281280
DP("Call to %s with interop " DPxMOD ", nowait %" PRId32 "\n", __func__,
282281
DPxPTR(Interop), Nowait);
@@ -359,6 +358,40 @@ EXTERN int ompx_interop_add_completion_callback(omp_interop_val_t *Interop,
359358
return omp_irc_success;
360359
}
361360

361+
// Backwards compatibility wrappers
362+
void __tgt_interop_init(ident_t *LocRef, int32_t Gtid,
363+
omp_interop_val_t *&InteropPtr, int32_t InteropType,
364+
int32_t DeviceId, int32_t Ndeps,
365+
kmp_depend_info_t *DepList, int32_t HaveNowait) {
366+
constexpr int32_t old_kmp_interop_type_targetsync = 2;
367+
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
368+
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
369+
InteropPtr =
370+
__tgt_interop_get(LocRef,
371+
InteropType == old_kmp_interop_type_targetsync
372+
? kmp_interop_type_targetsync
373+
: kmp_interop_type_target,
374+
DeviceId, 0, nullptr, &Ctx, Ndeps ? &Deps : nullptr);
375+
}
376+
377+
void __tgt_interop_use(ident_t *LocRef, int32_t Gtid,
378+
omp_interop_val_t *&InteropPtr, int32_t DeviceId,
379+
int32_t Ndeps, kmp_depend_info_t *DepList,
380+
int32_t HaveNowait) {
381+
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
382+
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
383+
__tgt_interop_use60(LocRef, InteropPtr, &Ctx, Ndeps ? &Deps : nullptr);
384+
}
385+
386+
void __tgt_interop_destroy(ident_t *LocRef, int32_t Gtid,
387+
omp_interop_val_t *&InteropPtr, int32_t DeviceId,
388+
int32_t Ndeps, kmp_depend_info_t *DepList,
389+
int32_t HaveNowait) {
390+
interop_ctx_t Ctx = {0, {false, (bool)HaveNowait, 0}, Gtid};
391+
dep_pack_t Deps = {Ndeps, 0, DepList, nullptr};
392+
__tgt_interop_release(LocRef, InteropPtr, &Ctx, Ndeps ? &Deps : nullptr);
393+
}
394+
362395
} // extern "C"
363396

364397
llvm::Expected<DeviceTy &> omp_interop_val_t::getDevice() const {

offload/libomptarget/exports

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@ VERS1.0 {
6868
omp_get_interop_int;
6969
omp_get_interop_name;
7070
omp_get_interop_type_desc;
71-
__tgt_interop_get;
71+
__tgt_interop_init;
7272
__tgt_interop_use;
73+
__tgt_interop_destroy;
74+
__tgt_interop_get;
75+
__tgt_interop_use60;
7376
__tgt_interop_release;
7477
__tgt_target_sync;
7578
__llvmPushCallConfiguration;

offload/plugins-nextgen/amdgpu/src/rtl.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2712,6 +2712,37 @@ struct AMDGPUDeviceTy : public GenericDeviceTy, AMDGenericDeviceTy {
27122712
return Plugin::success();
27132713
}
27142714

2715+
interop_spec_t selectInteropPreference(int32_t InteropType,
2716+
int32_t NumPrefers,
2717+
interop_spec_t *Prefers) override {
2718+
// TODO: update once targetsync is supported
2719+
if (InteropType == kmp_interop_type_target)
2720+
return interop_spec_t{tgt_fr_hsa, {false, 0}, 0};
2721+
return interop_spec_t{tgt_fr_none, {false, 0}, 0};
2722+
}
2723+
2724+
Expected<omp_interop_val_t *>
2725+
createInterop(int32_t InteropType, interop_spec_t &InteropSpec) override {
2726+
auto *Ret = new omp_interop_val_t(
2727+
DeviceId, static_cast<kmp_interop_type_t>(InteropType));
2728+
Ret->fr_id = tgt_fr_hsa;
2729+
Ret->vendor_id = omp_vendor_amd;
2730+
2731+
// TODO: implement targetsync support
2732+
2733+
Ret->device_info.Platform = nullptr;
2734+
Ret->device_info.Device = reinterpret_cast<void *>(Agent.handle);
2735+
Ret->device_info.Context = nullptr;
2736+
2737+
return Ret;
2738+
}
2739+
2740+
Error releaseInterop(omp_interop_val_t *Interop) override {
2741+
if (Interop)
2742+
delete Interop;
2743+
return Plugin::success();
2744+
}
2745+
27152746
Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
27162747
AsyncInfoWrapperTy &AsyncInfo) override {
27172748
AMDGPUStreamTy *Stream = nullptr;

offload/plugins-nextgen/cuda/src/rtl.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,50 @@ struct CUDADeviceTy : public GenericDeviceTy {
917917
return Plugin::success();
918918
}
919919

920+
interop_spec_t selectInteropPreference(int32_t InteropType,
921+
int32_t NumPrefers,
922+
interop_spec_t *Prefers) override {
923+
return interop_spec_t{tgt_fr_cuda, {true, 0}, 0};
924+
}
925+
926+
Expected<omp_interop_val_t *>
927+
createInterop(int32_t InteropType, interop_spec_t &InteropSpec) override {
928+
auto *Ret = new omp_interop_val_t(
929+
DeviceId, static_cast<kmp_interop_type_t>(InteropType));
930+
Ret->fr_id = tgt_fr_cuda;
931+
Ret->vendor_id = omp_vendor_nvidia;
932+
933+
if (InteropType == kmp_interop_type_target ||
934+
InteropType == kmp_interop_type_targetsync) {
935+
Ret->device_info.Platform = nullptr;
936+
Ret->device_info.Device = reinterpret_cast<void *>(Device);
937+
Ret->device_info.Context = Context;
938+
}
939+
940+
if (InteropType == kmp_interop_type_targetsync) {
941+
Ret->async_info = new __tgt_async_info();
942+
if (auto Err = setContext())
943+
return Err;
944+
CUstream Stream;
945+
if (auto Err = CUDAStreamManager.getResource(Stream))
946+
return Err;
947+
948+
Ret->async_info->Queue = Stream;
949+
}
950+
return Ret;
951+
}
952+
953+
Error releaseInterop(omp_interop_val_t *Interop) override {
954+
if (!Interop)
955+
return Plugin::success();
956+
957+
if (Interop->async_info)
958+
delete Interop->async_info;
959+
960+
delete Interop;
961+
return Plugin::success();
962+
}
963+
920964
Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
921965
AsyncInfoWrapperTy &AsyncInfo) override {
922966
if (auto Err = setContext())

0 commit comments

Comments
 (0)