Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions offload/libomptarget/OpenMP/InteropAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ void *getProperty<void *>(omp_interop_val_t &InteropVal,
case omp_ipr_device_context:
return InteropVal.device_info.Context;
case omp_ipr_targetsync:
return InteropVal.async_info->Queue;
return InteropVal.async_info ? InteropVal.async_info->Queue : nullptr;
default:;
}
getTypeMismatch(Property, Err);
Expand Down Expand Up @@ -167,7 +167,6 @@ bool getPropertyCheck(omp_interop_val_t **InteropPtr,
omp_interop_property_t property_id, \
int *err) { \
omp_interop_val_t *interop_val = (omp_interop_val_t *)interop; \
assert((interop_val)->interop_type == kmp_interop_type_targetsync); \
if (!getPropertyCheck(&interop_val, property_id, err)) { \
return (RETURN_TYPE)(0); \
} \
Expand Down Expand Up @@ -275,8 +274,8 @@ 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,
interop_ctx_t *Ctx, dep_pack_t *Deps) {
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__,
DPxPTR(Interop), Nowait);
Expand Down Expand Up @@ -359,6 +358,40 @@ 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, 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 == 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,
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 {
Expand Down
5 changes: 4 additions & 1 deletion offload/libomptarget/exports
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
31 changes: 31 additions & 0 deletions offload/plugins-nextgen/amdgpu/src/rtl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2712,6 +2712,37 @@ 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_hsa, {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_hsa;
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)
delete Interop;
return Plugin::success();
}

Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
AsyncInfoWrapperTy &AsyncInfo) override {
AMDGPUStreamTy *Stream = nullptr;
Expand Down
44 changes: 44 additions & 0 deletions offload/plugins-nextgen/cuda/src/rtl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,50 @@ 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(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)
delete Interop->async_info;

delete Interop;
return Plugin::success();
}

Error enqueueHostCallImpl(void (*Callback)(void *), void *UserData,
AsyncInfoWrapperTy &AsyncInfo) override {
if (auto Err = setContext())
Expand Down
Loading