[perf] simplify state transition for size properties

State base address size proprties are not used to track state changes, but
they are important to carry size values.
Simplify state base address tracking, so they can update the value of the
property, but not the dirty state.

Related-To: NEO-7828

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz 2023-04-03 16:32:12 +00:00 committed by Compute-Runtime-Automation
parent 3ff7a63145
commit f211d97363
4 changed files with 62 additions and 36 deletions

View File

@ -349,9 +349,7 @@ void StateBaseAddressProperties::setPropertiesBindingTableSurfaceState(int64_t b
DEBUG_BREAK_IF(!this->propertiesSupportLoaded); DEBUG_BREAK_IF(!this->propertiesSupportLoaded);
this->bindingTablePoolBaseAddress.isDirty = false; this->bindingTablePoolBaseAddress.isDirty = false;
this->bindingTablePoolSize.isDirty = false;
this->surfaceStateBaseAddress.isDirty = false; this->surfaceStateBaseAddress.isDirty = false;
this->surfaceStateSize.isDirty = false;
if (this->stateBaseAddressPropertiesSupport.bindingTablePoolBaseAddress) { if (this->stateBaseAddressPropertiesSupport.bindingTablePoolBaseAddress) {
this->bindingTablePoolBaseAddress.set(bindingTablePoolBaseAddress); this->bindingTablePoolBaseAddress.set(bindingTablePoolBaseAddress);
@ -365,7 +363,6 @@ void StateBaseAddressProperties::setPropertiesSurfaceState(int64_t surfaceStateB
DEBUG_BREAK_IF(!this->propertiesSupportLoaded); DEBUG_BREAK_IF(!this->propertiesSupportLoaded);
this->surfaceStateBaseAddress.isDirty = false; this->surfaceStateBaseAddress.isDirty = false;
this->surfaceStateSize.isDirty = false;
this->surfaceStateBaseAddress.set(surfaceStateBaseAddress); this->surfaceStateBaseAddress.set(surfaceStateBaseAddress);
this->surfaceStateSize.set(surfaceStateSize); this->surfaceStateSize.set(surfaceStateSize);
@ -373,14 +370,12 @@ void StateBaseAddressProperties::setPropertiesSurfaceState(int64_t surfaceStateB
void StateBaseAddressProperties::setPropertiesDynamicState(int64_t dynamicStateBaseAddress, size_t dynamicStateSize) { void StateBaseAddressProperties::setPropertiesDynamicState(int64_t dynamicStateBaseAddress, size_t dynamicStateSize) {
this->dynamicStateBaseAddress.isDirty = false; this->dynamicStateBaseAddress.isDirty = false;
this->dynamicStateSize.isDirty = false;
this->dynamicStateBaseAddress.set(dynamicStateBaseAddress); this->dynamicStateBaseAddress.set(dynamicStateBaseAddress);
this->dynamicStateSize.set(dynamicStateSize); this->dynamicStateSize.set(dynamicStateSize);
} }
void StateBaseAddressProperties::setPropertiesIndirectState(int64_t indirectObjectBaseAddress, size_t indirectObjectSize) { void StateBaseAddressProperties::setPropertiesIndirectState(int64_t indirectObjectBaseAddress, size_t indirectObjectSize) {
this->indirectObjectBaseAddress.isDirty = false; this->indirectObjectBaseAddress.isDirty = false;
this->indirectObjectSize.isDirty = false;
this->indirectObjectBaseAddress.set(indirectObjectBaseAddress); this->indirectObjectBaseAddress.set(indirectObjectBaseAddress);
this->indirectObjectSize.set(indirectObjectSize); this->indirectObjectSize.set(indirectObjectSize);
} }
@ -457,7 +452,6 @@ void StateBaseAddressProperties::copyPropertiesStatelessMocs(const StateBaseAddr
void StateBaseAddressProperties::copyPropertiesStatelessMocsIndirectState(const StateBaseAddressProperties &properties) { void StateBaseAddressProperties::copyPropertiesStatelessMocsIndirectState(const StateBaseAddressProperties &properties) {
this->statelessMocs.isDirty = false; this->statelessMocs.isDirty = false;
this->indirectObjectBaseAddress.isDirty = false; this->indirectObjectBaseAddress.isDirty = false;
this->indirectObjectSize.isDirty = false;
this->statelessMocs.set(properties.statelessMocs.value); this->statelessMocs.set(properties.statelessMocs.value);
this->indirectObjectBaseAddress.set(properties.indirectObjectBaseAddress.value); this->indirectObjectBaseAddress.set(properties.indirectObjectBaseAddress.value);
@ -466,21 +460,17 @@ void StateBaseAddressProperties::copyPropertiesStatelessMocsIndirectState(const
bool StateBaseAddressProperties::isDirty() const { bool StateBaseAddressProperties::isDirty() const {
return globalAtomics.isDirty || statelessMocs.isDirty || return globalAtomics.isDirty || statelessMocs.isDirty ||
bindingTablePoolBaseAddress.isDirty || bindingTablePoolSize.isDirty || bindingTablePoolBaseAddress.isDirty ||
surfaceStateBaseAddress.isDirty || surfaceStateSize.isDirty || surfaceStateBaseAddress.isDirty ||
dynamicStateBaseAddress.isDirty || dynamicStateSize.isDirty || dynamicStateBaseAddress.isDirty ||
indirectObjectBaseAddress.isDirty || indirectObjectSize.isDirty; indirectObjectBaseAddress.isDirty;
} }
void StateBaseAddressProperties::clearIsDirty() { void StateBaseAddressProperties::clearIsDirty() {
globalAtomics.isDirty = false; globalAtomics.isDirty = false;
statelessMocs.isDirty = false; statelessMocs.isDirty = false;
bindingTablePoolBaseAddress.isDirty = false; bindingTablePoolBaseAddress.isDirty = false;
bindingTablePoolSize.isDirty = false;
surfaceStateBaseAddress.isDirty = false; surfaceStateBaseAddress.isDirty = false;
surfaceStateSize.isDirty = false;
dynamicStateBaseAddress.isDirty = false; dynamicStateBaseAddress.isDirty = false;
dynamicStateSize.isDirty = false;
indirectObjectBaseAddress.isDirty = false; indirectObjectBaseAddress.isDirty = false;
indirectObjectSize.isDirty = false;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2021-2022 Intel Corporation * Copyright (C) 2021-2023 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -12,23 +12,29 @@
namespace NEO { namespace NEO {
template <typename Type> template <typename Type, bool fullStateProperty>
struct StreamPropertyType { struct StreamPropertyType {
static constexpr Type initValue = static_cast<Type>(-1); static constexpr Type initValue = static_cast<Type>(-1);
Type value = initValue; Type value = initValue;
bool isDirty = false; bool isDirty = false;
void set(Type newValue) { void set(Type newValue) {
if ((value != newValue) && (newValue != initValue)) { if constexpr (fullStateProperty) {
value = newValue; if ((value != newValue) && (newValue != initValue)) {
isDirty = true; value = newValue;
isDirty = true;
}
} else {
if (newValue != initValue) {
value = newValue;
}
} }
} }
}; };
using StreamProperty32 = StreamPropertyType<int32_t>; using StreamProperty32 = StreamPropertyType<int32_t, true>;
using StreamProperty64 = StreamPropertyType<int64_t>; using StreamProperty64 = StreamPropertyType<int64_t, true>;
using StreamPropertySizeT = StreamPropertyType<size_t>; using StreamPropertySizeT = StreamPropertyType<size_t, false>;
using StreamProperty = StreamProperty32; using StreamProperty = StreamProperty32;

View File

@ -829,7 +829,7 @@ TEST(StreamPropertiesTests, givenStateBaseAddressSupportFlagStateWhenSettingProp
EXPECT_FALSE(sbaProperties.globalAtomics.isDirty); EXPECT_FALSE(sbaProperties.globalAtomics.isDirty);
EXPECT_FALSE(sbaProperties.statelessMocs.isDirty); EXPECT_FALSE(sbaProperties.statelessMocs.isDirty);
EXPECT_TRUE(sbaProperties.bindingTablePoolBaseAddress.isDirty); EXPECT_TRUE(sbaProperties.bindingTablePoolBaseAddress.isDirty);
EXPECT_TRUE(sbaProperties.bindingTablePoolSize.isDirty); EXPECT_FALSE(sbaProperties.bindingTablePoolSize.isDirty);
EXPECT_EQ(1, sbaProperties.globalAtomics.value); EXPECT_EQ(1, sbaProperties.globalAtomics.value);
EXPECT_EQ(1, sbaProperties.statelessMocs.value); EXPECT_EQ(1, sbaProperties.statelessMocs.value);
@ -849,7 +849,7 @@ TEST(StreamPropertiesTests, givenStateBaseAddressSupportFlagStateWhenSettingProp
EXPECT_EQ(2u, sbaProperties.bindingTablePoolSize.value); EXPECT_EQ(2u, sbaProperties.bindingTablePoolSize.value);
sbaProperties.setPropertiesAll(false, 0, 3, 3, -1, -1, -1, -1, -1, -1); sbaProperties.setPropertiesAll(false, 0, 3, 3, -1, -1, -1, -1, -1, -1);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(0, sbaProperties.globalAtomics.value); EXPECT_EQ(0, sbaProperties.globalAtomics.value);
EXPECT_EQ(0, sbaProperties.statelessMocs.value); EXPECT_EQ(0, sbaProperties.statelessMocs.value);
@ -919,11 +919,11 @@ TEST(StreamPropertiesTests, givenStateBaseAddressCommonBaseAddressAndSizeWhenSet
EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty);
sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, -1, -1, -1, -1); sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, -1, -1, -1, -1);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(20u, sbaProperties.surfaceStateSize.value); EXPECT_EQ(20u, sbaProperties.surfaceStateSize.value);
EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty);
EXPECT_TRUE(sbaProperties.surfaceStateSize.isDirty); EXPECT_FALSE(sbaProperties.surfaceStateSize.isDirty);
EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty);
EXPECT_FALSE(sbaProperties.dynamicStateSize.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateSize.isDirty);
EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty);
@ -941,13 +941,13 @@ TEST(StreamPropertiesTests, givenStateBaseAddressCommonBaseAddressAndSizeWhenSet
EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty);
sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, -1, -1); sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, -1, -1);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(40u, sbaProperties.dynamicStateSize.value); EXPECT_EQ(40u, sbaProperties.dynamicStateSize.value);
EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty);
EXPECT_FALSE(sbaProperties.surfaceStateSize.isDirty); EXPECT_FALSE(sbaProperties.surfaceStateSize.isDirty);
EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty);
EXPECT_TRUE(sbaProperties.dynamicStateSize.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateSize.isDirty);
EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty);
EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty);
@ -963,7 +963,7 @@ TEST(StreamPropertiesTests, givenStateBaseAddressCommonBaseAddressAndSizeWhenSet
EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty);
sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, 50, 60); sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, 50, 60);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(60u, sbaProperties.indirectObjectSize.value); EXPECT_EQ(60u, sbaProperties.indirectObjectSize.value);
EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.surfaceStateBaseAddress.isDirty);
@ -971,7 +971,7 @@ TEST(StreamPropertiesTests, givenStateBaseAddressCommonBaseAddressAndSizeWhenSet
EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateBaseAddress.isDirty);
EXPECT_FALSE(sbaProperties.dynamicStateSize.isDirty); EXPECT_FALSE(sbaProperties.dynamicStateSize.isDirty);
EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectBaseAddress.isDirty);
EXPECT_TRUE(sbaProperties.indirectObjectSize.isDirty); EXPECT_FALSE(sbaProperties.indirectObjectSize.isDirty);
sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, 50, 60); sbaProperties.setPropertiesAll(false, -1, -1, 10, 10, 20, 30, 40, 50, 60);
EXPECT_FALSE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
@ -1132,7 +1132,7 @@ TEST(StreamPropertiesTests, givenIndirectHeapAndStatelessMocsStateBaseAddressPro
indirectObjectSize = 2; indirectObjectSize = 2;
sbaProperties.setPropertiesIndirectState(indirectObjectBaseAddress, indirectObjectSize); sbaProperties.setPropertiesIndirectState(indirectObjectBaseAddress, indirectObjectSize);
sbaPropertiesCopy.copyPropertiesStatelessMocsIndirectState(sbaProperties); sbaPropertiesCopy.copyPropertiesStatelessMocsIndirectState(sbaProperties);
EXPECT_TRUE(sbaPropertiesCopy.isDirty()); EXPECT_FALSE(sbaPropertiesCopy.isDirty());
EXPECT_EQ(1, sbaPropertiesCopy.statelessMocs.value); EXPECT_EQ(1, sbaPropertiesCopy.statelessMocs.value);
EXPECT_EQ(2, sbaPropertiesCopy.indirectObjectBaseAddress.value); EXPECT_EQ(2, sbaPropertiesCopy.indirectObjectBaseAddress.value);
EXPECT_EQ(2u, sbaPropertiesCopy.indirectObjectSize.value); EXPECT_EQ(2u, sbaPropertiesCopy.indirectObjectSize.value);
@ -1200,6 +1200,24 @@ TEST(StreamPropertiesTests, givenBindingTableAndSurfaceStateBaseAddressStateBase
EXPECT_EQ(1u, sbaProperties.bindingTablePoolSize.value); EXPECT_EQ(1u, sbaProperties.bindingTablePoolSize.value);
EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value); EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(1u, sbaProperties.surfaceStateSize.value); EXPECT_EQ(1u, sbaProperties.surfaceStateSize.value);
surfaceStateSize = 2;
bindingTablePoolSize = 2;
sbaProperties.setPropertiesBindingTableSurfaceState(bindingTablePoolBaseAddress, bindingTablePoolSize, surfaceStateBaseAddress, surfaceStateSize);
EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(1, sbaProperties.bindingTablePoolBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.bindingTablePoolSize.value);
EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.surfaceStateSize.value);
bindingTablePoolBaseAddress = 2;
surfaceStateBaseAddress = 2;
sbaProperties.setPropertiesBindingTableSurfaceState(bindingTablePoolBaseAddress, bindingTablePoolSize, surfaceStateBaseAddress, surfaceStateSize);
EXPECT_TRUE(sbaProperties.isDirty());
EXPECT_EQ(2, sbaProperties.bindingTablePoolBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.bindingTablePoolSize.value);
EXPECT_EQ(2, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.surfaceStateSize.value);
} }
TEST(StreamPropertiesTests, givenSurfaceStateBaseAddressStateBaseAddressPropertyWhenSettingPropertyAndCheckIfSupportedThenExpectCorrectState) { TEST(StreamPropertiesTests, givenSurfaceStateBaseAddressStateBaseAddressPropertyWhenSettingPropertyAndCheckIfSupportedThenExpectCorrectState) {
@ -1230,6 +1248,18 @@ TEST(StreamPropertiesTests, givenSurfaceStateBaseAddressStateBaseAddressProperty
EXPECT_FALSE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value); EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(1u, sbaProperties.surfaceStateSize.value); EXPECT_EQ(1u, sbaProperties.surfaceStateSize.value);
surfaceStateSize = 2;
sbaProperties.setPropertiesSurfaceState(surfaceStateBaseAddress, surfaceStateSize);
EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(1, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.surfaceStateSize.value);
surfaceStateBaseAddress = 2;
sbaProperties.setPropertiesSurfaceState(surfaceStateBaseAddress, surfaceStateSize);
EXPECT_TRUE(sbaProperties.isDirty());
EXPECT_EQ(2, sbaProperties.surfaceStateBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.surfaceStateSize.value);
} }
TEST(StreamPropertiesTests, givenDynamicStateBaseAddressStateBaseAddressPropertyWhenSettingPropertyAndCheckIfSupportedThenExpectCorrectState) { TEST(StreamPropertiesTests, givenDynamicStateBaseAddressStateBaseAddressPropertyWhenSettingPropertyAndCheckIfSupportedThenExpectCorrectState) {
@ -1262,7 +1292,7 @@ TEST(StreamPropertiesTests, givenDynamicStateBaseAddressStateBaseAddressProperty
dynamicStateSize = 2; dynamicStateSize = 2;
sbaProperties.setPropertiesDynamicState(dynamicStateBaseAddress, dynamicStateSize); sbaProperties.setPropertiesDynamicState(dynamicStateBaseAddress, dynamicStateSize);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(1, sbaProperties.dynamicStateBaseAddress.value); EXPECT_EQ(1, sbaProperties.dynamicStateBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.dynamicStateSize.value); EXPECT_EQ(2u, sbaProperties.dynamicStateSize.value);
@ -1303,7 +1333,7 @@ TEST(StreamPropertiesTests, givenIndirectObjectBaseAddressStateBaseAddressProper
indirectObjectSize = 2; indirectObjectSize = 2;
sbaProperties.setPropertiesIndirectState(indirectObjectBaseAddress, indirectObjectSize); sbaProperties.setPropertiesIndirectState(indirectObjectBaseAddress, indirectObjectSize);
EXPECT_TRUE(sbaProperties.isDirty()); EXPECT_FALSE(sbaProperties.isDirty());
EXPECT_EQ(1, sbaProperties.indirectObjectBaseAddress.value); EXPECT_EQ(1, sbaProperties.indirectObjectBaseAddress.value);
EXPECT_EQ(2u, sbaProperties.indirectObjectSize.value); EXPECT_EQ(2u, sbaProperties.indirectObjectSize.value);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2021-2022 Intel Corporation * Copyright (C) 2021-2023 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -16,10 +16,10 @@ struct FrontEndProperties;
struct PipelineSelectProperties; struct PipelineSelectProperties;
struct StateComputeModeProperties; struct StateComputeModeProperties;
template <typename Type> template <typename Type, bool fullStatePropert>
struct StreamPropertyType; struct StreamPropertyType;
using StreamProperty = StreamPropertyType<int32_t>; using StreamProperty = StreamPropertyType<int32_t, true>;
std::vector<StreamProperty *> getAllStateComputeModeProperties(StateComputeModeProperties &properties); std::vector<StreamProperty *> getAllStateComputeModeProperties(StateComputeModeProperties &properties);
std::vector<StreamProperty *> getAllFrontEndProperties(FrontEndProperties &properties); std::vector<StreamProperty *> getAllFrontEndProperties(FrontEndProperties &properties);