1 /*
2 * Copyright (C) 2019-2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "shared/source/memory_manager/alignment_selector.h"
9 #include "shared/test/common/test_macros/test.h"
10
11 namespace NEO {
12
TEST(AlignmentSelectorTests,givenNoCandidateAlignmentsWhenSelectingAlignmentThenFail)13 TEST(AlignmentSelectorTests, givenNoCandidateAlignmentsWhenSelectingAlignmentThenFail) {
14 AlignmentSelector selector{};
15 EXPECT_ANY_THROW(selector.selectAlignment(1));
16 EXPECT_ANY_THROW(selector.selectAlignment(1024));
17 }
18
TEST(AlignmentSelectorTests,givenNonPowerOfTwoAlignmentAddedThenFail)19 TEST(AlignmentSelectorTests, givenNonPowerOfTwoAlignmentAddedThenFail) {
20 AlignmentSelector selector{};
21 EXPECT_ANY_THROW(selector.addCandidateAlignment(0, false, AlignmentSelector::anyWastage));
22 EXPECT_ANY_THROW(selector.addCandidateAlignment(3, false, AlignmentSelector::anyWastage));
23 EXPECT_ANY_THROW(selector.addCandidateAlignment(33, false, AlignmentSelector::anyWastage));
24 EXPECT_ANY_THROW(selector.addCandidateAlignment(100, false, AlignmentSelector::anyWastage));
25 }
26
TEST(AlignmentSelectorTests,givenNoMatchingCandidateAlignmentsWhenSelectingAlignmentThenFail)27 TEST(AlignmentSelectorTests, givenNoMatchingCandidateAlignmentsWhenSelectingAlignmentThenFail) {
28 AlignmentSelector selector{};
29 selector.addCandidateAlignment(128, false, AlignmentSelector::anyWastage);
30 selector.addCandidateAlignment(512, false, AlignmentSelector::anyWastage);
31
32 EXPECT_ANY_THROW(selector.selectAlignment(1));
33 EXPECT_ANY_THROW(selector.selectAlignment(127));
34 }
35
TEST(AlignmentSelectorTests,givenApplyForSmallerSizeDisabledAndAllocationIsTooSmallWhenSelectingAlignmentThenDoNotUseTheAlignment)36 TEST(AlignmentSelectorTests, givenApplyForSmallerSizeDisabledAndAllocationIsTooSmallWhenSelectingAlignmentThenDoNotUseTheAlignment) {
37 AlignmentSelector selector{};
38 selector.addCandidateAlignment(1, false, AlignmentSelector::anyWastage);
39 selector.addCandidateAlignment(128, false, AlignmentSelector::anyWastage);
40
41 EXPECT_EQ(1u, selector.selectAlignment(1).alignment);
42 EXPECT_EQ(1u, selector.selectAlignment(127).alignment);
43 }
44
TEST(AlignmentSelectorTests,givenApplyForSmallerSizeEnabledAndAllocationIsTooSmallWhenSelectingAlignmentThenUseTheAlignment)45 TEST(AlignmentSelectorTests, givenApplyForSmallerSizeEnabledAndAllocationIsTooSmallWhenSelectingAlignmentThenUseTheAlignment) {
46 AlignmentSelector selector{};
47 selector.addCandidateAlignment(1, true, AlignmentSelector::anyWastage);
48 selector.addCandidateAlignment(128, true, AlignmentSelector::anyWastage);
49
50 EXPECT_EQ(128u, selector.selectAlignment(1).alignment);
51 EXPECT_EQ(128u, selector.selectAlignment(127).alignment);
52 }
53
TEST(AlignmentSelectorTests,givenMultipleMatchingCandidateAlignmentsWhenSelectingAlignmentThenSelectTheBiggest)54 TEST(AlignmentSelectorTests, givenMultipleMatchingCandidateAlignmentsWhenSelectingAlignmentThenSelectTheBiggest) {
55 AlignmentSelector selector{};
56 selector.addCandidateAlignment(1024, false, AlignmentSelector::anyWastage);
57 selector.addCandidateAlignment(2048, false, AlignmentSelector::anyWastage);
58 selector.addCandidateAlignment(128, false, AlignmentSelector::anyWastage);
59 selector.addCandidateAlignment(512, false, AlignmentSelector::anyWastage);
60
61 EXPECT_EQ(2048u, selector.selectAlignment(90000).alignment);
62 EXPECT_EQ(2048u, selector.selectAlignment(2048).alignment);
63 EXPECT_EQ(1024u, selector.selectAlignment(2047).alignment);
64 }
65
TEST(AlignmentSelectorTests,givenMaxWastageThresholdWhenSelectingAlignmentThenRespectTheRestriction)66 TEST(AlignmentSelectorTests, givenMaxWastageThresholdWhenSelectingAlignmentThenRespectTheRestriction) {
67 AlignmentSelector selector{};
68 selector.addCandidateAlignment(1, false, AlignmentSelector::anyWastage);
69 selector.addCandidateAlignment(128, false, 0.25f);
70
71 EXPECT_EQ(128u, selector.selectAlignment(256).alignment); // waste = 0%
72 EXPECT_EQ(128u, selector.selectAlignment(193).alignment); // waste < 25%
73 EXPECT_EQ(128u, selector.selectAlignment(192).alignment); // waste = 25%
74 EXPECT_EQ(1u, selector.selectAlignment(191).alignment); // waste > 25%, do not allow
75 EXPECT_EQ(1u, selector.selectAlignment(129).alignment); // waste > 25%, do not allow
76 EXPECT_EQ(128u, selector.selectAlignment(128).alignment); // waste = 0%
77
78 EXPECT_EQ(128u, selector.selectAlignment(289).alignment); // waste < 20%
79 EXPECT_EQ(128u, selector.selectAlignment(288).alignment); // waste = 20%
80 EXPECT_EQ(1u, selector.selectAlignment(287).alignment); // waste > 20%, do not allow
81 }
82
TEST(AlignmentSelectorTests,givenCandidateArgumentHeapNotProvidedWhenSelectingAlignmentThenDefaultToUnknownHeap)83 TEST(AlignmentSelectorTests, givenCandidateArgumentHeapNotProvidedWhenSelectingAlignmentThenDefaultToUnknownHeap) {
84 AlignmentSelector selector{};
85 selector.addCandidateAlignment(1, false, AlignmentSelector::anyWastage);
86 EXPECT_EQ(HeapIndex::TOTAL_HEAPS, selector.selectAlignment(1).heap);
87 }
88
TEST(AlignmentSelectorTests,givenCandidateArgumentHeapProvidedWhenSelectingAlignmentThenReturnTheHeap)89 TEST(AlignmentSelectorTests, givenCandidateArgumentHeapProvidedWhenSelectingAlignmentThenReturnTheHeap) {
90 AlignmentSelector selector{};
91 selector.addCandidateAlignment(1, false, AlignmentSelector::anyWastage, HeapIndex::HEAP_INTERNAL);
92 selector.addCandidateAlignment(16, false, AlignmentSelector::anyWastage, HeapIndex::HEAP_EXTERNAL_DEVICE_MEMORY);
93 selector.addCandidateAlignment(32, false, AlignmentSelector::anyWastage, HeapIndex::HEAP_STANDARD2MB);
94
95 EXPECT_EQ(HeapIndex::HEAP_INTERNAL, selector.selectAlignment(1).heap);
96 EXPECT_EQ(HeapIndex::HEAP_EXTERNAL_DEVICE_MEMORY, selector.selectAlignment(16).heap);
97 EXPECT_EQ(HeapIndex::HEAP_STANDARD2MB, selector.selectAlignment(32).heap);
98 }
99
100 } // namespace NEO
101