tesseract++ 0.0.1
N-dimensional tensor library for embedded systems
Loading...
Searching...
No Matches
simd_padding_policy.h
Go to the documentation of this file.
1#pragma once
2
3#include "config.h" // for my_size_t, BITS, DefaultArch
4#include "fused/microkernels/microkernel_base.h" // for Microkernel, DATA_ALIGNAS
5#include "containers/array.h" // for Array
6
184template <typename T, my_size_t SIMDWidth, my_size_t... Dims>
186{
187 // ========================================================================
188 // COMPILE-TIME VALIDATION
189 // ========================================================================
190
191 static_assert(sizeof...(Dims) > 0, "SimdPaddingPolicy: At least one dimension is required");
192
193 // ========================================================================
194 // SIMD CONFIGURATION FROM MICROKERNEL
195 // ========================================================================
196
207 static constexpr my_size_t SimdWidth = SIMDWidth;
208
209 static_assert(SimdWidth >= 1, "SimdPaddingPolicy: SimdWidth must be at least 1");
210
211 // ========================================================================
212 // COMPILE-TIME DIMENSION ANALYSIS
213 // ========================================================================
214
216 static constexpr my_size_t NumDims = sizeof...(Dims);
217
225 {
226 return Array<my_size_t, NumDims>{Dims...};
227 }
228
230
231 // ========================================================================
232 // PADDING COMPUTATION
233 // ========================================================================
234
258 static constexpr my_size_t pad(my_size_t n)
259 {
260 return ((n + SimdWidth - 1) / SimdWidth) * SimdWidth;
261 }
262
268 static constexpr my_size_t LastDim = LogicalDims[NumDims - 1];
269
277 static constexpr my_size_t PaddedLastDim = pad(LastDim);
278
284 static constexpr my_size_t LogicalSize = (Dims * ...);
285
307 {
308 my_size_t size = 1;
309 for (my_size_t i = 0; i < NumDims - 1; ++i)
310 size *= LogicalDims[i];
311 return size * PaddedLastDim;
312 }
313
316
317 // ========================================================================
318 // PHYSICAL DIMENSIONS (for StridedLayout)
319 // ========================================================================
320
335 {
337 for (my_size_t i = 0; i < NumDims - 1; ++i)
338 result[i] = LogicalDims[i];
339 result[NumDims - 1] = PaddedLastDim;
340 return result;
341 }
342
345};
346
347// Production alias - gets SimdWidth from Microkernel
348template <typename T, my_size_t... Dims>
Global configuration for the tesseract tensor library.
#define my_size_t
Size/index type used throughout the library.
Definition config.h:126
Fixed-size array container for embedded systems.
Definition array.h:21
Padding policy that pads the last dimension for SIMD alignment.
Definition simd_padding_policy.h:186
static constexpr my_size_t computePhysicalSize()
Definition simd_padding_policy.h:306
static constexpr my_size_t PhysicalSize
Definition simd_padding_policy.h:315
static constexpr my_size_t NumDims
Definition simd_padding_policy.h:216
static constexpr Array< my_size_t, NumDims > computeLogicalDims()
Definition simd_padding_policy.h:224
static constexpr Array< my_size_t, NumDims > LogicalDims
Definition simd_padding_policy.h:229
static constexpr Array< my_size_t, NumDims > PhysicalDims
Definition simd_padding_policy.h:344
static constexpr my_size_t SimdWidth
Definition simd_padding_policy.h:207
static constexpr my_size_t LogicalSize
Definition simd_padding_policy.h:284
static constexpr my_size_t LastDim
Definition simd_padding_policy.h:268
static constexpr my_size_t pad(my_size_t n)
Definition simd_padding_policy.h:258
static constexpr Array< my_size_t, NumDims > computePhysicalDims()
Definition simd_padding_policy.h:334
static constexpr my_size_t PaddedLastDim
Definition simd_padding_policy.h:277