aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik G Olsson <henrik.olsson@arm.com>2021-03-08 18:20:00 +0100
committerHenrik G Olsson <henrik.olsson@arm.com>2021-03-09 11:38:33 +0100
commit807278a7d3cc305e232c05b7c098a13485f70203 (patch)
tree566f3d074f58c6e87d4ba185f7616e635ad53330
parent41c006a3c5cc511f9437cfadbb7889668ea55016 (diff)
downloadethos-u-vela-807278a7d3cc305e232c05b7c098a13485f70203.tar.gz
MLBEDSW-4209 Use live range alignment when allocating
Change-Id: I05216cebe785a3669032a3f021a9b496c44c4d66 Signed-off-by: Henrik G Olsson <henrik.olsson@arm.com>
-rw-r--r--ethosu/vela/greedy_allocation.py9
-rw-r--r--ethosu/vela/hillclimb_allocation.py9
2 files changed, 12 insertions, 6 deletions
diff --git a/ethosu/vela/greedy_allocation.py b/ethosu/vela/greedy_allocation.py
index b0395def..51b07805 100644
--- a/ethosu/vela/greedy_allocation.py
+++ b/ethosu/vela/greedy_allocation.py
@@ -41,9 +41,12 @@ class GreedyAllocator:
current_offset = 0
for start_addr, lr in self.current_allocs:
aligned_current_offset = numeric_util.round_up(current_offset, new_lr.get_alignment())
- if aligned_current_offset + aligned_size <= start_addr and start_addr - current_offset < best_offset_fit:
- best_offset = current_offset
- best_offset_fit = start_addr - current_offset
+ if (
+ aligned_current_offset + aligned_size <= start_addr
+ and start_addr - aligned_current_offset < best_offset_fit
+ ):
+ best_offset = aligned_current_offset
+ best_offset_fit = start_addr - aligned_current_offset
current_offset = start_addr + lr.size
diff --git a/ethosu/vela/hillclimb_allocation.py b/ethosu/vela/hillclimb_allocation.py
index de53ab83..5e02dac0 100644
--- a/ethosu/vela/hillclimb_allocation.py
+++ b/ethosu/vela/hillclimb_allocation.py
@@ -20,11 +20,12 @@ import random
from typing import List
from typing import Set
+from . import numeric_util
from .live_range import LiveRange
class LiveRangeInfo:
- def __init__(self, id: int, start_time: int, end_time: int, size: int):
+ def __init__(self, id: int, start_time: int, end_time: int, size: int, min_alignment: int):
# Index of this live range
self.id = id
# Start time (input to the allocator algorithm)
@@ -44,6 +45,7 @@ class LiveRangeInfo:
# Max value of size_at_time (only used in the heuristic allocation)
self.urgency = 0
self.neighbours: List["LiveRangeInfo"] = []
+ self.min_alignment = min_alignment
def overlaps(self, addr2: int, size2: int) -> int:
return self.address < addr2 + size2 and addr2 < self.end_address
@@ -96,7 +98,8 @@ class HillClimbAllocator:
def __init__(self, live_ranges: List[LiveRange]):
# Contains the live ranges
self.lrs: List[LiveRangeInfo] = [
- LiveRangeInfo(id, lr.start_time, lr.end_time, lr.size) for id, lr in enumerate(live_ranges)
+ LiveRangeInfo(id, lr.start_time, lr.end_time, lr.size, lr.get_alignment())
+ for id, lr in enumerate(live_ranges)
]
self.lrs_at_time = []
# The available size (input to algorithm).
@@ -145,7 +148,7 @@ class HillClimbAllocator:
if lr2.overlaps(address, lr.size):
# Overlap found increase address
fits = False
- address = lr2.end_address
+ address = numeric_util.round_up(lr2.end_address, lr.min_alignment)
predecessor = lr2.id
lr.address = address
lr.end_address = address + lr.size