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