[Openmp-commits] [PATCH] D51107: [LIBOMPTARGET] Add support for mapping of lambda captures.
Alexey Bataev via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Tue Sep 4 10:01:32 PDT 2018
ABataev updated this revision to Diff 163856.
ABataev added a comment.
Reworked handling of lambdas captures.
Repository:
rOMP OpenMP
https://reviews.llvm.org/D51107
Files:
libomptarget/src/omptarget.cpp
Index: libomptarget/src/omptarget.cpp
===================================================================
--- libomptarget/src/omptarget.cpp
+++ libomptarget/src/omptarget.cpp
@@ -616,10 +616,44 @@
// List of (first-)private arrays allocated for this target region
std::vector<void *> fpArrays;
+ std::vector<int> tgtArgsPositions(arg_num, -1);
for (int32_t i = 0; i < arg_num; ++i) {
if (!(arg_types[i] & OMP_TGT_MAPTYPE_TARGET_PARAM)) {
// This is not a target parameter, do not push it into tgt_args.
+ // Check for lambda mapping.
+ if (arg_types[i] & OMP_TGT_MAPTYPE_PTR_AND_OBJ) {
+ assert((arg_types[i] & OMP_TGT_MAPTYPE_MEMBER_OF) &&
+ "PTR_AND_OBJ must be also MEMBER_OF.");
+ unsigned idx = member_of(arg_types[i]);
+ int tgtIdx = tgtArgsPositions[idx];
+ assert(tgtIdx != -1 && "Base address must be translated already.");
+ // The parent lambda must be processed already and it must be the last
+ // in tgt_args and tgt_offsets arrays.
+ void *HstPtrBegin = args[i];
+ void *HstPtrBase = args_base[i];
+ bool IsLast; // unused.
+ void *TgtPtrBase =
+ (void *)((intptr_t)tgt_args[tgtIdx] + tgt_offsets[tgtIdx]);
+ DP("Parent lambda base " DPxMOD "\n", DPxPTR(TgtPtrBase));
+ uint64_t Delta = (uint64_t)HstPtrBegin - (uint64_t)HstPtrBase;
+ void *TgtPtrBegin = (void *)((uintptr_t)TgtPtrBase + Delta);
+ void *Pointer_TgtPtrBegin = Device.getTgtPtrBegin(
+ *(void **)HstPtrBegin, arg_sizes[i], IsLast, false);
+ if (!Pointer_TgtPtrBegin) {
+ DP("No lambda captured variable mapped (" DPxMOD ") - ignored\n",
+ DPxPTR(*(void **)HstPtrBegin));
+ continue;
+ }
+ DP("Update lambda reference (" DPxMOD ") -> [" DPxMOD "]\n",
+ DPxPTR(Pointer_TgtPtrBegin), DPxPTR(TgtPtrBegin));
+ int rt = Device.data_submit(TgtPtrBegin, &Pointer_TgtPtrBegin,
+ sizeof(void *));
+ if (rt != OFFLOAD_SUCCESS) {
+ DP("Copying data to device failed.\n");
+ return OFFLOAD_FAIL;
+ }
+ }
continue;
}
void *HstPtrBegin = args[i];
@@ -678,6 +712,7 @@
DPxPTR(TgtPtrBase), DPxPTR(HstPtrBegin));
#endif
}
+ tgtArgsPositions[i] = tgt_args.size();
tgt_args.push_back(TgtPtrBegin);
tgt_offsets.push_back(TgtBaseOffset);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51107.163856.patch
Type: text/x-patch
Size: 2458 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20180904/d20dfdc5/attachment.bin>
More information about the Openmp-commits
mailing list