[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 361079. sriharikrishna added a comment. OMPIRBuilder for Interop directive. Squashed commit Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2173,6 +2173,96 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit(const LocationDescription &Loc, +Value *InteropVar, +omp::OMPInteropType InteropType, +Value *Device, +Value *NumDependences, +Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + Constant *InteropTypeVal = + ConstantInt::get(Int64, (int)InteropType); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, + Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_use); + + return Builder.CreateCall(Fn, Args); +} + CallInst *OpenMPIRBuilder::createCach
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 361186. sriharikrishna added a comment. OMPIRBuilder for Interop directive. Squashed commit Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2173,6 +2173,96 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit(const LocationDescription &Loc, +Value *InteropVar, +omp::OMPInteropType InteropType, +Value *Device, +Value *NumDependences, +Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + Constant *InteropTypeVal = + ConstantInt::get(Int64, (int)InteropType); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, + Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_use); + + return Builder.CreateCall(Fn, Args); +} + CallInst *OpenMPIRBuilder::createCach
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna marked an inline comment as done. sriharikrishna added inline comments. Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:6330-6331 + if (const auto *C = S.getSingleClause()) { +llvm::Value *InteropvarPtr = +EmitLValue(C->getInteropVar()).getPointer(*this); +llvm::omp::OMPInteropType InteropType = llvm::omp::OMPInteropType::Unknown; ABataev wrote: > This code is common for all `if-else` braches, move out of the conditional > blocks? Moving the common line out will require checking the kind of clause in the directive. So, I prefer to leave it as is. Comment at: clang/lib/CodeGen/CGStmtOpenMP.cpp:6335-6336 + InteropType = llvm::omp::OMPInteropType::Target; +else if (C->getIsTargetSync()) + InteropType = llvm::omp::OMPInteropType::TargetSync; +OMPBuilder.createOMPInteropInit(Builder, InteropvarPtr, InteropType, Device, ABataev wrote: > Can we have anything else rather than `C->getIsTargetSync()` here? If no, > then it should look like this: > ``` > if (C->getIsTarget()) { > InteropType = llvm::omp::OMPInteropType::Target; > } else { > assert(C->getIsTargetSync() && "Expected ..."); > InteropType = llvm::omp::OMPInteropType::TargetSync; > } > ``` The standard only allows for Target and TargetSync. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 361913. sriharikrishna marked an inline comment as done. sriharikrishna added a comment. OMPIRBuilder for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2173,6 +2173,96 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit(const LocationDescription &Loc, +Value *InteropVar, +omp::OMPInteropType InteropType, +Value *Device, +Value *NumDependences, +Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + Constant *InteropTypeVal = + ConstantInt::get(Int64, (int)InteropType); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, +bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, + Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_use); + + return Builder.CreateCall(Fn, Args); +} + CallInst
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 362070. sriharikrishna added a comment. OMPIRBuilder for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2173,6 +2173,90 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit( +const LocationDescription &Loc, Value *InteropVar, +omp::OMPInteropType InteropType, Value *Device, Value *NumDependences, +Value *DependenceAddress, bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + Constant *InteropTypeVal = ConstantInt::get(Int64, (int)InteropType); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_use); + + return Builder.CreateCall(Fn, Args); +} + CallInst *OpenMPIRBuilder::createCachedThreadPrivate( const LocationDescription &Loc, llvm::Value *Pointer, llvm::ConstantInt *Size, const llvm::Twine &Name) { Index: llvm/include/llvm/Frontend/OpenMP/OMPKinds.def === --- llvm/include/llvm/Frontend/OpenMP/OMPKinds.def +++ llvm/include/llvm/Frontend/OpenMP/OMPKinds.def @
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 362266. sriharikrishna added a comment. Herald added subscribers: llvm-commits, cfe-commits, hiraditya. Herald added projects: clang, LLVM. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,135 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { + assert(0); +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) { +return (*fptr)(interop); + } else { // liboffload & libomptarget don't exist +return 0; + } +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return 0; + } +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return (void *)0; + }
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 362269. sriharikrishna added a comment. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,135 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { + assert(0); +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) { +return (*fptr)(interop); + } else { // liboffload & libomptarget don't exist +return 0; + } +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return 0; + } +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return (void *)0; + } +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop, +omp_interop_property_t property_id, +int *err) { + const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str"))) { +return (*fptr)(interop,
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 362280. sriharikrishna added a comment. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,134 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) { +return (*fptr)(interop); + } else { // liboffload & libomptarget don't exist +return 0; + } +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return 0; + } +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) { +return (*fptr)(interop, property_id, err); + } else { // liboffload & libomptarget don't exist +return (void *)0; + } +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop, +omp_interop_property_t property_id, +int *err) { + const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str"))) { +return (*fptr)(interop, property_id,
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 362524. sriharikrishna added a comment. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,120 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) +return (*fptr)(interop); + return 0; +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) +return (*fptr)(interop, property_id, err); + return 0; +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop, +omp_interop_property_t property_id, +int *err) { + const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_NAME( +const omp_interop_t interop, omp_interop_property_t prop
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna created this revision. sriharikrishna added reviewers: jdoerfert, ABataev, RaviNarayanaswamy. Herald added a subscriber: hiraditya. sriharikrishna requested review of this revision. Herald added subscribers: llvm-commits, cfe-commits, sstefan1. Herald added projects: clang, LLVM. Implements the OMPIRBuilder portion for the Interop directive. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2173,6 +2173,96 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit(const LocationDescription &Loc, +Value *InteropVar, +OMPInteropType InteropType, +llvm::Value *Device, +llvm::Value *NumDependences, +llvm::Value *DependenceAddress, +int HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + ConstantInt *InteropTypeVal = + ConstantInt::get(M.getContext(), APInt(64, (int)InteropType, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); +PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTy_0); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, llvm::Value *Device, +llvm::Value *NumDependences, llvm::Value *DependenceAddress, +int HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); +PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTy_0); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, + llvm::Value *Device, + llvm::Value *NumDependences, + llvm::Value *DependenceAddress, + int HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); +PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTy_0); + } + Value *HaveNowaitClauseVal = + ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); + Value *
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 358587. sriharikrishna added a comment. Address reviewer comments Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmtOpenMP.cpp clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2175,11 +2175,11 @@ CallInst *OpenMPIRBuilder::createOMPInteropInit(const LocationDescription &Loc, Value *InteropVar, -OMPInteropType InteropType, -llvm::Value *Device, -llvm::Value *NumDependences, -llvm::Value *DependenceAddress, -int HaveNowaitClause) { +omp::OMPInteropType InteropType, +Value *Device, +Value *NumDependences, +Value *DependenceAddress, +bool HaveNowaitClause) { IRBuilder<>::InsertPointGuard IPG(Builder); Builder.restoreIP(Loc.IP); @@ -2188,12 +2188,12 @@ Value *ThreadId = getOrCreateThreadID(Ident); if (Device == NULL) Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); - ConstantInt *InteropTypeVal = - ConstantInt::get(M.getContext(), APInt(64, (int)InteropType, true)); + Constant *InteropTypeVal = + ConstantInt::get(Int64, (int)InteropType); if (NumDependences == nullptr) { -NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); -PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); -DependenceAddress = ConstantPointerNull::get(PointerTy_0); +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); } Value *HaveNowaitClauseVal = ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); @@ -2207,9 +2207,9 @@ } CallInst *OpenMPIRBuilder::createOMPInteropDestroy( -const LocationDescription &Loc, Value *InteropVar, llvm::Value *Device, -llvm::Value *NumDependences, llvm::Value *DependenceAddress, -int HaveNowaitClause) { +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, +bool HaveNowaitClause) { IRBuilder<>::InsertPointGuard IPG(Builder); Builder.restoreIP(Loc.IP); @@ -2219,9 +2219,9 @@ if (Device == NULL) Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); if (NumDependences == nullptr) { -NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); -PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); -DependenceAddress = ConstantPointerNull::get(PointerTy_0); +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); } Value *HaveNowaitClauseVal = ConstantInt::get(M.getContext(), APInt(32, HaveNowaitClause, true)); @@ -2236,10 +2236,10 @@ CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, Value *InteropVar, - llvm::Value *Device, - llvm::Value *NumDependences, - llvm::Value *DependenceAddress, - int HaveNowaitClause) { + Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { IRBuilder<>::InsertPointGuard IPG(Builder); Builder.restoreIP(Loc.IP); Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); @@ -2248,9 +2248,9 @@ if (Device == NULL) Device = ConstantInt::get(M.getContext(), APInt(32, -1, true)); if (NumDependences == nullptr) { -NumDependences = ConstantInt::get(M.getContext(), APInt(32, 0, true)); -PointerType *PointerTy_0 = llvm::Type::getInt8PtrTy(M.getContext()); -DependenceAddress = ConstantPointerNull::get(PointerTy_0); +
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 358631. sriharikrishna added a comment. OMPIRBuilder for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmtOpenMP.cpp clang/test/OpenMP/interop_irbuilder.cpp Index: clang/test/OpenMP/interop_irbuilder.cpp === --- clang/test/OpenMP/interop_irbuilder.cpp +++ clang/test/OpenMP/interop_irbuilder.cpp @@ -1,5 +1,5 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs -// RUN: %clang_cc1 -verify -fopenmp -o - %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -emit-llvm %s -o - | FileCheck %s // expected-no-diagnostics typedef void *omp_interop_t; @@ -23,3 +23,197 @@ #pragma omp interop destroy(interop) depend(in:D0, D1) } +// ###: %clang_cc1 -verify -fopenmp -emit-llvm -o -| FileCheck %s +// CHECK-64-LABEL: @_Z5test1v( +// CHECK-64-NEXT: entry: +// CHECK-64-NEXT:[[DEVICE_ID:%.*]] = alloca i32, align 4 +// CHECK-64-NEXT:[[D0:%.*]] = alloca i32, align 4 +// CHECK-64-NEXT:[[D1:%.*]] = alloca i32, align 4 +// CHECK-64-NEXT:[[INTEROP:%.*]] = alloca i8*, align 8 +// CHECK-64-NEXT:[[DOTDEP_ARR_ADDR:%.*]] = alloca [2 x %struct.kmp_depend_info], align 8 +// CHECK-64-NEXT:[[DEP_COUNTER_ADDR:%.*]] = alloca i64, align 8 +// CHECK-64-NEXT:[[DOTDEP_ARR_ADDR5:%.*]] = alloca [2 x %struct.kmp_depend_info], align 8 +// CHECK-64-NEXT:[[DEP_COUNTER_ADDR6:%.*]] = alloca i64, align 8 +// CHECK-64-NEXT:store i32 4, i32* [[DEVICE_ID]], align 4 +// CHECK-64-NEXT:[[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) +// CHECK-64-NEXT:call void @__kmpc_interop_init(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]], i8** [[INTEROP]], i64 1, i32 -1, i32 0, i8* null, i32 0) +// CHECK-64-NEXT:[[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) +// CHECK-64-NEXT:call void @__kmpc_interop_init(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i8** [[INTEROP]], i64 2, i32 -1, i32 0, i8* null, i32 0) +// CHECK-64-NEXT:[[TMP0:%.*]] = load i32, i32* [[DEVICE_ID]], align 4 +// CHECK-64-NEXT:[[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) +// CHECK-64-NEXT:call void @__kmpc_interop_init(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM2]], i8** [[INTEROP]], i64 1, i32 [[TMP0]], i32 0, i8* null, i32 0) +// CHECK-64-NEXT:[[TMP1:%.*]] = load i32, i32* [[DEVICE_ID]], align 4 +// CHECK-64-NEXT:[[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) +// CHECK-64-NEXT:call void @__kmpc_interop_init(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i8** [[INTEROP]], i64 2, i32 [[TMP1]], i32 0, i8* null, i32 0) +// CHECK-64-NEXT:[[TMP2:%.*]] = getelementptr inbounds [2 x %struct.kmp_depend_info], [2 x %struct.kmp_depend_info]* [[DOTDEP_ARR_ADDR]], i64 0, i64 0 +// CHECK-64-NEXT:[[TMP3:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO:%.*]], %struct.kmp_depend_info* [[TMP2]], i64 0 +// CHECK-64-NEXT:[[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP3]], i32 0, i32 0 +// CHECK-64-NEXT:[[TMP5:%.*]] = ptrtoint i32* [[D0]] to i64 +// CHECK-64-NEXT:store i64 [[TMP5]], i64* [[TMP4]], align 8 +// CHECK-64-NEXT:[[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP3]], i32 0, i32 1 +// CHECK-64-NEXT:store i64 4, i64* [[TMP6]], align 8 +// CHECK-64-NEXT:[[TMP7:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP3]], i32 0, i32 2 +// CHECK-64-NEXT:store i8 1, i8* [[TMP7]], align 8 +// CHECK-64-NEXT:[[TMP8:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP2]], i64 1 +// CHECK-64-NEXT:[[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP8]], i32 0, i32 0 +// CHECK-64-NEXT:[[TMP10:%.*]] = ptrtoint i32* [[D1]] to i64 +// CHECK-64-NEXT:store i64 [[TMP10]], i64* [[TMP9]], align 8 +// CHECK-64-NEXT:[[TMP11:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP8]], i32 0, i32 1 +// CHECK-64-NEXT:store i64 4, i64* [[TMP11]], align 8 +// CHECK-64-NEXT:[[TMP12:%.*]] = getelementptr inbounds [[STRUCT_KMP_DEPEND_INFO]], %struct.kmp_depend_info* [[TMP8]], i32 0, i32 2 +// CHECK-64-NEXT:store i8 1, i8* [[TMP12]], align 8 +// CHECK-64-NEXT:store i64 2, i64* [[DEP_COUNTER_ADDR]], align 8 +// CHECK-64-NEXT:[[TMP13:%.*]] = bitcast %struct.kmp_depend_info* [[TMP2]] to i8* +// CHECK-64-NEXT:[[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.iden
[PATCH] D106674: Runtime for Interop directive
sriharikrishna marked an inline comment as not done. sriharikrishna added inline comments. Comment at: openmp/libomptarget/src/interop.cpp:198-201 + if (interop_type == kmp_interop_type_tasksync) { +__kmpc_omp_wait_deps(loc_ref, gtid, ndeps, dep_list, ndeps_noalias, + noalias_dep_list); + } RaviNarayanaswamy wrote: > jdoerfert wrote: > > RaviNarayanaswamy wrote: > > > jdoerfert wrote: > > > > RaviNarayanaswamy wrote: > > > > > jdoerfert wrote: > > > > > > RaviNarayanaswamy wrote: > > > > > > > Interop object does not wait for any task from libomp. > > > > > > > Init just initializes the interop object. > > > > > > > The initialization of interop object should be done by the > > > > > > > plugin as only the plugin knows what properties are supported > > > > > > > Interop object does not wait for any task from libomp. > > > > > > > > > > > > I don't know why you think we would not wait for libomp tasks. If > > > > > > we have dependences we need to wait for them. > > > > > > > > > > > > > The initialization of interop object should be done by the plugin > > > > > > > as only the plugin knows what properties are supported. > > > > > > > > > > > > It is, below. This is the generic part that then redirects to the > > > > > > plugin. > > > > > Libomp would have not invoked the task which calls this routine if > > > > > there are dependences. They must be executed before the task > > > > > containing the interop creation is scheduled. > > > > > > > > > > The interop_type should be passed to plugin and let it initialize the > > > > > common for all interop-types and then add based on the interop_type > > > > > Libomp would have not invoked the task which calls this routine if > > > > > there are dependences. They must be executed before the task > > > > > containing the interop creation is scheduled. > > > > > > > > To me it seems you are assuming that we create a task in which this > > > > routine is called. We do not, as far as I can tell. See D105876. > > > > > > > > > The interop_type should be passed to plugin and let it initialize the > > > > > common for all interop-types and then add based on the interop_type > > > > > > > > So what you are trying to say is that `init_device_info` should take > > > > the `interop_type` too? That makes sense to me. But as discussed in > > > > other reviews recently, we should not extend the API for "future use > > > > cases" but extend it as use cases become relevant. For now it seems we > > > > can simply set up the `tgt_device_info` part of the `omp_interop_val_t` > > > > without knowing the `interop_type`. > > > Then need to change this code since the interop_type can be both > > > target_sync and target which will not be handled correctly. target_sync > > > and target have common initialization + additional property base don the > > > interop_type requested > > > Then need to change this code since the interop_type can be both > > > target_sync and target which will not be handled correctly. target_sync > > > and target have common initialization + additional property base don the > > > interop_type requested > > > > Could you please elaborate what needs to be changed exactly. What > > information is currently not available in the setup as is? What properties > > would be different? > Should be something like this > > // NEED to add _kmp_interop_type_target to represent interop target > // interop_ptr->device_info would initialize the following: device handle, > device_context, platform. > if (interop_type == kmp_interop_type_target) { > if (!Device.RTL || !Device.RTL->init_device_info || > Device.RTL->init_device_info(device_id, &(interop_ptr)->device_info, > &(interop_ptr)->err_str)) { > delete interop_ptr; > interop_ptr = omp_interop_none; > } > // Add target sync if request. > if (interop_type == kmp_interop_type_tasksync) { > if (!Device.RTL || !Device.RTL->init_async_info || > Device.RTL->init_async_info(device_id, &(interop_ptr)->async_info)) { > delete interop_ptr; > interop_ptr = omp_interop_none; > } > > > It looks like the code you have written for kmp_interop_type_target already exists in the else part. So I am still puzzled about this. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 381800. sriharikrishna added a comment. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/libomptarget/test/offloading/interop.c openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,120 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) +return (*fptr)(interop); + return 0; +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) +return (*fptr)(interop, property_id, err); + return 0; +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop, +omp_interop_property_t property_id, +int *err) { + const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_NAME( +const om
[PATCH] D106674: Runtime for Interop directive
sriharikrishna updated this revision to Diff 381801. sriharikrishna marked 16 inline comments as done. sriharikrishna added a comment. Runtime for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 Files: openmp/libomptarget/include/interop.h openmp/libomptarget/include/omptarget.h openmp/libomptarget/include/omptargetplugin.h openmp/libomptarget/plugins/cuda/src/rtl.cpp openmp/libomptarget/plugins/exports openmp/libomptarget/src/CMakeLists.txt openmp/libomptarget/src/exports openmp/libomptarget/src/interop.cpp openmp/libomptarget/src/private.h openmp/libomptarget/src/rtl.cpp openmp/libomptarget/src/rtl.h openmp/libomptarget/test/offloading/interop.c openmp/runtime/src/dllexports openmp/runtime/src/kmp_ftn_entry.h openmp/runtime/src/kmp_ftn_os.h Index: openmp/runtime/src/kmp_ftn_os.h === --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -140,6 +140,14 @@ #define FTN_SET_TEAMS_THREAD_LIMIT omp_set_teams_thread_limit #define FTN_GET_TEAMS_THREAD_LIMIT omp_get_teams_thread_limit +#define FTN_GET_NUM_INTEROP_PROPERTIES omp_get_num_interop_properties +#define FTN_GET_INTEROP_INT omp_get_interop_int +#define FTN_GET_INTEROP_PTR omp_get_interop_ptr +#define FTN_GET_INTEROP_STR omp_get_interop_str +#define FTN_GET_INTEROP_NAME omp_get_interop_name +#define FTN_GET_INTEROP_TYPE_DESC omp_get_interop_type_desc +#define FTN_GET_INTEROP_RC_DESC omp_get_interop_rc_desc + #endif /* KMP_FTN_PLAIN */ /* */ Index: openmp/runtime/src/kmp_ftn_entry.h === --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1446,6 +1446,120 @@ #endif } +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { + omp_ipr_fr_id = -1, + omp_ipr_fr_name = -2, + omp_ipr_vendor = -3, + omp_ipr_vendor_name = -4, + omp_ipr_device_num = -5, + omp_ipr_platform = -6, + omp_ipr_device = -7, + omp_ipr_device_context = -8, + omp_ipr_targetsync = -9, + omp_ipr_first = -9 +} omp_interop_property_t; + +#define omp_interop_none 0 + +typedef enum omp_interop_rc { + omp_irc_no_value = 1, + omp_irc_success = 0, + omp_irc_empty = -1, + omp_irc_out_of_range = -2, + omp_irc_type_int = -3, + omp_irc_type_ptr = -4, + omp_irc_type_str = -5, + omp_irc_other = -6 +} omp_interop_rc_t; + +typedef enum omp_interop_fr { + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_last = 7 +} omp_interop_fr_t; + +typedef void *omp_interop_t; + +// libomptarget, if loaded, provides this function +int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) { +#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) + return 0; +#else + int (*fptr)(const omp_interop_t); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties"))) +return (*fptr)(interop); + return 0; +#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) +} + +/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp +// libomptarget, if loaded, provides this function +intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int"))) +return (*fptr)(interop, property_id, err); + return 0; +} + +// libomptarget, if loaded, provides this function +void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop, + omp_interop_property_t property_id, + int *err) { + void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop, +omp_interop_property_t property_id, +int *err) { + const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *); + if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str"))) +return (*fptr)(interop, property_id, err); + return nullptr; +} + +// libomptarget, if loaded, provides this function +const cha
[PATCH] D106674: Runtime for Interop directive
sriharikrishna marked 3 inline comments as done. sriharikrishna added inline comments. Comment at: openmp/libomptarget/src/interop.cpp:239-242 + if (interop_val->interop_type == kmp_interop_type_tasksync) { +__kmpc_omp_wait_deps(loc_ref, gtid, ndeps, dep_list, ndeps_noalias, + noalias_dep_list); + } RaviNarayanaswamy wrote: > Need to flush the queue if interop object was created with targetsync A TODO has been left because flushing is not supported. Comment at: openmp/libomptarget/src/interop.cpp:260-263 + if (interop_val->interop_type == kmp_interop_type_tasksync) { +__kmpc_omp_wait_deps(loc_ref, gtid, ndeps, dep_list, ndeps_noalias, + noalias_dep_list); + } jdoerfert wrote: > RaviNarayanaswamy wrote: > > You don't wait for the omp tasks. Need to flush the queue associated with > > the interop through the plugin > Waiting for omp task is necessary and the above should do it. Flushing and > signaling out dependences will be added in the next revision. A TODOs been left because flushing is not supported. Comment at: openmp/runtime/src/kmp_ftn_entry.h:1449-1494 +/// TODO: Include the `omp.h` of the current build +/* OpenMP 5.1 interop */ +typedef intptr_t omp_intptr_t; + +/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined + * properties */ +typedef enum omp_interop_property { jdoerfert wrote: > RaviNarayanaswamy wrote: > > Why do you have all this in openmp/runtime. Openmp should call > > libomptarget to get interop properties. if libomptarget is not loaded it > > should return 0 > That is exactly what this code does, no? Look for libomptarget and redirect > to that one, otherwise return 0. > Unsure I see your point. FWIW, this is copied from other functions we > duplicate in libomp but that actually are part of libomptarget. Im leaving it as is. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106674/new/ https://reviews.llvm.org/D106674 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D105876: OMPIRBuilder for Interop directive
sriharikrishna updated this revision to Diff 372329. sriharikrishna added a comment. OMPIRBuilder for Interop directive Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105876/new/ https://reviews.llvm.org/D105876 Files: clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/test/OpenMP/interop_irbuilder.cpp llvm/include/llvm/Frontend/OpenMP/OMPConstants.h llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/include/llvm/Frontend/OpenMP/OMPKinds.def llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp === --- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -2736,6 +2736,87 @@ return Builder.CreateCall(Fn, Args, Name); } +CallInst *OpenMPIRBuilder::createOMPInteropInit( +const LocationDescription &Loc, Value *InteropVar, +omp::OMPInteropType InteropType, Value *Device, Value *NumDependences, +Value *DependenceAddress, bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(Int32, -1); + Constant *InteropTypeVal = ConstantInt::get(Int64, (int)InteropType); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = ConstantInt::get(Int32, HaveNowaitClause); + Value *Args[] = { + Ident, ThreadId, InteropVar,InteropTypeVal, + Device, NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_init); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropDestroy( +const LocationDescription &Loc, Value *InteropVar, Value *Device, +Value *NumDependences, Value *DependenceAddress, bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(Int32, -1); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = ConstantInt::get(Int32, HaveNowaitClause); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_destroy); + + return Builder.CreateCall(Fn, Args); +} + +CallInst *OpenMPIRBuilder::createOMPInteropUse(const LocationDescription &Loc, + Value *InteropVar, Value *Device, + Value *NumDependences, + Value *DependenceAddress, + bool HaveNowaitClause) { + IRBuilder<>::InsertPointGuard IPG(Builder); + Builder.restoreIP(Loc.IP); + Constant *SrcLocStr = getOrCreateSrcLocStr(Loc); + Value *Ident = getOrCreateIdent(SrcLocStr); + Value *ThreadId = getOrCreateThreadID(Ident); + if (Device == NULL) +Device = ConstantInt::get(Int32, -1); + if (NumDependences == nullptr) { +NumDependences = ConstantInt::get(Int32, 0); +PointerType *PointerTypeVar = Type::getInt8PtrTy(M.getContext()); +DependenceAddress = ConstantPointerNull::get(PointerTypeVar); + } + Value *HaveNowaitClauseVal = ConstantInt::get(Int32, HaveNowaitClause); + Value *Args[] = { + Ident, ThreadId, InteropVar, Device, + NumDependences, DependenceAddress, HaveNowaitClauseVal}; + + Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___tgt_interop_use); + + return Builder.CreateCall(Fn, Args); +} + CallInst *OpenMPIRBuilder::createCachedThreadPrivate( const LocationDescription &Loc, llvm::Value *Pointer, llvm::ConstantInt *Size, const llvm::Twine &Name) { Index: llvm/include/llvm/Frontend/OpenMP/OMPKinds.def === --- llvm/include/llvm/Frontend/OpenMP/OMPKinds.def +++ llvm/include/llvm/Frontend/OpenMP/OMPKinds.def @@ -374,6 +374,15 @@ __OMP_RTL(__kmpc_alloc, false, VoidPtr, /* Int */ Int32, SizeTy, VoidPtr) __OMP_RTL(__kmpc_free, false, Void, /* Int */ Int32, VoidPtr, VoidPtr) +__OMP_R