From f7b3b20f815049b852210e74d6e39d29701eac8e Mon Sep 17 00:00:00 2001 From: Jaime Arteaga Date: Tue, 23 Aug 2022 19:16:50 +0000 Subject: [PATCH] Add warning when SLM is not enough for kernel Signed-off-by: Jaime Arteaga --- .../command_queue/local_work_size_tests.cpp | 74 +++++++++++++++++++ shared/source/program/kernel_info.cpp | 3 + 2 files changed, 77 insertions(+) diff --git a/opencl/test/unit_test/command_queue/local_work_size_tests.cpp b/opencl/test/unit_test/command_queue/local_work_size_tests.cpp index e437e1397c..37ad95ea5f 100644 --- a/opencl/test/unit_test/command_queue/local_work_size_tests.cpp +++ b/opencl/test/unit_test/command_queue/local_work_size_tests.cpp @@ -41,6 +41,80 @@ TEST(localWorkSizeTest, givenDisableEUFusionWhenCreatingWorkSizeInfoThenCorrectM EXPECT_EQ(expectedMinWGS, wsInfo.minWorkGroupSize); } +TEST(localWorkSizeTest, GivenSlmLargerThanLocalThenWarningIsReturned) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.PrintDebugMessages.set(true); + ::testing::internal::CaptureStderr(); + + EXPECT_THROW(WorkSizeInfo wsInfo(256, // maxWorkGroupSize + 1u, // hasBariers + 8, // simdSize + 128u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 64u, // localMemorySize + false, // imgUsed + false, // yTiledSurface + false // disableEUFusion + ), + std::exception); + + std::string output = testing::internal::GetCapturedStderr(); + EXPECT_EQ(std::string("Size of SLM (128) larger than available (64)\n"), output); +} + +TEST(localWorkSizeTest, GivenSlmSmallerThanLocalThenWarningIsNotReturned) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.PrintDebugMessages.set(true); + ::testing::internal::CaptureStderr(); + + WorkSizeInfo wsInfo(256, // maxWorkGroupSize + 1u, // hasBariers + 8, // simdSize + 64u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 128u, // localMemorySize + false, // imgUsed + false, // yTiledSurface + false // disableEUFusion + ); + + std::string output = testing::internal::GetCapturedStderr(); + EXPECT_EQ(std::string(""), output); +} + +TEST(localWorkSizeTest, whenSettingHasBarriersWithNoFusedDispatchThenMinWorkGroupSizeIsSetCorrectly) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.CFEFusedEUDispatch.set(0); + + WorkSizeInfo wsInfo0(256, // maxWorkGroupSize + 0u, // hasBariers + 8, // simdSize + 0u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 128u, // localMemorySize + false, // imgUsed + false, // yTiledSurface + false // disableEUFusion + ); + EXPECT_EQ(0u, wsInfo0.minWorkGroupSize); + + WorkSizeInfo wsInfo1(256, // maxWorkGroupSize + 1u, // hasBariers + 8, // simdSize + 0u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 128u, // localMemorySize + false, // imgUsed + false, // yTiledSurface + false // disableEUFusion + ); + EXPECT_NE(0u, wsInfo1.minWorkGroupSize); +} + TEST(localWorkSizeTest, given3DimWorkGroupAndSimdEqual8AndBarriersWhenComputeCalledThenLocalGroupComputedCorrectly) { WorkSizeInfo wsInfo(256, // maxWorkGroupSize 1u, // hasBariers diff --git a/shared/source/program/kernel_info.cpp b/shared/source/program/kernel_info.cpp index 649aa25ebe..15d884e546 100644 --- a/shared/source/program/kernel_info.cpp +++ b/shared/source/program/kernel_info.cpp @@ -61,6 +61,9 @@ void WorkSizeInfo::setMinWorkGroupSize(const HardwareInfo *hwInfo, bool disableE minWorkGroupSize = numThreadsPerSubSlice * simdSize / maxBarriersPerHSlice; } if (slmTotalSize > 0) { + if (localMemSize < slmTotalSize) { + PRINT_DEBUG_STRING(NEO::DebugManager.flags.PrintDebugMessages.get(), stderr, "Size of SLM (%d) larger than available (%d)\n", slmTotalSize, localMemSize); + } UNRECOVERABLE_IF(localMemSize < slmTotalSize); minWorkGroupSize = std::max(maxWorkGroupSize / ((localMemSize / slmTotalSize)), minWorkGroupSize); }