@@ -89,33 +89,46 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
89
89
ur_usm_advice_flags_t URAdviceFlags,
90
90
hipDevice_t Device) {
91
91
// 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.
92
96
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)) {
96
98
return UR_RESULT_ERROR_INVALID_ENUMERATION;
97
99
}
98
100
99
101
using ur_to_hip_advice_t = std::pair<ur_usm_advice_flags_t , hipMemoryAdvise>;
100
102
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));
119
132
}
120
133
}
121
134
@@ -130,10 +143,9 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
130
143
hipMemAdviseUnsetAccessedBy),
131
144
};
132
145
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));
137
149
}
138
150
}
139
151
@@ -1615,6 +1627,10 @@ urEnqueueUSMAdvise(ur_queue_handle_t hQueue, const void *pMem, size_t size,
1615
1627
pMem, size, hipMemAdviseUnsetPreferredLocation, DeviceID));
1616
1628
UR_CHECK_ERROR (
1617
1629
hipMemAdvise (pMem, size, hipMemAdviseUnsetAccessedBy, DeviceID));
1630
+ #if defined(__HIP_PLATFORM_AMD__)
1631
+ UR_CHECK_ERROR (
1632
+ hipMemAdvise (pMem, size, hipMemAdviseUnsetCoarseGrain, DeviceID));
1633
+ #endif
1618
1634
} else {
1619
1635
Result = setHipMemAdvise (HIPDevicePtr, size, advice, DeviceID);
1620
1636
// UR_RESULT_ERROR_INVALID_ENUMERATION is returned when using a valid but
0 commit comments