refactor: add debug flag to control delay after waiting for paging fence on cpu

Related-To: NEO-8395

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz 2023-11-02 14:37:19 +00:00 committed by Compute-Runtime-Automation
parent 9f0ac8a7a3
commit 19586277ca
7 changed files with 68 additions and 2 deletions

View File

@ -97,6 +97,7 @@ DECLARE_DEBUG_VARIABLE(std::string, OverridePlatformName, std::string("unk"), "O
DECLARE_DEBUG_VARIABLE(std::string, WddmResidencyLoggerOutputDirectory, std::string("unk"), "Selects non-default output directory for Wddm Residency logger file")
DECLARE_DEBUG_VARIABLE(int64_t, OverrideMultiStoragePlacement, -1, "Place memory only in selected tiles indicated by bit mask; ignore when -1")
DECLARE_DEBUG_VARIABLE(int64_t, ForceCompressionDisabledForCompressedBlitCopies, -1, "If compression is required, set AUX_CCS_E, but force CompressionEnable filed; 0 should result in uncompressed read/write; values = -1: default, 0: disabled, 1: enabled")
DECLARE_DEBUG_VARIABLE(int64_t, WddmPagingFenceCpuWaitDelayTime, 0, "Amount of microseconds after waitng for paging fence on CPU")
DECLARE_DEBUG_VARIABLE(int32_t, ForceL1Caching, -1, "Program L1 cache policy for surface state and stateless accesses; values = -1: default, 0: disable, 1: enable")
DECLARE_DEBUG_VARIABLE(int32_t, ForceAuxTranslationEnabled, -1, "Require AUX translation for kernels; values = -1: default, 0: disabled, 1: enabled")
DECLARE_DEBUG_VARIABLE(int32_t, EnableExperimentalCommandBuffer, 0, "Inject experimental command buffer")

View File

@ -73,6 +73,7 @@ Wddm::Wddm(std::unique_ptr<HwDeviceIdWddm> &&hwDeviceIdIn, RootDeviceEnvironment
forceCheck = true;
#endif
checkDeviceState = (DebugManager.flags.EnableDeviceStateVerification.get() != -1) ? DebugManager.flags.EnableDeviceStateVerification.get() : forceCheck;
pagingFenceDelayTime = DebugManager.flags.WddmPagingFenceCpuWaitDelayTime.get();
}
Wddm::~Wddm() {
@ -1264,12 +1265,27 @@ void Wddm::virtualFree(void *ptr, size_t size) {
void Wddm::waitOnPagingFenceFromCpu() {
perfLogStartWaitTime(residencyLogger.get(), currentPagingFenceValue);
while (currentPagingFenceValue > *getPagingFenceAddress())
perfLogResidencyEnteredWait(residencyLogger.get());
if (currentPagingFenceValue > *getPagingFenceAddress()) {
while (currentPagingFenceValue > *getPagingFenceAddress()) {
perfLogResidencyEnteredWait(residencyLogger.get());
}
if (pagingFenceDelayTime > 0) {
delayPagingFenceFromCpu(pagingFenceDelayTime);
}
}
perfLogResidencyWaitPagingeFenceLog(residencyLogger.get(), *getPagingFenceAddress(), false);
}
void Wddm::delayPagingFenceFromCpu(int64_t delayTime) {
int64_t timeDiff = 0u;
auto waitStartTime = std::chrono::high_resolution_clock::now();
while (timeDiff < delayTime) {
auto currentTime = std::chrono::high_resolution_clock::now();
timeDiff = std::chrono::duration_cast<std::chrono::microseconds>(currentTime - waitStartTime).count();
}
}
void Wddm::updatePagingFenceValue(uint64_t newPagingFenceValue) {
NEO::MultiThreadHelpers::interlockedMax(currentPagingFenceValue, newPagingFenceValue);
}

View File

@ -171,6 +171,7 @@ class Wddm : public DriverModel {
return gmmMemory.get();
}
MOCKABLE_VIRTUAL void waitOnPagingFenceFromCpu();
MOCKABLE_VIRTUAL void delayPagingFenceFromCpu(int64_t delayTime);
void setGmmInputArgs(void *args) override;
@ -270,6 +271,7 @@ class Wddm : public DriverModel {
RootDeviceEnvironment &rootDeviceEnvironment;
uint64_t *pagingFenceAddress = nullptr;
int64_t pagingFenceDelayTime = 0;
uintptr_t maximumApplicationAddress = 0;
uintptr_t minAddress = 0;

View File

@ -318,6 +318,11 @@ void WddmMock::waitOnPagingFenceFromCpu() {
Wddm::waitOnPagingFenceFromCpu();
}
void WddmMock::delayPagingFenceFromCpu(int64_t delayTime) {
delayPagingFenceFromCpuResult.called++;
Wddm::delayPagingFenceFromCpu(delayTime);
}
void WddmMock::createPagingFenceLogger() {
if (callBaseCreatePagingLogger) {
Wddm::createPagingFenceLogger();

View File

@ -47,6 +47,7 @@ class WddmMock : public Wddm {
using Wddm::mapGpuVirtualAddress;
using Wddm::minAddress;
using Wddm::pagingFenceAddress;
using Wddm::pagingFenceDelayTime;
using Wddm::pagingQueue;
using Wddm::platformSupportsEvictIfNecessary;
using Wddm::populateAdditionalAdapterInfoOptions;
@ -98,6 +99,7 @@ class WddmMock : public Wddm {
PLATFORM *getGfxPlatform() { return gfxPlatform.get(); }
uint64_t *getPagingFenceAddress() override;
void waitOnPagingFenceFromCpu() override;
void delayPagingFenceFromCpu(int64_t delayTime) override;
void createPagingFenceLogger() override;
bool verifyAdapterLuid(LUID adapterLuid) const override {
if (callBaseVerifyAdapterLuid) {
@ -163,6 +165,7 @@ class WddmMock : public Wddm {
WddmMockHelpers::CallResult reserveGpuVirtualAddressResult;
WddmMockHelpers::CallResult waitOnPagingFenceFromCpuResult;
WddmMockHelpers::CallResult setAllocationPriorityResult;
WddmMockHelpers::CallResult delayPagingFenceFromCpuResult;
StackVec<WddmMockHelpers::MakeResidentCall, 2> makeResidentParamsPassed{};
bool makeResidentStatus = true;

View File

@ -71,6 +71,7 @@ ForceAuxTranslationEnabled = -1
DisableTimestampPacketOptimizations = 0
DisableCachingForStatefulBufferAccess = 0
PrintDebugSettings = 0
WddmPagingFenceCpuWaitDelayTime = 0
UsePipeControlMultiKernelEventSync = -1
PrintDebugMessages = 0
DumpZEBin = 0

View File

@ -1727,3 +1727,41 @@ TEST_F(WddmTestWithMockGdiDll, givenNonZeroMaxDualSubSlicesSupportedWhenQueryAda
EXPECT_EQ(expectedMaxDSS, wddm->getGtSysInfo()->MaxDualSubSlicesSupported);
EXPECT_NE(maxSS / 2, wddm->getGtSysInfo()->MaxDualSubSlicesSupported);
}
struct WddmPagingFenceTest : public WddmTest {
void SetUp() override {
DebugManager.flags.WddmPagingFenceCpuWaitDelayTime.set(WddmPagingFenceTest::defaultTestDelay);
WddmTest::SetUp();
}
DebugManagerStateRestore dbgRestore;
static constexpr int64_t defaultTestDelay = 10;
};
TEST_F(WddmPagingFenceTest, givenPagingFenceDelayNonZeroWhenCurrentPagingFenceValueNotGreaterThanPagingFenceObjectThenNoPagingFenceDelayCalled) {
EXPECT_EQ(WddmPagingFenceTest::defaultTestDelay, wddm->pagingFenceDelayTime);
wddm->mockPagingFence = 0u;
wddm->currentPagingFenceValue = 1u;
wddm->waitOnPagingFenceFromCpu();
EXPECT_EQ(0u, wddm->delayPagingFenceFromCpuResult.called);
}
TEST_F(WddmPagingFenceTest, givenPagingFenceDelayNonZeroWhenCurrentPagingFenceValueGreaterThanPagingFenceObjectThenPagingFenceDelayCalled) {
EXPECT_EQ(WddmPagingFenceTest::defaultTestDelay, wddm->pagingFenceDelayTime);
wddm->mockPagingFence = 0u;
wddm->currentPagingFenceValue = 2u;
wddm->waitOnPagingFenceFromCpu();
EXPECT_EQ(1u, wddm->delayPagingFenceFromCpuResult.called);
}
TEST_F(WddmPagingFenceTest, givenPagingFenceDelayZeroWhenCurrentPagingFenceValueGreaterThanPagingFenceObjectThenNoPagingFenceDelayCalled) {
EXPECT_EQ(WddmPagingFenceTest::defaultTestDelay, wddm->pagingFenceDelayTime);
wddm->mockPagingFence = 0u;
wddm->currentPagingFenceValue = 3u;
wddm->pagingFenceDelayTime = 0;
wddm->waitOnPagingFenceFromCpu();
EXPECT_EQ(0u, wddm->delayPagingFenceFromCpuResult.called);
}