Skip to content

Commit 7bde312

Browse files
committed
[Offload]: Skip copying of unused kernel-mapped data
1 parent 3cfda4f commit 7bde312

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

offload/src/omptarget.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,6 +1197,35 @@ class PrivateArgumentManagerTy {
11971197
}
11981198
};
11991199

1200+
static std::unique_ptr<int64_t[]> maskIgnorableMappings(int64_t DeviceId, int32_t ArgNum, int64_t *ArgTypes,
1201+
int64_t *ArgSizes, map_var_info_t *ArgNames) {
1202+
std::unique_ptr<int64_t[]> ArgTypesOverride = std::make_unique<int64_t[]>(ArgNum);
1203+
1204+
for (int32_t I = 0; I < ArgNum; ++I) {
1205+
bool IsTargetParam = ArgTypes[I] & OMP_TGT_MAPTYPE_TARGET_PARAM;
1206+
1207+
bool IsMapTo = ArgTypes[I] & OMP_TGT_MAPTYPE_TO;
1208+
if (IsTargetParam || !IsMapTo) {
1209+
ArgTypesOverride[I] = ArgTypes[I];
1210+
continue;
1211+
}
1212+
1213+
bool IsMapFrom = ArgTypes[I] & OMP_TGT_MAPTYPE_FROM;
1214+
const char *Type = IsMapFrom ? "tofrom" : "to";
1215+
1216+
// Optimisation: A 'to' or 'tofrom' mapping is not
1217+
// used by the kernel. Change its type such that
1218+
// no new mapping is created, but any existing
1219+
// mapping has its counter decremented.
1220+
INFO(OMP_INFOTYPE_ALL, DeviceId, "%s(%s)[%" PRId64 "] %s\n", Type,
1221+
getNameFromMapping(ArgNames[I]).c_str(), ArgSizes[I], "is not used and will not be copied");
1222+
1223+
ArgTypesOverride[I] = ArgTypes[I] & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
1224+
}
1225+
1226+
return ArgTypesOverride;
1227+
}
1228+
12001229
/// Process data before launching the kernel, including calling targetDataBegin
12011230
/// to map and transfer data to target device, transferring (first-)private
12021231
/// variables.
@@ -1417,11 +1446,16 @@ int target(ident_t *Loc, DeviceTy &Device, void *HostPtr,
14171446

14181447
int NumClangLaunchArgs = KernelArgs.NumArgs;
14191448
int Ret = OFFLOAD_SUCCESS;
1449+
1450+
std::unique_ptr<int64_t[]> ArgTypesOverride =
1451+
maskIgnorableMappings(DeviceId, NumClangLaunchArgs, KernelArgs.ArgTypes,
1452+
KernelArgs.ArgSizes, KernelArgs.ArgNames);
1453+
14201454
if (NumClangLaunchArgs) {
14211455
// Process data, such as data mapping, before launching the kernel
14221456
Ret = processDataBefore(Loc, DeviceId, HostPtr, NumClangLaunchArgs,
14231457
KernelArgs.ArgBasePtrs, KernelArgs.ArgPtrs,
1424-
KernelArgs.ArgSizes, KernelArgs.ArgTypes,
1458+
KernelArgs.ArgSizes, ArgTypesOverride.get(),
14251459
KernelArgs.ArgNames, KernelArgs.ArgMappers, TgtArgs,
14261460
TgtOffsets, PrivateArgumentManager, AsyncInfo);
14271461
if (Ret != OFFLOAD_SUCCESS) {
@@ -1473,7 +1507,7 @@ int target(ident_t *Loc, DeviceTy &Device, void *HostPtr,
14731507
// variables
14741508
Ret = processDataAfter(Loc, DeviceId, HostPtr, NumClangLaunchArgs,
14751509
KernelArgs.ArgBasePtrs, KernelArgs.ArgPtrs,
1476-
KernelArgs.ArgSizes, KernelArgs.ArgTypes,
1510+
KernelArgs.ArgSizes, ArgTypesOverride.get(),
14771511
KernelArgs.ArgNames, KernelArgs.ArgMappers,
14781512
PrivateArgumentManager, AsyncInfo);
14791513
if (Ret != OFFLOAD_SUCCESS) {

0 commit comments

Comments
 (0)