performance: Optimize heap handling when mitigate dc flush

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk 2024-09-02 13:11:04 +00:00 committed by Compute-Runtime-Automation
parent c0cec096a5
commit 9249c5c65c
11 changed files with 53 additions and 14 deletions

View File

@ -570,6 +570,9 @@ void CommandContainer::storeAllocationAndFlushTagUpdate(GraphicsAllocation *allo
} else {
getHeapHelper()->storeHeapAllocation(allocation);
}
if (device->getProductHelper().isDcFlushMitigated()) {
this->immediateCmdListCsr->registerDcFlushForDcMitigation();
}
this->immediateCmdListCsr->flushTagUpdate();
}

View File

@ -689,6 +689,10 @@ IndirectHeap &CommandStreamReceiver::getIndirectHeap(IndirectHeap::Type heapType
internalAllocationStorage->storeAllocation(std::unique_ptr<GraphicsAllocation>(heapMemory), REUSABLE_ALLOCATION);
heapMemory = nullptr;
this->heapStorageRequiresRecyclingTag = true;
if (this->peekRootDeviceEnvironment().getProductHelper().isDcFlushMitigated()) {
this->registerDcFlushForDcMitigation();
}
}
if (!heapMemory) {

View File

@ -47,7 +47,7 @@ bool CacheSettingsHelper::preferNoCpuAccess(GMM_RESOURCE_USAGE_TYPE_ENUM gmmReso
}
GMM_RESOURCE_USAGE_TYPE_ENUM CacheSettingsHelper::getDefaultUsageTypeWithCachingEnabled(AllocationType allocationType, const ProductHelper &productHelper) {
if (productHelper.overridePatAndUsageForDcFlushMitigation(allocationType)) {
if (productHelper.overrideUsageForDcFlushMitigation(allocationType)) {
return getDefaultUsageTypeWithCachingDisabled(allocationType, productHelper);
}

View File

@ -135,7 +135,9 @@ class ProductHelper {
virtual bool isDcFlushAllowed() const = 0;
virtual bool isDcFlushMitigated() const = 0;
virtual bool mitigateDcFlush() const = 0;
virtual bool overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const = 0;
virtual bool overrideUsageForDcFlushMitigation(AllocationType allocationType) const = 0;
virtual bool overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const = 0;
virtual bool overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const = 0;
virtual bool overrideCacheableForDcFlushMitigation(AllocationType allocationType) const = 0;
virtual uint32_t computeMaxNeededSubSliceSpace(const HardwareInfo &hwInfo) const = 0;
virtual bool getUuid(NEO::DriverModel *driverModel, const uint32_t subDeviceCount, const uint32_t deviceIndex, std::array<uint8_t, ProductHelper::uuidSize> &uuid) const = 0;

View File

@ -416,7 +416,12 @@ bool ProductHelperHw<gfxProduct>::isDcFlushMitigated() const {
}
template <PRODUCT_FAMILY gfxProduct>
bool ProductHelperHw<gfxProduct>::overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const {
bool ProductHelperHw<gfxProduct>::overrideUsageForDcFlushMitigation(AllocationType allocationType) const {
return this->isDcFlushMitigated() && (this->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType) || overridePatToUCAndOneWayCohForDcFlushMitigation(allocationType));
}
template <PRODUCT_FAMILY gfxProduct>
bool ProductHelperHw<gfxProduct>::overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const {
return this->isDcFlushMitigated() &&
(this->overrideCacheableForDcFlushMitigation(allocationType) ||
allocationType == AllocationType::timestampPacketTagBuffer ||
@ -424,6 +429,13 @@ bool ProductHelperHw<gfxProduct>::overridePatAndUsageForDcFlushMitigation(Alloca
allocationType == AllocationType::gpuTimestampDeviceBuffer);
}
template <PRODUCT_FAMILY gfxProduct>
bool ProductHelperHw<gfxProduct>::overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const {
return this->isDcFlushMitigated() &&
(allocationType == AllocationType::internalHeap ||
allocationType == AllocationType::linearStream);
}
template <PRODUCT_FAMILY gfxProduct>
bool ProductHelperHw<gfxProduct>::overrideCacheableForDcFlushMitigation(AllocationType allocationType) const {
return this->isDcFlushMitigated() &&
@ -433,8 +445,6 @@ bool ProductHelperHw<gfxProduct>::overrideCacheableForDcFlushMitigation(Allocati
allocationType == AllocationType::svmCpu ||
allocationType == AllocationType::svmZeroCopy ||
allocationType == AllocationType::internalHostMemory ||
allocationType == AllocationType::internalHeap ||
allocationType == AllocationType::linearStream ||
allocationType == AllocationType::printfSurface);
}

View File

@ -77,7 +77,9 @@ class ProductHelperHw : public ProductHelper {
bool isDcFlushAllowed() const override;
bool isDcFlushMitigated() const override;
bool mitigateDcFlush() const override;
bool overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const override;
bool overrideUsageForDcFlushMitigation(AllocationType allocationType) const override;
bool overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const override;
bool overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const override;
bool overrideCacheableForDcFlushMitigation(AllocationType allocationType) const override;
uint32_t computeMaxNeededSubSliceSpace(const HardwareInfo &hwInfo) const override;
bool getUuid(NEO::DriverModel *driverModel, uint32_t subDeviceCount, uint32_t deviceIndex, std::array<uint8_t, ProductHelper::uuidSize> &uuid) const override;

View File

@ -28,10 +28,14 @@ int ProductHelperHw<gfxProduct>::configureHardwareCustom(HardwareInfo *hwInfo, O
template <>
uint64_t ProductHelperHw<gfxProduct>::overridePatIndex(bool isUncachedType, uint64_t patIndex, AllocationType allocationType) const {
if (this->overridePatAndUsageForDcFlushMitigation(allocationType)) {
if (this->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType)) {
return 2; // L3: WB, L4: UC, 2-Way coh
}
if (this->overridePatToUCAndOneWayCohForDcFlushMitigation(allocationType)) {
return 1; // L3: WB, L4: UC, 1-Way coh
}
return patIndex;
}

View File

@ -292,7 +292,17 @@ bool ProductHelperHw<IGFX_UNKNOWN>::mitigateDcFlush() const {
}
template <>
bool ProductHelperHw<IGFX_UNKNOWN>::overridePatAndUsageForDcFlushMitigation(AllocationType allocationType) const {
bool ProductHelperHw<IGFX_UNKNOWN>::overridePatToUCAndTwoWayCohForDcFlushMitigation(AllocationType allocationType) const {
return false;
}
template <>
bool ProductHelperHw<IGFX_UNKNOWN>::overrideUsageForDcFlushMitigation(AllocationType allocationType) const {
return false;
}
template <>
bool ProductHelperHw<IGFX_UNKNOWN>::overridePatToUCAndOneWayCohForDcFlushMitigation(AllocationType allocationType) const {
return false;
}

View File

@ -311,12 +311,12 @@ HWTEST_F(ProductHelperTest, givenVariousValuesWhenGettingAubStreamSteppingFromHw
EXPECT_EQ(AubMemDump::SteppingValues::A, mockProductHelper.getAubStreamSteppingFromHwRevId(pInHwInfo));
}
HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatAndUsageForDcFlushMitigationThenReturnCorrectValue) {
HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatToUCAndTwoWayCohForDcFlushMitigationThenReturnCorrectValue) {
DebugManagerStateRestore restorer;
if (!productHelper->isDcFlushMitigated()) {
for (auto i = 0; i < static_cast<int>(AllocationType::count); ++i) {
auto allocationType = static_cast<AllocationType>(i);
EXPECT_FALSE(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType));
EXPECT_FALSE(productHelper->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType));
}
}
debugManager.flags.AllowDcFlush.set(0);
@ -334,9 +334,9 @@ HWTEST_F(ProductHelperTest, givenDcFlushMitigationWhenOverridePatAndUsageForDcFl
allocationType == AllocationType::linearStream ||
allocationType == AllocationType::internalHeap ||
allocationType == AllocationType::printfSurface) {
EXPECT_EQ(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType), productHelper->isDcFlushMitigated());
EXPECT_EQ(productHelper->overrideUsageForDcFlushMitigation(allocationType), productHelper->isDcFlushMitigated());
} else {
EXPECT_FALSE(productHelper->overridePatAndUsageForDcFlushMitigation(allocationType));
EXPECT_FALSE(productHelper->overridePatToUCAndTwoWayCohForDcFlushMitigation(allocationType));
}
}
}

View File

@ -146,8 +146,6 @@ LNLTEST_F(LnlProductHelper, givenExternalHostPtrWhenMitigateDcFlushThenOverrideC
allocationType == AllocationType::svmZeroCopy ||
allocationType == AllocationType::internalHostMemory ||
allocationType == AllocationType::commandBuffer ||
allocationType == AllocationType::internalHeap ||
allocationType == AllocationType::linearStream ||
allocationType == AllocationType::printfSurface) {
EXPECT_TRUE(productHelper->overrideAllocationCacheable(allocationData));
} else {

View File

@ -40,6 +40,8 @@ LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenOverridePatIndexCalledT
EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHostMemory));
EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::timestampPacketTagBuffer));
EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::tagBuffer));
EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::linearStream));
EXPECT_EQ(expectedPatIndex, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHeap));
debugManager.flags.AllowDcFlush.set(0);
@ -51,6 +53,10 @@ LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenOverridePatIndexCalledT
EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHostMemory));
EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::timestampPacketTagBuffer));
EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::tagBuffer));
expectedPatIndexOverride = 1u;
EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::linearStream));
EXPECT_EQ(expectedPatIndexOverride, productHelper->overridePatIndex(0u, expectedPatIndex, AllocationType::internalHeap));
}
LNLTEST_F(LnlProductHelperWindows, givenProductHelperWhenIsStagingBuffersEnabledThenTrueIsReturned) {