Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
34 changes: 32 additions & 2 deletions offload/libomptarget/OpenMP/InteropAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,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 +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 == 2 ? 1 : 0, 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
32 changes: 32 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,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;
Expand Down
47 changes: 47 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,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())
Expand Down
Loading