27 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> particle_index_map;
28 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> cell_index_map;
29 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> rchild_id;
30 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> lchild_id;
31 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> rchild_flag;
32 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> lchild_flag;
33 sycl::accessor<vec, 1, sycl::access::mode::read, sycl::target::device> pos_min_cell;
34 sycl::accessor<vec, 1, sycl::access::mode::read, sycl::target::device> pos_max_cell;
37 static constexpr u32 _nindex = 4294967295;
44 particle_index_map{
shambase::get_check_ref(rtree.tree_morton_codes.buf_particle_index_map), cgh,sycl::read_only},
45 cell_index_map{
shambase::get_check_ref(rtree.tree_reduced_morton_codes.buf_reduc_index_map), cgh,sycl::read_only},
52 leaf_offset (rtree.tree_struct.internal_cell_count)
56 template<
class Functor_iter>
57 inline void iter_object_in_cell(
const u32 &cell_id, Functor_iter &&func_it)
const {
59 uint min_ids = cell_index_map[cell_id - leaf_offset];
60 uint max_ids = cell_index_map[cell_id + 1 - leaf_offset];
62 for (
unsigned int id_s = min_ids; id_s < max_ids; id_s++) {
65 uint id_b = particle_index_map[id_s];
72 template<
class Functor_
int_cd,
class Functor_iter,
class Functor_iter_excl>
73 inline void rtree_for(
74 Functor_int_cd &&func_int_cd,
75 Functor_iter &&func_it,
76 Functor_iter_excl &&func_excl)
const {
77 u32 stack_cursor = tree_depth - 1;
78 std::array<u32, tree_depth> id_stack;
79 id_stack[stack_cursor] = 0;
81 while (stack_cursor < tree_depth) {
83 u32 current_node_id = id_stack[stack_cursor];
84 id_stack[stack_cursor] = _nindex;
87 bool cur_id_valid = func_int_cd(
88 current_node_id, pos_min_cell[current_node_id], pos_max_cell[current_node_id]);
93 if (current_node_id >= leaf_offset) {
95 iter_object_in_cell(current_node_id, func_it);
100 u32 lid = lchild_id[current_node_id]
101 + leaf_offset * lchild_flag[current_node_id];
102 u32 rid = rchild_id[current_node_id]
103 + leaf_offset * rchild_flag[current_node_id];
105 id_stack[stack_cursor - 1] = rid;
108 id_stack[stack_cursor - 1] = lid;
113 func_excl(current_node_id);
118 template<
class Functor_
int_cd,
class Functor_iter>
119 inline void rtree_for(Functor_int_cd &&func_int_cd, Functor_iter &&func_it)
const {
121 std::forward<Functor_int_cd>(func_int_cd),
122 std::forward<Functor_iter>(func_it),
130 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> rchild_id;
131 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> lchild_id;
132 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> rchild_flag;
133 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> lchild_flag;
136 sycl::accessor<vec, 1, sycl::access::mode::read, sycl::target::device> pos_min_cell;
137 sycl::accessor<vec, 1, sycl::access::mode::read, sycl::target::device> pos_max_cell;
141 static constexpr u32 _nindex = 4294967295;
154 leaf_offset (rtree.tree_struct.internal_cell_count)
158 template<
class Functor_
int_cd,
class Functor_iter,
class Functor_iter_excl>
159 inline void rtree_for(
160 Functor_int_cd &&func_int_cd,
161 Functor_iter &&func_it,
162 Functor_iter_excl &&func_excl)
const {
163 u32 stack_cursor = tree_depth - 1;
164 std::array<u32, tree_depth> id_stack;
165 id_stack[stack_cursor] = 0;
167 while (stack_cursor < tree_depth) {
169 u32 current_node_id = id_stack[stack_cursor];
170 id_stack[stack_cursor] = _nindex;
173 bool cur_id_valid = func_int_cd(
174 current_node_id, pos_min_cell[current_node_id], pos_max_cell[current_node_id]);
179 if (current_node_id >= leaf_offset) {
181 func_it(current_node_id);
186 u32 lid = lchild_id[current_node_id]
187 + leaf_offset * lchild_flag[current_node_id];
188 u32 rid = rchild_id[current_node_id]
189 + leaf_offset * rchild_flag[current_node_id];
191 id_stack[stack_cursor - 1] = rid;
194 id_stack[stack_cursor - 1] = lid;
199 func_excl(current_node_id);
204 template<
class Functor_
int_cd,
class Functor_iter>
205 inline void rtree_for(Functor_int_cd &&func_int_cd, Functor_iter &&func_it)
const {
207 std::forward<Functor_int_cd>(func_int_cd),
208 std::forward<Functor_iter>(func_it),
216 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> rchild_id;
217 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> lchild_id;
218 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> rchild_flag;
219 sycl::accessor<u8, 1, sycl::access::mode::read, sycl::target::device> lchild_flag;
221 sycl::accessor<u_morton, 1, sycl::access::mode::read, sycl::target::device> tree_morton;
225 static constexpr u32 _nindex = 4294967295;
237 leaf_offset (rtree.tree_struct.internal_cell_count)
248 u32 current_node_id = 0;
250 for (
u32 level = 0; level < tree_depth; level++) {
252 u32 lid = lchild_id[current_node_id];
253 u32 rid = rchild_id[current_node_id];
254 u32 lflag = lchild_flag[current_node_id];
255 u32 rflag = rchild_flag[current_node_id];
257 u_morton m_l = tree_morton[lid];
258 u_morton m_r = tree_morton[rid];
263 u32 next_id = (affinity_l > affinity_r) ? lid : rid;
264 u32 next_flag = (affinity_l > affinity_r) ? lflag : rflag;
266 if (next_flag == 1) {
270 current_node_id = next_id;
306 const u32 *neigh_cnt;
307 const u32 *table_neigh_offset;
308 const u32 *table_neigh;
310 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> cell_owner;
312 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> particle_index_map;
313 sycl::accessor<u32, 1, sycl::access::mode::read, sycl::target::device> cell_index_map;
319 template<
class u_morton,
class vec>
321 particle_index_map{
shambase::get_check_ref(rtree.tree_morton_codes.buf_particle_index_map), cgh,sycl::read_only},
322 cell_index_map{
shambase::get_check_ref(rtree.tree_reduced_morton_codes.buf_reduc_index_map), cgh,sycl::read_only},
323 neigh_cnt {cache.cnt_neigh },
324 table_neigh_offset {cache.scanned_cnt },
325 table_neigh {cache.index_neigh_map },
326 cell_owner {ownerships ,cgh,sycl::read_only},
327 leaf_offset (rtree.tree_struct.internal_cell_count)
331 template<
class Functor_iter>
332 inline void iter_object_in_cell(
const u32 &cell_id, Functor_iter &&func_it)
const {
334 uint min_ids = cell_index_map[cell_id];
335 uint max_ids = cell_index_map[cell_id + 1];
337 for (
unsigned int id_s = min_ids; id_s < max_ids; id_s++) {
340 uint id_b = particle_index_map[id_s];
347 template<
class Functor_iter>
348 inline void for_each_object(
u32 idx, Functor_iter &&func_it)
const {
350 u32 leaf_cell_owner = cell_owner[idx];
351 u32 cnt = neigh_cnt[leaf_cell_owner];
352 u32 offset_start = table_neigh_offset[leaf_cell_owner];
353 u32 last_idx = offset_start + cnt;
355 for (
u32 i = offset_start; i < last_idx; i++) {
356 iter_object_in_cell(table_neigh[i] - leaf_offset, func_it);
489 const u32 *neigh_cnt;
490 const u32 *table_neigh_offset;
491 const u32 *table_neigh;
496 neigh_cnt {cache.cnt_neigh },
497 table_neigh_offset {cache.scanned_cnt },
498 table_neigh {cache.index_neigh_map }
502 template<
class Functor_iter>
503 inline void for_each_object(
u32 idx, Functor_iter &&func_it)
const {
505 u32 cnt = neigh_cnt[idx];
506 u32 offset_start = table_neigh_offset[idx];
507 u32 last_idx = offset_start + cnt;
509 for (
u32 i = offset_start; i < last_idx; i++) {
510 func_it(table_neigh[i]);
514 template<
class Functor_iter>
515 inline void for_each_object_with_id(
u32 idx, Functor_iter &&func_it)
const {
517 u32 cnt = neigh_cnt[idx];
518 u32 offset_start = table_neigh_offset[idx];
519 u32 last_idx = offset_start + cnt;
521 for (
u32 i = offset_start; i < last_idx; i++) {
522 func_it(table_neigh[i], i);