20namespace alpaka::onAcc::cpu::detail
25 template<std::
size_t TMinDataAlignBytes>
28 struct alignas(TMinDataAlignBytes) MetaData
34 std::uint32_t offset = 0u;
37 static constexpr std::uint32_t metaDataSize =
sizeof(MetaData);
40 SharedStorage() =
default;
43 void alloc(
size_t id)
const
46 m_allocdBytes = varChunkEnd<MetaData>(m_allocdBytes,
sizeof(MetaData));
48 auto*
meta = getLatestVarPtr<MetaData>();
51 m_allocdBytes = varChunkEnd<T>(m_allocdBytes,
sizeof(T));
56 meta->offset = m_allocdBytes;
60 void allocDynamic(
size_t id, uint32_t numBytes)
const
63 m_allocdBytes = varChunkEnd<MetaData>(m_allocdBytes,
sizeof(MetaData));
65 auto*
meta = getLatestVarPtr<MetaData>();
68 m_allocdBytes = varChunkEnd<T>(m_allocdBytes, numBytes);
73 meta->offset = m_allocdBytes;
82 auto getVarPtr(
size_t id)
const -> T*
85 std::uint32_t off = 0;
88 while(off < m_allocdBytes)
91 std::uint32_t
const alignedMetaDataOffset
92 = varChunkEnd<MetaData>(off,
sizeof(MetaData)) -
static_cast<std::uint32_t
>(
sizeof(MetaData));
94 (alignedMetaDataOffset +
static_cast<std::uint32_t
>(
sizeof(MetaData))) <= m_allocdBytes);
95 auto* metaDataPtr =
reinterpret_cast<MetaData*
>(data() + alignedMetaDataOffset);
96 off = metaDataPtr->offset;
98 if(metaDataPtr->id ==
id)
99 return reinterpret_cast<T*
>(&data()[off -
sizeof(T)]);
108 auto getLatestVarPtr()
const -> T*
110 return reinterpret_cast<T*
>(&data()[m_allocdBytes -
sizeof(T)]);
114 uint8_t* data()
const
116 return m_data.data();
130 auto varChunkEnd(uint32_t byteOffset, uint32_t numBytes)
const -> std::uint32_t
132 auto const ptr =
reinterpret_cast<std::size_t
>(data() + byteOffset);
133 constexpr size_t align = std::max(TMinDataAlignBytes,
alignof(T));
134 std::size_t
const newPtrAdress = ((ptr + align - 1u) / align) * align + numBytes;
135 return static_cast<uint32_t
>(newPtrAdress -
reinterpret_cast<std::size_t
>(data()));
138 static constexpr std::uint32_t totalSharedBytes
143 mutable std::array<uint8_t, totalSharedBytes> m_data;
147 mutable std::uint32_t m_allocdBytes = 0u;