39 if (link_count != graph.link_count) {
40 link_count = graph.link_count;
41 link_graph_field.
resize(link_count * nvar);
44 void resize(
u32 count) {
45 if (link_count != count) {
47 link_graph_field.
resize(link_count * nvar);
52 : link_graph_field(0, shamsys::instance::get_compute_scheduler_ptr()), nvar(nvar),
56 : link_graph_field(graph.link_count, shamsys::instance::get_compute_scheduler_ptr()),
57 link_count(graph.link_count), nvar(1) {}
61 graph.link_count * nvar, shamsys::instance::get_compute_scheduler_ptr()),
62 link_count(graph.link_count), nvar(nvar) {}
65 : link_graph_field(link_count * nvar, shamsys::instance::get_compute_scheduler_ptr()),
66 link_count(link_count), nvar(nvar) {}
74 inline void complete_event_state(sycl::event e)
const {
79 template<
class LinkFieldCompute,
class T>
80 inline void ddupdate_link_field(
81 sham::DeviceScheduler_ptr dev_sched,
87 auto &result = neigh_graph_field;
90 return graph.
get(
id).obj_cnt;
98 [](
u32 id_a,
auto link_iter,
auto compute,
auto acc_link_field) {
99 link_iter.for_each_object_link_id(id_a, [&](
u32 id_b,
u32 link_id) {
100 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
105 template<
class LinkFieldCompute,
class T,
class... Args>
106 inline void update_link_field(
110 NeighGraphLinkField<T> &neigh_graph_field,
115 auto &result = neigh_graph_field;
117 result.resize(graph);
119 auto acc_link_field = result.link_graph_field.get_write_access(depends_list);
120 auto link_iter = graph.get_read_access(depends_list);
122 LinkFieldCompute compute(std::forward<Args>(args)...);
124 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
125 shambase::parallel_for(cgh, graph.obj_cnt,
"compute link field", [=](
u32 id_a) {
126 link_iter.for_each_object_link_id(id_a, [&](u32 id_b, u32 link_id) {
127 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
133 result.link_graph_field.complete_event_state(e);
134 graph.complete_event_state(e);
136 template<
class LinkFieldCompute,
class T,
class... Args>
137 inline void update_link_field_indep_nvar(
141 NeighGraphLinkField<T> &neigh_graph_field,
147 auto &result = neigh_graph_field;
149 result.resize(graph);
151 auto acc_link_field = result.link_graph_field.get_write_access(depends_list);
152 auto link_iter = graph.get_read_access(depends_list);
154 LinkFieldCompute compute(nvar, std::forward<Args>(args)...);
156 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
157 shambase::parallel_for(
158 cgh, graph.obj_cnt * nvar,
"compute link field indep nvar", [=](
u32 idvar_a) {
159 const u32 id_cell_a = idvar_a / nvar;
160 const u32 nvar_loc = idvar_a % nvar;
162 link_iter.for_each_object_link_id(id_cell_a, [&](u32 id_cell_b, u32 link_id) {
163 acc_link_field[link_id * nvar + nvar_loc] = compute.get_link_field_val(
164 id_cell_a * nvar + nvar_loc, id_cell_b * nvar + nvar_loc);
170 result.link_graph_field.complete_event_state(e);
171 graph.complete_event_state(e);
174 template<
class LinkFieldCompute,
class T,
class... Args>
175 NeighGraphLinkField<T> compute_link_field(
183 NeighGraphLinkField<T> result{graph};
185 auto acc_link_field = result.link_graph_field.get_write_access(depends_list);
186 auto link_iter = graph.get_read_access(depends_list);
188 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
189 LinkFieldCompute compute(cgh, std::forward<Args>(args)...);
191 shambase::parallel_for(cgh, graph.obj_cnt,
"compute link field", [=](
u32 id_a) {
192 link_iter.for_each_object_link_id(id_a, [&](u32 id_b, u32 link_id) {
193 acc_link_field[link_id] = compute.get_link_field_val(id_a, id_b);
199 result.link_graph_field.complete_event_state(e);
200 graph.complete_event_state(e);
205 template<
class LinkFieldCompute,
class T,
class... Args>
206 NeighGraphLinkField<T> compute_link_field_indep_nvar(
216 NeighGraphLinkField<T> result{graph, nvar};
218 auto acc_link_field = result.link_graph_field.get_write_access(depends_list);
219 auto link_iter = graph.get_read_access(depends_list);
221 auto e = q.
submit(depends_list, [&](sycl::handler &cgh) {
222 LinkFieldCompute compute(cgh, nvar, std::forward<Args>(args)...);
224 shambase::parallel_for(
225 cgh, graph.obj_cnt * nvar,
"compute link field indep nvar", [=](
u32 idvar_a) {
226 const u32 id_cell_a = idvar_a / nvar;
227 const u32 nvar_loc = idvar_a % nvar;
229 link_iter.for_each_object_link_id(id_cell_a, [&](u32 id_cell_b, u32 link_id) {
230 acc_link_field[link_id * nvar + nvar_loc] = compute.get_link_field_val(
231 id_cell_a * nvar + nvar_loc, id_cell_b * nvar + nvar_loc);
237 result.link_graph_field.complete_event_state(e);
238 graph.complete_event_state(e);
Header file describing a Node Instance.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory)
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
void resize(size_t new_size, bool keep_data=true)
Resizes the buffer to a given size.
T * get_write_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{})
Get a read-write pointer to the buffer's data.
const T * get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const
Get a read-only pointer to the buffer's data.
A SYCL queue associated with a device and a context.
sycl::event submit(Fct &&fct)
Submits a kernel to the SYCL queue.
Class to manage a list of SYCL events.
void add_event(sycl::event e)
Add an event to the list of events.
Represents a collection of objects distributed across patches identified by a u64 id.
DistributedData< Tmap > map(std::function< Tmap(u64, T &)> map_func)
Apply a function to all objects in the collection and return a new collection containing the results.
T & get(u64 id)
Returns a reference to an object in the collection.
void distributed_data_kernel_call(sham::DeviceScheduler_ptr dev_sched, RefIn in, RefOut in_out, const shambase::DistributedData< index_t > &thread_counts, Functor &&func)
A variant of sham::kernel_call for distributed data.
namespace for the basegodunov model modules
A variant of sham::MultiRef for distributed data.