@@ -49,8 +49,41 @@ using prefix_sum_buffer_t = prefix_sum_buffer;
4949// / the view elements, and the total summation of the size vector
5050// /
5151TRACCC_HOST
52- prefix_sum_buffer_t make_prefix_sum_buffer (
52+ inline prefix_sum_buffer_t make_prefix_sum_buffer (
5353 const std::vector<prefix_sum_size_t >& sizes, vecmem::copy& copy,
54- const traccc::memory_resource& mr);
54+ const traccc::memory_resource& mr) {
5555
56+ if (sizes.size () == 0 ) {
57+ return prefix_sum_buffer_t {
58+ vecmem::data::vector_view<prefix_sum_size_t >{},
59+ std::variant<vecmem::vector<prefix_sum_size_t >,
60+ vecmem::data::vector_buffer<prefix_sum_size_t >>{},
61+ prefix_sum_size_t {0 }};
62+ }
63+
64+ // Create vector with summation of sizes
65+ vecmem::vector<prefix_sum_size_t > sizes_sum (sizes.size (),
66+ mr.host ? mr.host : &(mr.main ));
67+ std::partial_sum (sizes.begin (), sizes.end (), sizes_sum.begin (),
68+ std::plus<prefix_sum_size_t >());
69+ const prefix_sum_size_t totalSize = sizes_sum.back ();
70+
71+ if (mr.host != nullptr ) {
72+ // Create buffer and view objects
73+ vecmem::data::vector_buffer<prefix_sum_size_t > sizes_sum_buff (
74+ static_cast <unsigned int >(sizes_sum.size ()), mr.main );
75+ copy.setup (sizes_sum_buff)->ignore ();
76+ (copy)(vecmem::get_data (sizes_sum), sizes_sum_buff)->wait ();
77+ vecmem::data::vector_view<prefix_sum_size_t > sizes_sum_view (
78+ sizes_sum_buff);
79+
80+ return {sizes_sum_view, std::move (sizes_sum_buff), totalSize};
81+ } else {
82+ // Create view object
83+ vecmem::data::vector_view<prefix_sum_size_t > sizes_sum_view =
84+ vecmem::get_data (sizes_sum);
85+
86+ return {sizes_sum_view, std::move (sizes_sum), totalSize};
87+ }
88+ }
5689} // namespace traccc::device
0 commit comments