1/* Copyright 2019 Google LLC. All Rights Reserved.
2
3Licensed under the Apache License, Version 2.0 (the "License");
4you may not use this file except in compliance with the License.
5You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9Unless required by applicable law or agreed to in writing, software
10distributed under the License is distributed on an "AS IS" BASIS,
11WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12See the License for the specific language governing permissions and
13limitations under the License.
14==============================================================================*/
15
16#ifndef RUY_RUY_SYSTEM_ALIGNED_ALLOC_H_
17#define RUY_RUY_SYSTEM_ALIGNED_ALLOC_H_
18
19#include <cstddef>
20
21namespace ruy {
22
23namespace detail {
24
25// Minimum alignment for blocks.
26//
27// Considerations:
28// - This needs to be at least the alignment of any usual data type.
29// - It's useful that this is at least the size of a cache line to limit
30// possible cache side effects (if only on performance behavior).
31// - It's useful that this is at least the size of SIMD registers, as
32// some SIMD instruction sets have at least performance behavior
33// differences (e.g. NEON) or even different requirements (e.g. SSE)
34// based on that.
35// - It's useful that this is at least the size of an "exclusive reservation
36// granule" on ARM, meaning that if we use this Allocator to allocate
37// an atomic variable, there will be no side effects from other things
38// contending for exclusive/atomic memory accesses to it. While the
39// ARM reference manual mentions that this granule size may be as large
40// as 2048 bytes, in practice we observe it to be 64 bytes. It can
41// be queried cheaply, at runtime, from userspace, if needed.
42constexpr std::ptrdiff_t kMinimumBlockAlignment = 64;
43
44// Primitive allocation functions obtaining aligned memory from the
45// operating system.
46void* SystemAlignedAlloc(std::ptrdiff_t num_bytes);
47void SystemAlignedFree(void* ptr);
48
49} // namespace detail
50
51} // namespace ruy
52
53#endif // RUY_RUY_SYSTEM_ALIGNED_ALLOC_H_
54