From b503a4d3b73036609be909d87fc9a7c52dbf810d Mon Sep 17 00:00:00 2001 From: Martin Morrison-Grant Date: Mon, 12 May 2025 17:31:51 +0100 Subject: [PATCH] Check for memory alignment before calling clEnqueueMemFillINTEL_fn in OpenCL. Use checkUSMImplAlignment from the Hip adapter for this but moved it to a common header. --- unified-runtime/source/adapters/hip/usm.cpp | 5 ----- unified-runtime/source/adapters/hip/usm.hpp | 2 -- unified-runtime/source/adapters/opencl/usm.cpp | 3 ++- unified-runtime/source/common/ur_util.hpp | 5 +++++ 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/unified-runtime/source/adapters/hip/usm.cpp b/unified-runtime/source/adapters/hip/usm.cpp index 0e0fdc1721a35..154125023950e 100644 --- a/unified-runtime/source/adapters/hip/usm.cpp +++ b/unified-runtime/source/adapters/hip/usm.cpp @@ -485,11 +485,6 @@ bool checkUSMAlignment(uint32_t &alignment, const ur_usm_desc_t *pUSMDesc) { (alignment == 0 || ((alignment & (alignment - 1)) == 0))); } -bool checkUSMImplAlignment(uint32_t Alignment, void **ResultPtr) { - return Alignment == 0 || - reinterpret_cast(*ResultPtr) % Alignment == 0; -} - UR_APIEXPORT ur_result_t UR_APICALL urUSMPoolCreateExp(ur_context_handle_t, ur_device_handle_t, ur_usm_pool_desc_t *, diff --git a/unified-runtime/source/adapters/hip/usm.hpp b/unified-runtime/source/adapters/hip/usm.hpp index a116090d5d3b1..1055968c8a760 100644 --- a/unified-runtime/source/adapters/hip/usm.hpp +++ b/unified-runtime/source/adapters/hip/usm.hpp @@ -120,5 +120,3 @@ ur_result_t USMHostAllocImpl(void **ResultPtr, ur_context_handle_t Context, uint32_t Alignment); bool checkUSMAlignment(uint32_t &alignment, const ur_usm_desc_t *pUSMDesc); - -bool checkUSMImplAlignment(uint32_t Alignment, void **ResultPtr); diff --git a/unified-runtime/source/adapters/opencl/usm.cpp b/unified-runtime/source/adapters/opencl/usm.cpp index 6f39e505ca5f6..b11c2a8f48bc8 100644 --- a/unified-runtime/source/adapters/opencl/usm.cpp +++ b/unified-runtime/source/adapters/opencl/usm.cpp @@ -269,7 +269,8 @@ UR_APIEXPORT ur_result_t UR_APICALL urEnqueueUSMFill( // Have to look up the context from the kernel cl_context CLContext = hQueue->Context->CLContext; - if (patternSize <= 128 && isPowerOf2(patternSize)) { + if (patternSize <= 128 && isPowerOf2(patternSize) && + checkUSMImplAlignment(patternSize, &ptr)) { clEnqueueMemFillINTEL_fn EnqueueMemFill = nullptr; UR_RETURN_ON_FAILURE( cl_ext::getExtFuncFromContext( diff --git a/unified-runtime/source/common/ur_util.hpp b/unified-runtime/source/common/ur_util.hpp index 47a39e0ead8c0..99d0f767058b4 100644 --- a/unified-runtime/source/common/ur_util.hpp +++ b/unified-runtime/source/common/ur_util.hpp @@ -548,4 +548,9 @@ static inline std::string groupDigits(Numeric numeric) { template Spinlock> AtomicSingleton::instance; +inline bool checkUSMImplAlignment(uint32_t Alignment, void **ResultPtr) { + return Alignment == 0 || + reinterpret_cast(*ResultPtr) % Alignment == 0; +} + #endif /* UR_UTIL_H */