Snitch Runtime
Loading...
Searching...
No Matches
alloc_v2.h
Go to the documentation of this file.
1// Copyright 2023 ETH Zurich and University of Bologna.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
15//================================================================================
16// L1 allocation
17//================================================================================
18
19extern __thread snrt_allocator_t l1_allocator_v2;
20
26inline snrt_allocator_t *snrt_l1_allocator_v2() { return &l1_allocator_v2; }
27
33inline void *snrt_l1_next_v2() { return (void *)snrt_l1_allocator_v2()->next; }
34
41 return snrt_align_up_hyperbank(snrt_l1_next_v2());
42}
43
49inline void snrt_l1_update_next_v2(void *next) {
50 snrt_l1_allocator_v2()->next = (uint32_t)next;
51}
52
57static inline void snrt_l1_alloc_check_bounds() {
58 if (snrt_l1_allocator_v2()->next > snrt_l1_allocator_v2()->end)
59 asm volatile("ecall \n");
60}
61
74inline void *snrt_l1_alloc_cluster_local(size_t size,
75 const size_t alignment = 1) {
76 snrt_l1_allocator_v2()->next =
77 snrt_align_up(snrt_l1_allocator_v2()->next, alignment);
78 void *retval = snrt_l1_next_v2();
79 snrt_l1_allocator_v2()->next += size;
81 return retval;
82}
83
84template <typename T>
85inline T *snrt_l1_alloc_cluster_local(size_t count = 1,
86 const size_t alignment = alignof(T)) {
87 snrt_l1_allocator_v2()->next =
88 snrt_align_up(snrt_l1_allocator_v2()->next, alignment);
89 T *retval = (T *)snrt_l1_next_v2();
90 snrt_l1_allocator_v2()->next += count * sizeof(T);
92 return retval;
93}
94
108inline void *snrt_l1_alloc_compute_core_local(size_t size,
109 const size_t alignment = 1) {
110 snrt_l1_allocator_v2()->next =
111 snrt_align_up(snrt_l1_allocator_v2()->next, alignment);
112 void *retval =
113 ((uint8_t *)snrt_l1_next_v2()) + size * snrt_cluster_core_idx();
114 snrt_l1_allocator_v2()->next += size * snrt_cluster_compute_core_num();
116 return retval;
117}
118
128inline void snrt_l1_init() {
129 // Calculate end address of the heap. The top of the TCDM address space is
130 // reserved for the cluster-local storage (CLS) and the stack of every
131 // core. We further provision a safety margin of 128B. The rest of the
132 // TCDM is reserved for the heap.
133 uint32_t heap_end_addr = snrt_cls_base_addr();
134 heap_end_addr -= (1 << SNRT_LOG2_STACK_SIZE) * snrt_cluster_core_num();
135 heap_end_addr -= 128;
136 // Initialize L1 allocator
137 uintptr_t l1_start_addr = (uintptr_t)(snrt_cluster()->tcdm.mem);
138 snrt_l1_allocator_v2()->base = snrt_align_up(l1_start_addr, MIN_CHUNK_SIZE);
139 snrt_l1_allocator_v2()->end = heap_end_addr;
141}
142
143//================================================================================
144// L3 allocation
145//================================================================================
146
147extern __thread snrt_allocator_t l3_allocator_v2;
148
154inline snrt_allocator_t *snrt_l3_allocator_v2() { return &l3_allocator_v2; }
155
161inline void *snrt_l3_next_v2() { return (void *)snrt_l3_allocator_v2()->next; }
162
167static inline void snrt_l3_alloc_check_bounds() {
168 if (snrt_l3_allocator_v2()->next >= snrt_l3_allocator_v2()->end)
169 asm volatile("ecall \n");
170}
171
184inline void *snrt_l3_alloc_v2(size_t size, const size_t alignment = 1) {
185 snrt_l3_allocator_v2()->next =
186 snrt_align_up(snrt_l3_allocator_v2()->next, alignment);
187 void *retval = snrt_l3_next_v2();
188 snrt_l3_allocator_v2()->next += size;
190 return retval;
191}
192
202inline void snrt_l3_init() {
203 extern uint32_t _edram;
204 snrt_l3_allocator_v2()->base =
205 snrt_align_up((uint32_t)&_edram, MIN_CHUNK_SIZE);
206 snrt_l3_allocator_v2()->end = SNRT_L3_END_ADDR;
208}
209
210//================================================================================
211// Pointer translation functions
212//================================================================================
213
227inline void *snrt_compute_core_local_ptr(void *ptr, uint32_t core_idx,
228 size_t size) {
229 size_t offset = (core_idx - snrt_cluster_core_idx()) * size;
230 return (void *)((uintptr_t)ptr + offset);
231}
232
245inline void *snrt_remote_l1_ptr(void *ptr, uint32_t src_cluster_idx,
246 uint32_t dst_cluster_idx) {
247 return (void *)((uintptr_t)ptr +
248 (dst_cluster_idx - src_cluster_idx) * SNRT_CLUSTER_OFFSET);
249}
void snrt_l3_init()
Initialize the L3 allocator.
Definition alloc_v2.h:202
void * snrt_l3_alloc_v2(size_t size, const size_t alignment=1)
Allocate space for a variable in L3 memory.
Definition alloc_v2.h:184
void * snrt_l1_next_aligned_hyperbank()
Get the next pointer of the L1 allocator, aligned to the hyperbank.
Definition alloc_v2.h:40
void snrt_l1_update_next_v2(void *next)
Override the L1 allocator next pointer.
Definition alloc_v2.h:49
static void snrt_l1_alloc_check_bounds()
Check if the allocation exceeds the allocator bounds and raise an exception if it does.
Definition alloc_v2.h:57
void snrt_l1_init()
Initialize the L1 allocator.
Definition alloc_v2.h:128
void * snrt_l1_next_v2()
Get the next pointer of the L1 allocator.
Definition alloc_v2.h:33
void * snrt_l1_alloc_compute_core_local(size_t size, const size_t alignment=1)
Allocate space for N variables in the cluster's L1 memory.
Definition alloc_v2.h:108
void * snrt_l3_next_v2()
Get the next pointer of the L3 allocator.
Definition alloc_v2.h:161
static void snrt_l3_alloc_check_bounds()
Check if the allocation exceeds the allocator bounds and raise an exception if it does.
Definition alloc_v2.h:167
snrt_allocator_t * snrt_l3_allocator_v2()
Get a pointer to the L3 allocator.
Definition alloc_v2.h:154
void * snrt_remote_l1_ptr(void *ptr, uint32_t src_cluster_idx, uint32_t dst_cluster_idx)
Get a pointer to the same offset in another cluster's L1 memory.
Definition alloc_v2.h:245
void * snrt_l1_alloc_cluster_local(size_t size, const size_t alignment=1)
Allocate space for a variable in the cluster's L1 memory.
Definition alloc_v2.h:74
void * snrt_compute_core_local_ptr(void *ptr, uint32_t core_idx, size_t size)
Get a pointer to the same variable allocated by another core.
Definition alloc_v2.h:227
snrt_allocator_t * snrt_l1_allocator_v2()
Get a pointer to the L1 allocator.
Definition alloc_v2.h:26
Definition alloc_decls.h:10