diff --git a/opencl/source/program/kernel_info.cpp b/opencl/source/program/kernel_info.cpp index b2b0826b39..ee6ddccaee 100644 --- a/opencl/source/program/kernel_info.cpp +++ b/opencl/source/program/kernel_info.cpp @@ -163,6 +163,7 @@ void WorkSizeInfo::setMinWorkGroupSize(const HardwareInfo *hwInfo) { minWorkGroupSize = numThreadsPerSubSlice * simdSize / maxBarriersPerHSlice; } if (slmTotalSize > 0) { + UNRECOVERABLE_IF(localMemSize < slmTotalSize); minWorkGroupSize = std::max(maxWorkGroupSize / ((localMemSize / slmTotalSize)), minWorkGroupSize); } 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 fbcc851ecb..e6f2057ac2 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 @@ -16,8 +16,17 @@ using namespace NEO; TEST(localWorkSizeTest, given3DimWorkGroupAndSimdEqual8AndBarriersWhenComputeCalledThenLocalGroupComputedCorrectly) { - //wsInfo maxWorkGroupSize, hasBariers, simdSize, slmTotalSize, hardwareInfo, numThreadsPerSubSlice, localMemorySize, imgUsed, yTiledSurface - WorkSizeInfo wsInfo(256, 1u, 8, 0u, defaultHwInfo.get(), 32u, 0u, false, false); + WorkSizeInfo wsInfo(256, // maxWorkGroupSize + 1u, // hasBariers + 8, // simdSize + 0u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 0u, // localMemorySize + false, // imgUsed + false // yTiledSurface + ); + uint32_t workDim = 3; size_t workGroup[3] = {10000, 10000, 10000}; size_t workGroupSize[3]; @@ -36,6 +45,20 @@ TEST(localWorkSizeTest, given3DimWorkGroupAndSimdEqual8AndBarriersWhenComputeCal EXPECT_EQ(workGroupSize[2], 1u); } +TEST(localWorkSizeTest, givenSmallerLocalMemSizeThanSlmTotalSizeThenExceptionIsThrown) { + EXPECT_THROW(WorkSizeInfo wsInfo(256, // maxWorkGroupSize + 1u, // hasBariers + 8, // simdSize + 128u, // slmTotalSize + defaultHwInfo.get(), // hardwareInfo + 32u, // numThreadsPerSubSlice + 64u, // localMemorySize + false, // imgUsed + false // yTiledSurface + ), + std::exception); +} + TEST(localWorkSizeTest, given2DimWorkGroupAndSimdEqual8AndNoBarriersWhenComputeCalledThenLocalGroupComputedCorrectly) { DebugManagerStateRestore dbgRestore; DebugManager.flags.EnableComputeWorkSizeSquared.set(true);