15# include <sycl/sycl.hpp>
34 std::byte* ptr =
nullptr;
36 size_t id = std::numeric_limits<size_t>::max();
39 static constexpr uint32_t metaDataSize =
sizeof(MetaData);
43 PtrLookupTable(std::byte* mem, uint32_t capacity)
44 : m_mem(reinterpret_cast<MetaData*>(mem))
45 , m_capacity(capacity / metaDataSize)
50 PtrLookupTable(std::byte* mem, uint32_t) : m_mem(reinterpret_cast<MetaData*>(mem))
60 static consteval uint32_t sizeLookupBufferInBytes(uint32_t maxNumUniqueAllocations)
62 return metaDataSize * maxNumUniqueAllocations;
70 template<
typename T,
size_t T_
id>
71 struct alignas(T) SharedMemData
73 std::byte
data[
sizeof(T)];
76 template<
typename T,
size_t T_
id>
79 auto group = sycl::ext::oneapi::this_work_item::get_work_group<1>();
80 SharedMemData<T, T_id>*
data
81 = sycl::ext::oneapi::group_local_memory_for_overwrite<SharedMemData<T, T_id>>(group);
83 MetaData& metaDataEntry = m_mem[m_numEntries];
88 if(group.get_local_linear_id() == 0u)
91 metaDataEntry.ptr =
reinterpret_cast<std::byte*
>(
data);
93 metaDataEntry.id = T_id;
95 return reinterpret_cast<T*
>(
data);
104 auto getVarPtr(
size_t id)
const -> T*
107 for(uint32_t off = 0u; off < m_numEntries; ++off)
109 MetaData& metaDataEntry = m_mem[off];
111 if(metaDataEntry.id ==
id)
112 return reinterpret_cast<T*
>(metaDataEntry.ptr);
121 mutable uint32_t m_numEntries = 0u;
126 MetaData*
const m_mem;
129 uint32_t
const m_capacity;
134 class StaticSharedMemory :
private detail::PtrLookupTable
142 static consteval uint32_t sizeLookupBufferInBytes(uint32_t maxNumUniqueAllocations)
144 return detail::PtrLookupTable::sizeLookupBufferInBytes(maxNumUniqueAllocations);
147 StaticSharedMemory(StaticSharedMemory
const&) =
delete;
154 StaticSharedMemory(sycl::local_accessor<std::byte>
const& accessor)
156 reinterpret_cast<std::byte*>(accessor.get_multi_ptr<sycl::access::decorated::no>().
get()),
157 static_cast<uint32_t>(accessor.size()))
162 using Base = detail::PtrLookupTable;
164 template<
typename T,
size_t T_unique>
167 T*
data = Base::template getVarPtr<T>(T_unique);
171 data = Base::template alloc<T, T_unique>();
#define ALPAKA_ASSERT_ACC(...)
ALPAKA_ASSERT_ACC is an assert-like macro.
#define ALPAKA_ASSERT(...)
The assert can be explicit disabled by defining NDEBUG.
functionality which is usable on the accelerator compute device from within a kernel.
decltype(auto) data(auto &&any)
pointer to data of an object
auto alloc(concepts::Device auto const &device, alpaka::concepts::VectorOrScalar auto const &extents)
Allocate memory on the given device.
constexpr decltype(auto) get(concepts::SpecializationOf< Dict > auto &t) noexcept