21 #ifndef __TBB_cache_aligned_allocator_H 22 #define __TBB_cache_aligned_allocator_H 26 #if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC 30 #if __TBB_CPP17_MEMORY_RESOURCE_PRESENT 31 #include <memory_resource> 53 #if _MSC_VER && !defined(__INTEL_COMPILER) 55 #pragma warning (push) 56 #pragma warning (disable: 4100) 80 pointer
address(reference x)
const {
return &x;}
81 const_pointer
address(const_reference x)
const {
return &x;}
84 pointer
allocate( size_type n,
const void* hint=0 ) {
100 #if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC 101 template<
typename U,
typename... Args>
103 { ::new((
void *)p) U(std::forward<Args>(args)...); }
104 #else // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC 105 #if __TBB_CPP11_RVALUE_REF_PRESENT 106 void construct( pointer
p, value_type&&
value ) {::new((
void*)(p)) value_type(
std::move(
value));}
108 void construct( pointer p,
const value_type&
value ) {::new((
void*)(p)) value_type(value);}
109 #endif // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC 115 #if _MSC_VER && !defined(__INTEL_COMPILER) 116 #pragma warning (pop) 117 #endif // warning 4100 is back 127 template<
typename U>
struct rebind {
132 template<
typename T,
typename U>
135 template<
typename T,
typename U>
138 #if __TBB_CPP17_MEMORY_RESOURCE_PRESENT 141 class cache_aligned_resource :
public std::pmr::memory_resource {
143 cache_aligned_resource() : cache_aligned_resource(std::pmr::get_default_resource()) {}
144 explicit cache_aligned_resource(std::pmr::memory_resource* upstream) : m_upstream(upstream) {}
146 std::pmr::memory_resource* upstream_resource()
const {
152 void* do_allocate(
size_t bytes,
size_t alignment)
override {
153 size_t cache_line_alignment = correct_alignment(alignment);
154 uintptr_t base = (uintptr_t)m_upstream->allocate(correct_size(bytes) + cache_line_alignment);
155 __TBB_ASSERT(base != 0,
"Upstream resource returned NULL.");
156 #if _MSC_VER && !defined(__INTEL_COMPILER) 158 #pragma warning(push) 159 #pragma warning(disable: 4146 4706) 162 uintptr_t result = (base + cache_line_alignment) & -cache_line_alignment;
163 #if _MSC_VER && !defined(__INTEL_COMPILER) 167 ((uintptr_t*)result)[-1] = base;
168 return (
void*)result;
171 void do_deallocate(
void* ptr,
size_t bytes,
size_t alignment)
override {
174 uintptr_t base = ((uintptr_t*)ptr)[-1];
175 m_upstream->deallocate((
void*)base, correct_size(bytes) + correct_alignment(alignment));
179 bool do_is_equal(
const std::pmr::memory_resource& other)
const noexcept
override {
180 if (
this == &other) {
return true; }
181 #if __TBB_USE_OPTIONAL_RTTI 182 const cache_aligned_resource* other_res =
dynamic_cast<const cache_aligned_resource*
>(&other);
183 return other_res && (this->upstream_resource() == other_res->upstream_resource());
189 size_t correct_alignment(
size_t alignment) {
191 #if __TBB_CPP17_HW_INTERFERENCE_SIZE_PRESENT 199 size_t correct_size(
size_t bytes) {
202 return bytes <
sizeof(uintptr_t) ?
sizeof(uintptr_t) : bytes;
205 std::pmr::memory_resource* m_upstream;
void *__TBB_EXPORTED_FUNC NFS_Allocate(size_t n_element, size_t element_size, void *hint)
Allocate memory on cache/sector line boundary.
size_t __TBB_EXPORTED_FUNC NFS_GetLineSize()
Cache/sector line size.
bool operator==(const vector_iterator< Container, T > &i, const vector_iterator< Container, U > &j)
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
ptrdiff_t difference_type
const value_type & const_reference
Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
const_pointer address(const_reference x) const
bool is_power_of_two(integer_type arg)
A function to check if passed integer is a power of 2.
cache_aligned_allocator< U > other
bool operator!=(const vector_iterator< Container, T > &i, const vector_iterator< Container, U > &j)
static const size_t cache_line_size
const void * const_pointer
void const char const char int ITT_FORMAT __itt_group_sync p
cache_aligned_allocator(const cache_aligned_allocator< U > &)
void deallocate(pointer p, size_type)
Free block of memory that starts on a cache line.
cache_aligned_allocator()
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
cache_aligned_allocator(const cache_aligned_allocator &)
#define __TBB_EXPORTED_FUNC
void move(tbb_thread &t1, tbb_thread &t2)
internal::allocator_type< T >::value_type value_type
const size_t NFS_MaxLineSize
Compile-time constant that is upper bound on cache line/sector size.
void __TBB_EXPORTED_FUNC NFS_Free(void *)
Free memory allocated by NFS_Allocate.
pointer address(reference x) const
const value_type * const_pointer
size_type max_size() const
Largest value for which method allocate might succeed.
void destroy(pointer p)
Destroy value at location pointed to by p.
pointer allocate(size_type n, const void *hint=0)
Allocate space for n objects, starting on a cache/sector line.
void construct(U *p, Args &&... args)
Copy-construct value at location pointed to by p.
cache_aligned_allocator< U > other