From 004e6e647fdca63d142946a910da2237a9de203c Mon Sep 17 00:00:00 2001 From: Kamil Kopryk Date: Tue, 13 Feb 2024 18:25:17 +0000 Subject: [PATCH] fix: align indirect data pointer to cacheline size in heapless mode Align indirect data pointer to cacheline size in heapless mode, restore debug_break_if if avx2 load/store operation gets unaligned pointer, remove fallback to mm256 loadu/storeu unaligned operation Related-To: NEO-7621 Signed-off-by: Kamil Kopryk --- .../hardware_commands_helper_xehp_and_later.inl | 4 +++- shared/source/helpers/uint16_avx2.h | 14 ++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/opencl/source/helpers/hardware_commands_helper_xehp_and_later.inl b/opencl/source/helpers/hardware_commands_helper_xehp_and_later.inl index d62111994a..75cc526860 100644 --- a/opencl/source/helpers/hardware_commands_helper_xehp_and_later.inl +++ b/opencl/source/helpers/hardware_commands_helper_xehp_and_later.inl @@ -63,7 +63,9 @@ size_t HardwareCommandsHelper::sendCrossThreadData( constexpr bool heaplessModeEnabled = GfxFamily::template isHeaplessMode(); - if constexpr (heaplessModeEnabled == false) { + if constexpr (heaplessModeEnabled) { + indirectHeap.align(MemoryConstants::cacheLineSize); + } else { indirectHeap.align(WalkerType::INDIRECTDATASTARTADDRESS_ALIGN_SIZE); } diff --git a/shared/source/helpers/uint16_avx2.h b/shared/source/helpers/uint16_avx2.h index 0625bf5431..f34ab372e1 100644 --- a/shared/source/helpers/uint16_avx2.h +++ b/shared/source/helpers/uint16_avx2.h @@ -53,11 +53,8 @@ struct uint16x16_t { // NOLINT(readability-identifier-naming) } inline void load(const void *alignedPtr) { - if (isAligned<32>(alignedPtr)) { - value = _mm256_load_si256(reinterpret_cast(alignedPtr)); // AVX - } else { - loadUnaligned(alignedPtr); - } + DEBUG_BREAK_IF(!isAligned<32>(alignedPtr)); + value = _mm256_load_si256(reinterpret_cast(alignedPtr)); // AVX } inline void loadUnaligned(const void *ptr) { @@ -65,11 +62,8 @@ struct uint16x16_t { // NOLINT(readability-identifier-naming) } inline void store(void *alignedPtr) { - if (isAligned<32>(alignedPtr)) { - _mm256_store_si256(reinterpret_cast<__m256i *>(alignedPtr), value); // AVX - } else { - storeUnaligned(alignedPtr); - } + DEBUG_BREAK_IF(!isAligned<32>(alignedPtr)); + _mm256_store_si256(reinterpret_cast<__m256i *>(alignedPtr), value); // AVX } inline void storeUnaligned(void *ptr) {