Skip to content

Commit 02f78ec

Browse files
committed
[Offload]: Skip copying of unused kernel-mapped data
1 parent 10860d1 commit 02f78ec

File tree

2 files changed

+46
-27
lines changed

2 files changed

+46
-27
lines changed

offload/include/OpenMP/Mapping.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,8 @@ struct LookupResult {
389389

390390
bool isEmpty() const {
391391
bool IsEmpty = Flags.IsContained == 0
392-
& Flags.ExtendsBefore == 0
393-
& Flags.ExtendsAfter == 0;
392+
&& Flags.ExtendsBefore == 0
393+
&& Flags.ExtendsAfter == 0;
394394
return IsEmpty;
395395
}
396396
};

offload/libomptarget/omptarget.cpp

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,66 +1197,85 @@ class PrivateArgumentManagerTy {
11971197
}
11981198
};
11991199

1200+
/// Try to determine if kernel argument is unused. This method
1201+
/// takes a conservative approach, i.e. it may return false
1202+
/// negatives but it should never return a false positive.
1203+
static bool isArgUnused(tgt_map_type ArgType) {
1204+
bool IsArgUnused = ArgType == OMP_TGT_MAPTYPE_NONE
1205+
|| ArgType == OMP_TGT_MAPTYPE_FROM
1206+
|| ArgType == OMP_TGT_MAPTYPE_TO
1207+
|| ArgType == (OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO);
1208+
return IsArgUnused;
1209+
}
1210+
12001211
/// Try to find redundant mappings associated with a kernel launch,
12011212
/// and provide a masked version of the kernel argument types that
1202-
/// avoid redundant to data transfers between the host and device.
1213+
/// avoid redundant data transfers between the host and the device.
12031214
static std::unique_ptr<int64_t[]> maskRedundantTransfers(DeviceTy &Device, int32_t ArgNum,
12041215
int64_t *ArgTypes, int64_t *ArgSizes,
12051216
map_var_info_t *ArgNames, void **ArgPtrs,
12061217
void **ArgMappers) {
12071218
std::unique_ptr<int64_t[]> ArgTypesOverride = std::make_unique<int64_t[]>(ArgNum);
12081219

1209-
MappingInfoTy &MappingInfo = Device.getMappingInfo();
1210-
MappingInfoTy::HDTTMapAccessorTy HDTTMap = MappingInfo
1211-
.HostDataToTargetMap.getExclusiveAccessor();
1212-
1213-
int64_t UnusedArgs = 0;
1220+
bool AllArgsUnused = true;
12141221

12151222
for (int32_t I = 0; I < ArgNum; ++I) {
1223+
bool IsCustomMapped = ArgMappers && ArgMappers[I];
1224+
1225+
if (IsCustomMapped) {
1226+
ArgTypesOverride[I] = ArgTypes[I];
1227+
AllArgsUnused = false;
1228+
continue;
1229+
}
1230+
12161231
tgt_map_type ArgType = (tgt_map_type) ArgTypes[I];
12171232

1218-
// Check for unused implicit mappings
1219-
bool IsArgUnused = ArgType == OMP_TGT_MAPTYPE_NONE;
1233+
bool IsArgUnused = true;
12201234

12211235
// Check for unused `map(buf[0:size])` mappings
1222-
IsArgUnused |= ArgType == OMP_TGT_MAPTYPE_FROM
1223-
|| ArgType == OMP_TGT_MAPTYPE_TO
1224-
|| ArgType == (OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO);
1236+
IsArgUnused |= isArgUnused(ArgType);
1237+
1238+
bool IsArgMemberPtr = ArgType & OMP_TGT_MAPTYPE_MEMBER_OF
1239+
&& ArgType & OMP_TGT_MAPTYPE_PTR_AND_OBJ;
1240+
1241+
tgt_map_type ArgTypeMemberPtrMasked = (tgt_map_type) (ArgType & ~(OMP_TGT_MAPTYPE_MEMBER_OF | OMP_TGT_MAPTYPE_PTR_AND_OBJ));
12251242

12261243
// Check for unused `map(wrapper.buf[0:size])` mappings
1227-
IsArgUnused |= UnusedArgs == ArgNum - 1 && ArgType & OMP_TGT_MAPTYPE_MEMBER_OF
1228-
&& ((ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == OMP_TGT_MAPTYPE_PTR_AND_OBJ
1229-
|| (ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == (OMP_TGT_MAPTYPE_PTR_AND_OBJ | OMP_TGT_MAPTYPE_TO)
1230-
|| (ArgType & ~OMP_TGT_MAPTYPE_MEMBER_OF) == (OMP_TGT_MAPTYPE_PTR_AND_OBJ | OMP_TGT_MAPTYPE_FROM | OMP_TGT_MAPTYPE_TO));
1244+
IsArgUnused |= AllArgsUnused && IsArgMemberPtr && isArgUnused(ArgTypeMemberPtrMasked);
12311245

1232-
bool IsExistingMapping = !MappingInfo.lookupMapping(HDTTMap, ArgPtrs[I], ArgSizes[I]).isEmpty();
1246+
if (!IsArgUnused) {
1247+
ArgTypesOverride[I] = ArgTypes[I];
1248+
AllArgsUnused = false;
1249+
continue;
1250+
}
12331251

1234-
bool IsCustomMapped = ArgMappers && ArgMappers[I];
1252+
MappingInfoTy &MappingInfo = Device.getMappingInfo();
1253+
MappingInfoTy::HDTTMapAccessorTy HDTTMap = MappingInfo
1254+
.HostDataToTargetMap.getExclusiveAccessor();
1255+
1256+
bool IsExistingMapping = !MappingInfo.lookupMapping(HDTTMap, ArgPtrs[I], ArgSizes[I]).isEmpty();
12351257

1236-
if (IsExistingMapping | IsCustomMapped | !IsArgUnused) {
1258+
if (IsExistingMapping) {
12371259
ArgTypesOverride[I] = ArgTypes[I];
1260+
AllArgsUnused = false;
12381261
continue;
12391262
}
12401263

1241-
const std::string Name = ArgNames && ArgNames[I] ?
1264+
[[maybe_unused]] const std::string Name = ArgNames && ArgNames[I] ?
12421265
getNameFromMapping(ArgNames[I]) : std::string("unknown");
12431266

12441267
bool IsArgFrom = ArgType & OMP_TGT_MAPTYPE_FROM;
12451268
bool IsArgTo = ArgType & OMP_TGT_MAPTYPE_TO;
12461269

1247-
const char *Type = IsArgFrom && IsArgTo ? "tofrom"
1270+
[[maybe_unused]] const char *Type = IsArgFrom && IsArgTo ? "tofrom"
12481271
: IsArgFrom ? "from"
12491272
: IsArgTo ? "to"
12501273
: "unknown";
12511274

1252-
// Optimisation:
1253-
// A new mapping is not used by the kernel.
1254-
// Change the type such that no data is transferred to and/or from the device.
12551275
INFO(OMP_INFOTYPE_REDUNDANT_TRANSFER, Device.DeviceID, "%s(%s)[%" PRId64 "] %s\n", Type,
12561276
Name.c_str(), ArgSizes[I], "is not used and will not be copied");
12571277

1258-
ArgTypesOverride[I] = ArgTypes[I] & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
1259-
UnusedArgs++;
1278+
ArgTypesOverride[I] = ArgType & ~(OMP_TGT_MAPTYPE_TO | OMP_TGT_MAPTYPE_FROM);
12601279
}
12611280

12621281
return ArgTypesOverride;

0 commit comments

Comments
 (0)