1 | /* Copyright 2019 Google LLC. All Rights Reserved. |
2 | |
3 | Licensed under the Apache License, Version 2.0 (the "License"); |
4 | you may not use this file except in compliance with the License. |
5 | You may obtain a copy of the License at |
6 | |
7 | http://www.apache.org/licenses/LICENSE-2.0 |
8 | |
9 | Unless required by applicable law or agreed to in writing, software |
10 | distributed under the License is distributed on an "AS IS" BASIS, |
11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | See the License for the specific language governing permissions and |
13 | limitations 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 | |
21 | namespace ruy { |
22 | |
23 | namespace 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. |
42 | constexpr std::ptrdiff_t kMinimumBlockAlignment = 64; |
43 | |
44 | // Primitive allocation functions obtaining aligned memory from the |
45 | // operating system. |
46 | void* SystemAlignedAlloc(std::ptrdiff_t num_bytes); |
47 | void SystemAlignedFree(void* ptr); |
48 | |
49 | } // namespace detail |
50 | |
51 | } // namespace ruy |
52 | |
53 | #endif // RUY_RUY_SYSTEM_ALIGNED_ALLOC_H_ |
54 | |