@@ -75,30 +75,46 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
7575 if (URAdviceFlags &
7676 (UR_USM_ADVICE_FLAG_SET_NON_ATOMIC_MOSTLY |
7777 UR_USM_ADVICE_FLAG_CLEAR_NON_ATOMIC_MOSTLY |
78- UR_USM_ADVICE_FLAG_BIAS_CACHED | UR_USM_ADVICE_FLAG_BIAS_UNCACHED)) {
78+ UR_USM_ADVICE_FLAG_BIAS_CACHED | UR_USM_ADVICE_FLAG_BIAS_UNCACHED
79+ #if !defined(__HIP_PLATFORM_AMD__)
80+ | UR_USM_ADVICE_FLAG_SET_NON_COHERENT_MEMORY |
81+ UR_USM_ADVICE_FLAG_CLEAR_NON_COHERENT_MEMORY
82+ #endif
83+ )) {
7984 return UR_RESULT_ERROR_INVALID_ENUMERATION;
8085 }
8186
8287 using ur_to_hip_advice_t = std::pair<ur_usm_advice_flags_t , hipMemoryAdvise>;
8388
84- static constexpr std::array<ur_to_hip_advice_t , 6 >
85- URToHIPMemAdviseDeviceFlags{
86- std::make_pair (UR_USM_ADVICE_FLAG_SET_READ_MOSTLY,
87- hipMemAdviseSetReadMostly),
88- std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY,
89- hipMemAdviseUnsetReadMostly),
90- std::make_pair (UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION,
91- hipMemAdviseSetPreferredLocation),
92- std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION,
93- hipMemAdviseUnsetPreferredLocation),
94- std::make_pair (UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE,
95- hipMemAdviseSetAccessedBy),
96- std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE,
97- hipMemAdviseUnsetAccessedBy),
98- };
99- for (auto &FlagPair : URToHIPMemAdviseDeviceFlags) {
100- if (URAdviceFlags & FlagPair.first ) {
101- UR_CHECK_ERROR (hipMemAdvise (DevPtr, Size, FlagPair.second , Device));
89+ #if defined(__HIP_PLATFORM_AMD__)
90+ constexpr size_t DeviceFlagCount = 8 ;
91+ #else
92+ constexpr size_t DeviceFlagCount = 6 ;
93+ #endif
94+ static constexpr std::array<ur_to_hip_advice_t , DeviceFlagCount>
95+ URToHIPMemAdviseDeviceFlags {
96+ std::make_pair (UR_USM_ADVICE_FLAG_SET_READ_MOSTLY,
97+ hipMemAdviseSetReadMostly),
98+ std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_READ_MOSTLY,
99+ hipMemAdviseUnsetReadMostly),
100+ std::make_pair (UR_USM_ADVICE_FLAG_SET_PREFERRED_LOCATION,
101+ hipMemAdviseSetPreferredLocation),
102+ std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_PREFERRED_LOCATION,
103+ hipMemAdviseUnsetPreferredLocation),
104+ std::make_pair (UR_USM_ADVICE_FLAG_SET_ACCESSED_BY_DEVICE,
105+ hipMemAdviseSetAccessedBy),
106+ std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_ACCESSED_BY_DEVICE,
107+ hipMemAdviseUnsetAccessedBy),
108+ #if defined(__HIP_PLATFORM_AMD__)
109+ std::make_pair (UR_USM_ADVICE_FLAG_SET_NON_COHERENT_MEMORY,
110+ hipMemAdviseSetCoarseGrain),
111+ std::make_pair (UR_USM_ADVICE_FLAG_CLEAR_NON_COHERENT_MEMORY,
112+ hipMemAdviseUnsetCoarseGrain),
113+ #endif
114+ };
115+ for (const auto &[URAdvice, HIPAdvice] : URToHIPMemAdviseDeviceFlags) {
116+ if (URAdviceFlags & URAdvice) {
117+ UR_CHECK_ERROR (hipMemAdvise (DevPtr, Size, HIPAdvice, Device));
102118 }
103119 }
104120
@@ -113,10 +129,9 @@ ur_result_t setHipMemAdvise(const void *DevPtr, const size_t Size,
113129 hipMemAdviseUnsetAccessedBy),
114130 };
115131
116- for (auto &FlagPair : URToHIPMemAdviseHostFlags) {
117- if (URAdviceFlags & FlagPair.first ) {
118- UR_CHECK_ERROR (
119- hipMemAdvise (DevPtr, Size, FlagPair.second , hipCpuDeviceId));
132+ for (const auto &[URAdvice, HIPAdvice] : URToHIPMemAdviseHostFlags) {
133+ if (URAdviceFlags & URAdvice) {
134+ UR_CHECK_ERROR (hipMemAdvise (DevPtr, Size, HIPAdvice, hipCpuDeviceId));
120135 }
121136 }
122137
@@ -1590,6 +1605,10 @@ urEnqueueUSMAdvise(ur_queue_handle_t hQueue, const void *pMem, size_t size,
15901605 pMem, size, hipMemAdviseUnsetPreferredLocation, DeviceID));
15911606 UR_CHECK_ERROR (
15921607 hipMemAdvise (pMem, size, hipMemAdviseUnsetAccessedBy, DeviceID));
1608+ #if defined(__HIP_PLATFORM_AMD__)
1609+ UR_CHECK_ERROR (
1610+ hipMemAdvise (pMem, size, hipMemAdviseUnsetCoarseGrain, DeviceID));
1611+ #endif
15931612 } else {
15941613 Result = setHipMemAdvise (HIPDevicePtr, size, advice, DeviceID);
15951614 // UR_RESULT_ERROR_INVALID_ENUMERATION is returned when using a valid but
0 commit comments