Skip to content

Commit 2530ec6

Browse files
author
Georgi Mirazchiyski
committed
[HIP] Implement coarse-grained memory advice for the HIP adapter
1 parent 79c28d0 commit 2530ec6

File tree

1 file changed

+41
-25
lines changed

1 file changed

+41
-25
lines changed

source/adapters/hip/enqueue.cpp

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -89,33 +89,46 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
8989
ur_usm_advice_flags_t URAdviceFlags,
9090
hipDevice_t Device) {
9191
// Handle unmapped memory advice flags
92+
// FIXME: Temporary use UR_USM_ADVICE_FLAG_SET_NON_ATOMIC_MOSTLY and
93+
// UR_USM_ADVICE_FLAG_CLEAR_NON_ATOMIC_MOSTLY for controlling coarse-grain
94+
// memory until we introduce a new flag more appropriately. Add them back to
95+
// unsupported when that happens.
9296
if (URAdviceFlags &
93-
(UR_USM_ADVICE_FLAG_SET_NON_ATOMIC_MOSTLY |
94-
UR_USM_ADVICE_FLAG_CLEAR_NON_ATOMIC_MOSTLY |
95-
UR_USM_ADVICE_FLAG_BIAS_CACHED | UR_USM_ADVICE_FLAG_BIAS_UNCACHED)) {
97+
(UR_USM_ADVICE_FLAG_BIAS_CACHED | UR_USM_ADVICE_FLAG_BIAS_UNCACHED)) {
9698
return UR_RESULT_ERROR_INVALID_ENUMERATION;
9799
}
98100

99101
using ur_to_hip_advice_t = std::pair<ur_usm_advice_flags_t, hipMemoryAdvise>;
100102

101-
static constexpr std::array<ur_to_hip_advice_t, 6>
102-
URToHIPMemAdviseDeviceFlags{
103-
std::make_pair(UR_USM_ADVICE_FLAG_SET_READ_MOSTLY,
104-
hipMemAdviseSetReadMostly),
105-
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY,
106-
hipMemAdviseUnsetReadMostly),
107-
std::make_pair(UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION,
108-
hipMemAdviseSetPreferredLocation),
109-
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION,
110-
hipMemAdviseUnsetPreferredLocation),
111-
std::make_pair(UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE,
112-
hipMemAdviseSetAccessedBy),
113-
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE,
114-
hipMemAdviseUnsetAccessedBy),
115-
};
116-
for (auto &FlagPair : URToHIPMemAdviseDeviceFlags) {
117-
if (URAdviceFlags & FlagPair.first) {
118-
UR_CHECK_ERROR(hipMemAdvise(DevPtr, Size, FlagPair.second, Device));
103+
#if defined(__HIP_PLATFORM_AMD__)
104+
constexpr size_t DeviceFlagCount = 8;
105+
#else
106+
constexpr size_t DeviceFlagCount = 6;
107+
#endif
108+
static constexpr std::array<ur_to_hip_advice_t, DeviceFlagCount>
109+
URToHIPMemAdviseDeviceFlags {
110+
std::make_pair(UR_USM_ADVICE_FLAG_SET_READ_MOSTLY,
111+
hipMemAdviseSetReadMostly),
112+
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY,
113+
hipMemAdviseUnsetReadMostly),
114+
std::make_pair(UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION,
115+
hipMemAdviseSetPreferredLocation),
116+
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION,
117+
hipMemAdviseUnsetPreferredLocation),
118+
std::make_pair(UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE,
119+
hipMemAdviseSetAccessedBy),
120+
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE,
121+
hipMemAdviseUnsetAccessedBy),
122+
#if defined(__HIP_PLATFORM_AMD__)
123+
std::make_pair(UR_USM_ADVICE_FLAG_SET_NON_ATOMIC_MOSTLY,
124+
hipMemAdviseSetCoarseGrain),
125+
std::make_pair(UR_USM_ADVICE_FLAG_CLEAR_NON_ATOMIC_MOSTLY,
126+
hipMemAdviseUnsetCoarseGrain),
127+
#endif
128+
};
129+
for (const auto &[URAdvice, HIPAdvice] : URToHIPMemAdviseDeviceFlags) {
130+
if (URAdviceFlags & URAdvice) {
131+
UR_CHECK_ERROR(hipMemAdvise(DevPtr, Size, HIPAdvice, Device));
119132
}
120133
}
121134

@@ -130,10 +143,9 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
130143
hipMemAdviseUnsetAccessedBy),
131144
};
132145

133-
for (auto &FlagPair : URToHIPMemAdviseHostFlags) {
134-
if (URAdviceFlags & FlagPair.first) {
135-
UR_CHECK_ERROR(
136-
hipMemAdvise(DevPtr, Size, FlagPair.second, hipCpuDeviceId));
146+
for (const auto &[URAdvice, HIPAdvice] : URToHIPMemAdviseHostFlags) {
147+
if (URAdviceFlags & URAdvice) {
148+
UR_CHECK_ERROR(hipMemAdvise(DevPtr, Size, HIPAdvice, hipCpuDeviceId));
137149
}
138150
}
139151

@@ -1615,6 +1627,10 @@ urEnqueueUSMAdvise(ur_queue_handle_t hQueue, const void *pMem, size_t size,
16151627
pMem, size, hipMemAdviseUnsetPreferredLocation, DeviceID));
16161628
UR_CHECK_ERROR(
16171629
hipMemAdvise(pMem, size, hipMemAdviseUnsetAccessedBy, DeviceID));
1630+
#if defined(__HIP_PLATFORM_AMD__)
1631+
UR_CHECK_ERROR(
1632+
hipMemAdvise(pMem, size, hipMemAdviseUnsetCoarseGrain, DeviceID));
1633+
#endif
16181634
} else {
16191635
Result = setHipMemAdvise(HIPDevicePtr, size, advice, DeviceID);
16201636
// UR_RESULT_ERROR_INVALID_ENUMERATION is returned when using a valid but

0 commit comments

Comments
 (0)