41 class KarrasRadixTreeField;
53 class KarrasRadixTreeFieldMultiVar;
92 sham::DeviceScheduler_ptr dev_sched,
u32 nvar) {
100 KarrasRadixTreeField<T> new_empty_karras_radix_tree_field() {
101 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
106 KarrasRadixTreeFieldMultiVar<T> new_empty_karras_radix_tree_field_multi_var(
u32 nvar) {
107 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
108 return KarrasRadixTreeFieldMultiVar<T>::make_empty(dev_sched, nvar);
112 KarrasRadixTreeField<T> prepare_karras_radix_tree_field(
113 const KarrasRadixTree &tree, KarrasRadixTreeField<T> &&recycled_tree_field) {
115 KarrasRadixTreeField<T> ret = std::forward<KarrasRadixTreeField<T>>(recycled_tree_field);
117 ret.buf_field.resize(tree.get_total_cell_count());
123 KarrasRadixTreeFieldMultiVar<T> prepare_karras_radix_tree_field_multi_var(
124 const KarrasRadixTree &tree, KarrasRadixTreeFieldMultiVar<T> &&recycled_tree_field) {
126 KarrasRadixTreeFieldMultiVar<T> ret = std::move(recycled_tree_field);
128 ret.buf_field.resize(tree.get_total_cell_count() * ret.nvar);
133 template<
class T,
class Fct>
134 void propagate_field_up(
135 KarrasRadixTreeField<T> &tree_field,
const KarrasRadixTree &tree, Fct fct_combine) {
139 u32 int_cell_count = tree.get_internal_cell_count();
141 if (int_cell_count == 0) {
146 auto traverser = tree.get_structure_traverser();
153 [=](
u32 gid,
auto tree_traverser, T *__restrict tree_field) {
154 u32 left_child = tree_traverser.get_left_child(gid);
155 u32 right_child = tree_traverser.get_right_child(gid);
157 T fieldl = tree_field[left_child];
158 T fieldr = tree_field[right_child];
160 T field_val = fct_combine(fieldl, fieldr);
162 tree_field[gid] = field_val;
166 for (
u32 i = 0; i < tree.tree_depth; i++) {
171 template<
class T,
class Fct>
172 KarrasRadixTreeField<T> compute_tree_field(
173 const KarrasRadixTree &tree,
174 KarrasRadixTreeField<T> &&recycled_tree_field,
175 const std::function<
void(KarrasRadixTreeField<T> &,
u32)> &fct_fill_leaf,
178 auto tree_field = prepare_karras_radix_tree_field(
179 tree, std::forward<KarrasRadixTreeField<T>>(recycled_tree_field));
181 fct_fill_leaf(tree_field, tree.get_internal_cell_count());
183 propagate_field_up(tree_field, tree, std::forward<Fct>(fct_combine));
189 KarrasRadixTreeField<T> compute_tree_field_max_field(
190 const KarrasRadixTree &tree,
191 const LeafCellIterator &cell_it,
192 KarrasRadixTreeField<T> &&recycled_tree_field,
197 auto fill_leafs = [&](KarrasRadixTreeField<T> &tree_field,
u32 leaf_offset) {
202 tree.get_leaf_count(),
203 [leaf_offset](
u32 i,
const T *field,
auto cell_iter, T *comp_field) {
207 cell_iter.for_each_in_leaf_cell(i, [&](
u32 obj_id) {
208 field_val = sham::max(field_val, field[obj_id]);
211 comp_field[leaf_offset + i] = field_val;
215 return compute_tree_field<T>(
217 std::forward<KarrasRadixTreeField<T>>(recycled_tree_field),
220 return sham::max(a, b);
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory)
A SYCL queue associated with a device and a context.
DeviceQueue & get_queue(u32 id=0)
Get a reference to a DeviceQueue.
A data structure representing a field with multiple variables per cell for a Karras Radix Tree.
sham::DeviceBuffer< T > buf_field
field data (size = total_cell_count * nvar)
u32 nvar
number of variables per cells
KarrasRadixTreeFieldMultiVar(sham::DeviceBuffer< T > &&buf_field, u32 nvar)
CTOR.
u32 get_total_cell_count()
Get total cell count.
A data structure representing a Karras Radix Tree Field.
u32 get_total_cell_count()
Get internal cell count.
KarrasRadixTreeField(sham::DeviceBuffer< T > &&buf_field)
CTOR.
sham::DeviceBuffer< T > buf_field
left child id (size = internal_count)
void kernel_call(sham::DeviceQueue &q, RefIn in, RefOut in_out, u32 n, Functor &&func, SourceLocation &&callsite=SourceLocation{})
Submit a kernel to a SYCL queue.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
A class that references multiple buffers or similar objects.