mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-21 09:14:47 +08:00
Change notify delay to use microseconds.
- Microseconds offer better precision. - Some workloads require threshold less then 1 millisecond to work efficiently. Change-Id: I1a565049340fb6eeebe5c0a61ededae9959daca8
This commit is contained in:
@@ -176,7 +176,7 @@ void CommandStreamReceiver::cleanupResources() {
|
||||
}
|
||||
}
|
||||
|
||||
bool CommandStreamReceiver::waitForCompletionWithTimeout(bool enableTimeout, int64_t timeoutMs, uint32_t taskCountToWait) {
|
||||
bool CommandStreamReceiver::waitForCompletionWithTimeout(bool enableTimeout, int64_t timeoutMicroseconds, uint32_t taskCountToWait) {
|
||||
std::chrono::high_resolution_clock::time_point time1, time2;
|
||||
int64_t timeDiff = 0;
|
||||
|
||||
@@ -186,10 +186,10 @@ bool CommandStreamReceiver::waitForCompletionWithTimeout(bool enableTimeout, int
|
||||
}
|
||||
|
||||
time1 = std::chrono::high_resolution_clock::now();
|
||||
while (*getTagAddress() < taskCountToWait && timeDiff <= timeoutMs) {
|
||||
while (*getTagAddress() < taskCountToWait && timeDiff <= timeoutMicroseconds) {
|
||||
if (enableTimeout) {
|
||||
time2 = std::chrono::high_resolution_clock::now();
|
||||
timeDiff = std::chrono::duration_cast<std::chrono::milliseconds>(time2 - time1).count();
|
||||
timeDiff = std::chrono::duration_cast<std::chrono::microseconds>(time2 - time1).count();
|
||||
}
|
||||
}
|
||||
if (*getTagAddress() >= taskCountToWait) {
|
||||
|
||||
@@ -112,7 +112,7 @@ class CommandStreamReceiver {
|
||||
void requestThreadArbitrationPolicy(uint32_t requiredPolicy) { this->requiredThreadArbitrationPolicy = requiredPolicy; }
|
||||
|
||||
virtual void waitForTaskCountWithKmdNotifyFallback(uint32_t taskCountToWait, FlushStamp flushStampToWait) = 0;
|
||||
MOCKABLE_VIRTUAL bool waitForCompletionWithTimeout(bool enableTimeout, int64_t timeoutMs, uint32_t taskCountToWait);
|
||||
MOCKABLE_VIRTUAL bool waitForCompletionWithTimeout(bool enableTimeout, int64_t timeoutMicroseconds, uint32_t taskCountToWait);
|
||||
|
||||
// returns size of block that needs to be reserved at the beginning of each instruction heap for CommandStreamReceiver
|
||||
MOCKABLE_VIRTUAL size_t getInstructionHeapCmdStreamReceiverReservedSize() const;
|
||||
|
||||
@@ -550,11 +550,11 @@ inline void CommandStreamReceiverHw<GfxFamily>::emitNoop(LinearStream &commandSt
|
||||
|
||||
template <typename GfxFamily>
|
||||
inline void CommandStreamReceiverHw<GfxFamily>::waitForTaskCountWithKmdNotifyFallback(uint32_t taskCountToWait, FlushStamp flushStampToWait) {
|
||||
auto status = waitForCompletionWithTimeout(this->hwInfo.capabilityTable.enableKmdNotify, this->hwInfo.capabilityTable.delayKmdNotifyMs, taskCountToWait);
|
||||
auto status = waitForCompletionWithTimeout(this->hwInfo.capabilityTable.enableKmdNotify, this->hwInfo.capabilityTable.delayKmdNotifyMicroseconds, taskCountToWait);
|
||||
if (!status) {
|
||||
waitForFlushStamp(flushStampToWait);
|
||||
//now call blocking wait, this is to ensure that task count is reached
|
||||
waitForCompletionWithTimeout(false, this->hwInfo.capabilityTable.delayKmdNotifyMs, taskCountToWait);
|
||||
waitForCompletionWithTimeout(false, this->hwInfo.capabilityTable.delayKmdNotifyMicroseconds, taskCountToWait);
|
||||
}
|
||||
|
||||
UNRECOVERABLE_IF(*getTagAddress() < taskCountToWait);
|
||||
|
||||
@@ -70,7 +70,7 @@ const RuntimeCapabilityTable BDW::capabilityTable{
|
||||
true,
|
||||
true, // forceStatelessCompilationFor32Bit
|
||||
false, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
false, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -66,7 +66,7 @@ const RuntimeCapabilityTable BXT::capabilityTable{
|
||||
true,
|
||||
false, // forceStatelessCompilationFor32Bit
|
||||
false, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
false, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -61,7 +61,7 @@ const RuntimeCapabilityTable CFL::capabilityTable{
|
||||
true,
|
||||
true, // forceStatelessCompilationFor32Bit
|
||||
false, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
true, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -61,7 +61,7 @@ const RuntimeCapabilityTable GLK::capabilityTable{
|
||||
true,
|
||||
false, // forceStatelessCompilationFor32Bit
|
||||
true, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
false, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -61,7 +61,7 @@ const RuntimeCapabilityTable KBL::capabilityTable{
|
||||
true,
|
||||
true, // forceStatelessCompilationFor32Bit
|
||||
false, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
true, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -69,7 +69,7 @@ const RuntimeCapabilityTable SKL::capabilityTable{
|
||||
true,
|
||||
true, // forceStatelessCompilationFor32Bit
|
||||
false, // EnableKmdNotify
|
||||
30, // delayKmdNotifyMs
|
||||
30000, // delayKmdNotifyMicroseconds
|
||||
true, // ftr64KBpages
|
||||
EngineType::ENGINE_RCS // defaultEngineType
|
||||
};
|
||||
|
||||
@@ -65,7 +65,7 @@ struct RuntimeCapabilityTable {
|
||||
bool forceStatelessCompilationFor32Bit;
|
||||
|
||||
bool enableKmdNotify;
|
||||
int64_t delayKmdNotifyMs;
|
||||
int64_t delayKmdNotifyMicroseconds;
|
||||
bool ftr64KBpages;
|
||||
|
||||
EngineType defaultEngineType;
|
||||
|
||||
@@ -73,7 +73,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, Enable64kbpages, -1, "-1: default behaviour, 0 D
|
||||
DECLARE_DEBUG_VARIABLE(bool, EnableComputeWorkSizeND, true, "Enables diffrent algorithm to compute local work size")
|
||||
DECLARE_DEBUG_VARIABLE(bool, EnableComputeWorkSizeSquared, false, "Enables algorithm to compute the most squared work group as possible")
|
||||
DECLARE_DEBUG_VARIABLE(int32_t, OverrideEnableKmdNotify, -1, "-1: dont override, 0: disable, 1: enable")
|
||||
DECLARE_DEBUG_VARIABLE(int32_t, OverrideKmdNotifyDelayMs, -1, "-1: dont override, 0: infinite timeout, >0: timeout in ms")
|
||||
DECLARE_DEBUG_VARIABLE(int32_t, OverrideKmdNotifyDelayMicroseconds, -1, "-1: dont override, 0: infinite timeout, >0: timeout in microseconds")
|
||||
DECLARE_DEBUG_VARIABLE(bool, EnableVaLibCalls, true, "Enable cl-va sharing lib calls")
|
||||
DECLARE_DEBUG_VARIABLE(int32_t, CsrDispatchMode, 0, "Chooses DispatchMode for Csr")
|
||||
/*DRIVER TOGGLES*/
|
||||
|
||||
@@ -185,9 +185,9 @@ int HwInfoConfig::configureHwInfo(const HardwareInfo *inHwInfo, HardwareInfo *ou
|
||||
? !!DebugManager.flags.OverrideEnableKmdNotify.get()
|
||||
: outHwInfo->capabilityTable.enableKmdNotify;
|
||||
|
||||
outHwInfo->capabilityTable.delayKmdNotifyMs = DebugManager.flags.OverrideKmdNotifyDelayMs.get() >= 0
|
||||
? static_cast<int64_t>(DebugManager.flags.OverrideKmdNotifyDelayMs.get())
|
||||
: outHwInfo->capabilityTable.delayKmdNotifyMs;
|
||||
outHwInfo->capabilityTable.delayKmdNotifyMicroseconds = DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.get() >= 0
|
||||
? static_cast<int64_t>(DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.get())
|
||||
: outHwInfo->capabilityTable.delayKmdNotifyMicroseconds;
|
||||
|
||||
pPlatform.release();
|
||||
pSkuTable.release();
|
||||
|
||||
@@ -90,9 +90,9 @@ bool DeviceFactory::getDevices(HardwareInfo **pHWInfos, size_t &numDevices) {
|
||||
? !!DebugManager.flags.OverrideEnableKmdNotify.get()
|
||||
: tempHwInfos[devNum].capabilityTable.enableKmdNotify;
|
||||
|
||||
tempHwInfos[devNum].capabilityTable.delayKmdNotifyMs = DebugManager.flags.OverrideKmdNotifyDelayMs.get() >= 0
|
||||
? static_cast<int64_t>(DebugManager.flags.OverrideKmdNotifyDelayMs.get())
|
||||
: tempHwInfos[devNum].capabilityTable.delayKmdNotifyMs;
|
||||
tempHwInfos[devNum].capabilityTable.delayKmdNotifyMicroseconds = DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.get() >= 0
|
||||
? static_cast<int64_t>(DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.get())
|
||||
: tempHwInfos[devNum].capabilityTable.delayKmdNotifyMicroseconds;
|
||||
|
||||
numDevices = 1;
|
||||
*pHWInfos = tempHwInfos;
|
||||
|
||||
@@ -666,7 +666,7 @@ struct KmdNotifyTests : public ::testing::Test {
|
||||
}
|
||||
DebugManagerStateRestore stateRestore;
|
||||
DebugManager.flags.OverrideEnableKmdNotify.set(overrideEnable);
|
||||
DebugManager.flags.OverrideKmdNotifyDelayMs.set(overrideTimeout);
|
||||
DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.set(overrideTimeout);
|
||||
size_t numDevices;
|
||||
HardwareInfo *hwInfo = nullptr;
|
||||
DeviceFactory::getDevices(&hwInfo, numDevices);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -57,7 +57,7 @@ GEN8TEST_F(Gen8DeviceCaps, whitelistedRegister) {
|
||||
|
||||
GEN8TEST_F(Gen8DeviceCaps, kmdNotifyMechanism) {
|
||||
EXPECT_FALSE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
GEN8TEST_F(Gen8DeviceCaps, compression) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -86,5 +86,5 @@ BXTTEST_F(BxtUsDeviceIdTest, isSimulationCap) {
|
||||
|
||||
BXTTEST_F(BxtUsDeviceIdTest, kmdNotifyMechanism) {
|
||||
EXPECT_FALSE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ CFLTEST_F(CflDeviceCaps, reportsOcl21) {
|
||||
|
||||
CFLTEST_F(CflDeviceCaps, kmdNotifyMechanism) {
|
||||
EXPECT_FALSE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
CFLTEST_F(CflDeviceCaps, GivenCFLWhenCheckftr64KBpagesThenTrue) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Intel Corporation
|
||||
* Copyright (c) 2017 - 2018, Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -75,7 +75,7 @@ GLKTEST_F(GlkUsDeviceIdTest, isSimulationCap) {
|
||||
|
||||
GLKTEST_F(GlkUsDeviceIdTest, kmdNotifyMechanism) {
|
||||
EXPECT_TRUE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
GLKTEST_F(GlkUsDeviceIdTest, GivenGLKWhenCheckftr64KBpagesThenFalse) {
|
||||
|
||||
@@ -35,7 +35,7 @@ KBLTEST_F(KblDeviceCaps, reportsOcl21) {
|
||||
|
||||
KBLTEST_F(KblDeviceCaps, kmdNotifyMechanism) {
|
||||
EXPECT_FALSE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
KBLTEST_F(KblDeviceCaps, GivenKBLWhenCheckftr64KBpagesThenTrue) {
|
||||
|
||||
@@ -83,7 +83,7 @@ SKLTEST_F(SklUsDeviceIdTest, isSimulationCap) {
|
||||
|
||||
SKLTEST_F(SklUsDeviceIdTest, kmdNotifyMechanism) {
|
||||
EXPECT_FALSE(pDevice->getHardwareInfo().capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(30, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(30000, pDevice->getHardwareInfo().capabilityTable.delayKmdNotifyMicroseconds);
|
||||
}
|
||||
|
||||
SKLTEST_F(SklUsDeviceIdTest, GivenSKLWhenCheckftr64KBpagesThenTrue) {
|
||||
|
||||
@@ -102,17 +102,17 @@ TEST_F(DeviceFactoryTest, overrideKmdNotifySettings) {
|
||||
bool success = DeviceFactory::getDevices(&hwInfoReference, numDevices);
|
||||
ASSERT_TRUE(success);
|
||||
auto refEnableKmdNotify = hwInfoReference->capabilityTable.enableKmdNotify;
|
||||
auto refDelayKmdNotifyMs = hwInfoReference->capabilityTable.delayKmdNotifyMs;
|
||||
auto refDelayKmdNotifyMicroseconds = hwInfoReference->capabilityTable.delayKmdNotifyMicroseconds;
|
||||
DeviceFactory::releaseDevices();
|
||||
|
||||
DebugManager.flags.OverrideEnableKmdNotify.set(!refEnableKmdNotify);
|
||||
DebugManager.flags.OverrideKmdNotifyDelayMs.set(static_cast<int32_t>(refDelayKmdNotifyMs) + 10);
|
||||
DebugManager.flags.OverrideKmdNotifyDelayMicroseconds.set(static_cast<int32_t>(refDelayKmdNotifyMicroseconds) + 10);
|
||||
|
||||
success = DeviceFactory::getDevices(&hwInfoOverriden, numDevices);
|
||||
ASSERT_TRUE(success);
|
||||
|
||||
EXPECT_EQ(!refEnableKmdNotify, hwInfoOverriden->capabilityTable.enableKmdNotify);
|
||||
EXPECT_EQ(refDelayKmdNotifyMs + 10, hwInfoOverriden->capabilityTable.delayKmdNotifyMs);
|
||||
EXPECT_EQ(refDelayKmdNotifyMicroseconds + 10, hwInfoOverriden->capabilityTable.delayKmdNotifyMicroseconds);
|
||||
|
||||
DeviceFactory::releaseDevices();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user