21#define SGN(x) (x == 0) ? 0 : ((x > 0) ? 1 : -1)
23template<
class u_morton,
class kername>
24void __sycl_karras_alg(
26 u32 internal_cell_count,
27 sycl::buffer<u_morton> &in_morton,
28 sycl::buffer<u32> &out_buf_lchild_id,
29 sycl::buffer<u32> &out_buf_rchild_id,
30 sycl::buffer<u8> &out_buf_lchild_flag,
31 sycl::buffer<u8> &out_buf_rchild_flag,
32 sycl::buffer<u32> &out_buf_endrange) {
34 sycl::range<1> range_radix_tree{internal_cell_count};
36 queue.submit([&](sycl::handler &cgh) {
38 i32 morton_length = (
i32) internal_cell_count + 1;
40 auto m = in_morton.template get_access<sycl::access::mode::read>(cgh);
42 auto lchild_id = out_buf_lchild_id.get_access<sycl::access::mode::discard_write>(cgh);
43 auto rchild_id = out_buf_rchild_id.get_access<sycl::access::mode::discard_write>(cgh);
44 auto lchild_flag = out_buf_lchild_flag.get_access<sycl::access::mode::discard_write>(cgh);
45 auto rchild_flag = out_buf_rchild_flag.get_access<sycl::access::mode::discard_write>(cgh);
46 auto end_range_cell = out_buf_endrange.get_access<sycl::access::mode::discard_write>(cgh);
48 cgh.parallel_for<kername>(range_radix_tree, [=](sycl::item<1> item) {
49 int i = (int) item.get_id(0);
51 auto DELTA = [=](
i32 x,
i32 y) {
55 int ddelta = DELTA(i, i + 1) - DELTA(i, i - 1);
60 int delta_min = DELTA(i, i - d);
62 while (DELTA(i, i + lmax * d) > delta_min) {
70 if (DELTA(i, i + (l + t) * d) > delta_min) {
77 end_range_cell[i] = j;
80 int delta_node = DELTA(i, j);
85 t = sycl::ceil(l / div);
87 int tmp_ = i + (s + t) * d;
88 if (DELTA(i, tmp_) > delta_node) {
94 t = sycl::ceil(l / div);
96 int gamma = i + s * d + sycl::min(d, 0);
98 if (sycl::min(i, j) == gamma) {
102 lchild_id[i] = gamma;
106 if (sycl::max(i, j) == gamma + 1) {
107 rchild_id[i] = gamma + 1;
110 rchild_id[i] = gamma + 1;
119class Kernel_Karras_alg_morton32;
120class Kernel_Karras_alg_morton64;
123void sycl_karras_alg<u32>(
125 u32 internal_cell_count,
126 sycl::buffer<u32> &in_morton,
127 sycl::buffer<u32> &out_buf_lchild_id,
128 sycl::buffer<u32> &out_buf_rchild_id,
129 sycl::buffer<u8> &out_buf_lchild_flag,
130 sycl::buffer<u8> &out_buf_rchild_flag,
131 sycl::buffer<u32> &out_buf_endrange) {
132 __sycl_karras_alg<u32, Kernel_Karras_alg_morton32>(
144void sycl_karras_alg<u64>(
146 u32 internal_cell_count,
147 sycl::buffer<u64> &in_morton,
148 sycl::buffer<u32> &out_buf_lchild_id,
149 sycl::buffer<u32> &out_buf_rchild_id,
150 sycl::buffer<u8> &out_buf_lchild_flag,
151 sycl::buffer<u8> &out_buf_rchild_flag,
152 sycl::buffer<u32> &out_buf_endrange) {
153 __sycl_karras_alg<u64, Kernel_Karras_alg_morton64>(
#define SGN(x)
Macro to get the sign of a number.
std::uint32_t u32
32 bit unsigned integer
std::int32_t i32
32 bit integer
This header file contains utility functions related to exception handling in the code.
i32 karras_delta(i32 x, i32 y, u32 morton_length, Acc m) noexcept
delta operator defined in Karras 2012