92 sham::DeviceScheduler_ptr dev_sched,
u32 nvar) {
101 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
107 auto dev_sched = shamsys::instance::get_compute_scheduler_ptr();
108 return KarrasRadixTreeFieldMultiVar<T>::make_empty(dev_sched, nvar);
117 ret.
buf_field.resize(tree.get_total_cell_count());
128 ret.buf_field.resize(tree.get_total_cell_count() * ret.nvar);
133 template<
class T,
class Fct>
134 void propagate_field_up(
137 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().
get_queue();
139 u32 int_cell_count = tree.get_internal_cell_count();
141 if (int_cell_count == 0) {
146 auto traverser = tree.get_structure_traverser();
150 sham::MultiRef{traverser},
151 sham::MultiRef{tree_field.buf_field},
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>
178 auto tree_field = prepare_karras_radix_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));
193 sham::DeviceBuffer<T> &field) {
195 sham::DeviceQueue &q = shamsys::instance::get_compute_scheduler().
get_queue();
200 sham::MultiRef{field, cell_it},
201 sham::MultiRef{tree_field.buf_field},
202 tree.get_leaf_count(),
203 [leaf_offset](
u32 i,
const T *field,
auto cell_iter, T *comp_field) {
205 T field_val = shambase::VectorProperties<T>::get_min();
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>(
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).
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)
A data structure representing a Karras Radix Tree.
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.