diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index c48faaeda4..51ce32b054 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -143,6 +143,7 @@ ForceSystemMemoryPlacement = 0 ForceNonSystemMemoryPlacement = 0 ForceOCLVersion = 0 ForcePreemptionMode = -1 +ForceKernelPreemptionMode = -1 NodeOrdinal = -1 OverrideThreadArbitrationPolicy = -1 OverrideAubDeviceId = -1 diff --git a/shared/source/command_stream/preemption.cpp b/shared/source/command_stream/preemption.cpp index 7c887f7d94..b719281a9f 100644 --- a/shared/source/command_stream/preemption.cpp +++ b/shared/source/command_stream/preemption.cpp @@ -38,6 +38,9 @@ bool PreemptionHelper::allowMidThreadPreemption(const PreemptionFlags &flags) { } PreemptionMode PreemptionHelper::taskPreemptionMode(PreemptionMode devicePreemptionMode, const PreemptionFlags &flags) { + if (DebugManager.flags.ForceKernelPreemptionMode.get() != -1) { + return static_cast(DebugManager.flags.ForceKernelPreemptionMode.get()); + } if (devicePreemptionMode == PreemptionMode::Disabled) { return PreemptionMode::Disabled; } diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 1f7f9b84df..9812ddeaf6 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -165,6 +165,7 @@ DECLARE_DEBUG_VARIABLE(int64_t, ForceSystemMemoryPlacement, 0, "0: default, >0: DECLARE_DEBUG_VARIABLE(int64_t, ForceNonSystemMemoryPlacement, 0, "0: default, >0: (bitmask) for given Graphics Allocation Type, force non-system memory placement") DECLARE_DEBUG_VARIABLE(int32_t, ForceOCLVersion, 0, "Force specific OpenCL API version") DECLARE_DEBUG_VARIABLE(int32_t, ForcePreemptionMode, -1, "Keep this variable in sync with PreemptionMode enum. -1 - devices default mode, 1 - disable, 2 - midBatch, 3 - threadGroup, 4 - midThread") +DECLARE_DEBUG_VARIABLE(int32_t, ForceKernelPreemptionMode, -1, "Keep this variable in sync with PreemptionMode enum. -1 - kernel default mode, 1 - disable, 2 - midBatch, 3 - threadGroup, 4 - midThread") DECLARE_DEBUG_VARIABLE(int32_t, NodeOrdinal, -1, "-1: default do not override, 0: ENGINE_RCS") DECLARE_DEBUG_VARIABLE(int32_t, OverrideThreadArbitrationPolicy, -1, "-1 (dont override) or any valid config (0: Age Based, 1: Round Robin)") DECLARE_DEBUG_VARIABLE(int32_t, OverrideAubDeviceId, -1, "-1 dont override, any other: use this value for AUB generation device id") diff --git a/shared/test/unit_test/preemption/preemption_tests.cpp b/shared/test/unit_test/preemption/preemption_tests.cpp index 73892fb79a..fa7605fe92 100644 --- a/shared/test/unit_test/preemption/preemption_tests.cpp +++ b/shared/test/unit_test/preemption/preemption_tests.cpp @@ -278,6 +278,30 @@ TEST_F(MidThreadPreemptionTests, taskPreemptionAllowDeviceSupportsPreemptionOnVm EXPECT_EQ(PreemptionMode::MidThread, outMode); } +TEST_F(ThreadGroupPreemptionTests, GivenDebugKernelPreemptionWhenDeviceSupportsThreadGroupThenExpectDebugKeyMidThreadValue) { + DebugManager.flags.ForceKernelPreemptionMode.set(static_cast(PreemptionMode::MidThread)); + + EXPECT_EQ(PreemptionMode::ThreadGroup, device->getPreemptionMode()); + + PreemptionFlags flags = {}; + kernel.reset(new MockKernel(program.get(), *kernelInfo, *device)); + PreemptionHelper::setPreemptionLevelFlags(flags, device->getDevice(), kernel.get()); + PreemptionMode outMode = PreemptionHelper::taskPreemptionMode(device->getPreemptionMode(), flags); + EXPECT_EQ(PreemptionMode::MidThread, outMode); +} + +TEST_F(MidThreadPreemptionTests, GivenDebugKernelPreemptionWhenDeviceSupportsMidThreadThenExpectDebugKeyMidBatchValue) { + DebugManager.flags.ForceKernelPreemptionMode.set(static_cast(PreemptionMode::MidBatch)); + + EXPECT_EQ(PreemptionMode::MidThread, device->getPreemptionMode()); + + PreemptionFlags flags = {}; + kernel.reset(new MockKernel(program.get(), *kernelInfo, *device)); + PreemptionHelper::setPreemptionLevelFlags(flags, device->getDevice(), kernel.get()); + PreemptionMode outMode = PreemptionHelper::taskPreemptionMode(device->getPreemptionMode(), flags); + EXPECT_EQ(PreemptionMode::MidBatch, outMode); +} + TEST_F(DevicePreemptionTests, setDefaultMidThreadPreemption) { RuntimeCapabilityTable devCapabilities = {};