fix: Do not align svm gpu greater than its svm cpu

Resolves: HSD-18042781233

Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2025-08-04 13:46:43 +00:00
committed by Compute-Runtime-Automation
parent 7e540d5ad5
commit 3e2acefac1
5 changed files with 24 additions and 4 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021-2023 Intel Corporation
* Copyright (C) 2021-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -42,11 +42,20 @@ void AlignmentSelector::addCandidateAlignment(size_t alignment, bool applyForSma
}
AlignmentSelector::CandidateAlignment AlignmentSelector::selectAlignment(size_t size) const {
constexpr size_t noAlignmentLimit = std::numeric_limits<size_t>::max();
return this->selectAlignment(size, noAlignmentLimit);
}
AlignmentSelector::CandidateAlignment AlignmentSelector::selectAlignment(size_t size, size_t maximumPossibleAlignment) const {
for (const CandidateAlignment &candidateAlignment : this->candidateAlignments) {
if (!candidateAlignment.applyForSmallerSize && size < candidateAlignment.alignment) {
continue;
}
if (candidateAlignment.alignment > maximumPossibleAlignment) {
continue;
}
const size_t alignedSize = alignUp(size, candidateAlignment.alignment);
const size_t wastedMemory = alignedSize - size;
const size_t maxWastedMemory = static_cast<size_t>(alignedSize * candidateAlignment.maxMemoryWastage);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021-2022 Intel Corporation
* Copyright (C) 2021-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -32,6 +32,7 @@ class AlignmentSelector {
void addCandidateAlignment(size_t alignment, bool applyForSmallerSize, float maxMemoryWastage, HeapIndex heap);
CandidateAlignment selectAlignment(size_t size) const;
CandidateAlignment selectAlignment(size_t size, size_t maximumPossibleAlignment) const;
auto &peekCandidateAlignments() const { return candidateAlignments; }
private:

View File

@@ -1433,7 +1433,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryInDevicePool(const
alignment = MemoryConstants::pageSize64k;
sizeAligned = allocationData.imgInfo->size;
} else {
alignment = (allocationData.type == AllocationType::svmGpu && allocationData.allocationMethod == NEO::GfxMemoryAllocationMethod::allocateByKmd) ? allocationData.alignment : alignmentSelector.selectAlignment(allocationData.size).alignment;
alignment = alignmentSelector.selectAlignment(allocationData.size, allocationData.type == AllocationType::svmGpu ? allocationData.alignment : std::numeric_limits<size_t>::max()).alignment;
sizeAligned = alignUp(allocationData.size, alignment);
if (debugManager.flags.ExperimentalAlignLocalMemorySizeTo2MB.get()) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2023 Intel Corporation
* Copyright (C) 2019-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -52,6 +52,15 @@ TEST(AlignmentSelectorTests, givenApplyForSmallerSizeEnabledAndAllocationIsTooSm
EXPECT_EQ(128u, selector.selectAlignment(127).alignment);
}
TEST(AlignmentSelectorTests, givenMaximimumPossibleAlignmentWhenSelectAlignmentThenDoNotSelectGreaterThanLimit) {
AlignmentSelector selector{};
selector.addCandidateAlignment(1024, false, AlignmentSelector::anyWastage);
selector.addCandidateAlignment(2048, false, AlignmentSelector::anyWastage);
EXPECT_EQ(2048u, selector.selectAlignment(90000, std::numeric_limits<size_t>::max()).alignment);
EXPECT_EQ(1024u, selector.selectAlignment(90000, 1024u).alignment);
}
TEST(AlignmentSelectorTests, givenMultipleMatchingCandidateAlignmentsWhenSelectingAlignmentThenSelectTheBiggest) {
AlignmentSelector selector{};
selector.addCandidateAlignment(1024, false, AlignmentSelector::anyWastage);

View File

@@ -2033,6 +2033,7 @@ TEST_F(WddmMemoryManagerSimpleTest, givenShareableAllocationWhenAllocateGraphics
properties.size = MemoryConstants::pageSize;
properties.flags.allocateMemory = true;
properties.flags.shareable = true;
properties.alignment = MemoryConstants::pageSize64k;
auto allocation = memoryManager->allocateGraphicsMemoryInPreferredPool(properties, nullptr);
EXPECT_NE(nullptr, allocation);