BioCMAMC-ST
kernels.hpp
1#ifndef __SIMULATION_KERNELS_HPP__
2#define __SIMULATION_KERNELS_HPP__
3
4#include "mc/alias.hpp"
5#include <Kokkos_Core_fwd.hpp>
6#include <common/common.hpp>
7#include <common/kokkos_getpolicy.hpp>
8#include <impl/Kokkos_Profiling.hpp>
9#include <mc/domain.hpp>
10#include <mc/unit.hpp>
11#include <simulation/kernels/contribution_kernel.hpp>
12#include <simulation/kernels/model_kernel.hpp>
13#include <simulation/kernels/move_kernel.hpp>
14
15#include <common/execinfo.hpp>
16#include <stdexcept>
17
19{
20
21 template <typename Space>
24 template <typename Space>
25 using move_reducer_view_type = Kokkos::View<std::size_t, Space>;
27 template <typename Space, ModelType Model> struct CycleFunctors
28 {
29 using FModel = Model;
34 ComputeSpace move_space;
36 ComputeSpace model_space;
45 CycleFunctors() = default;
50
51 void
52 update(const double d_t,
55 {
56 f_multi_compartment = new_move.liquid_volume.size() > 1;
58 const bool enable_leave = new_move.leaving_flow.size() != 0;
59
60 // FIXME: cycle_kernel: need to update container because we change:
61 // n_used_element counter which is size_t outside of kernel. As functor
62 // owns a copy of container this counter is not update between iterations.
63 // 1. Use n_used_element as a reference counter type
64 // 2. Manually update counter in update function (dirty way)
65
66 cycle_kernel.update(d_t, container);
67
68 contribution_kernel.update(container, d_t);
69
70 // TODO: Why need to update all views (where did we lost the refcount ? )
71 move_kernel.update(d_t,
72 container.n_particles(),
73 std::move(new_move),
74 container.position,
75 container.status,
76 container.ages,
79 }
80
81 auto
83 {
84 const auto host_red
85 = Kokkos::create_mirror_view_and_copy(HostSpace(), cycle_reducer)();
86
87 const auto host_out_counter
88 = Kokkos::create_mirror_view_and_copy(HostSpace(), move_reducer)();
89
90 return std::tuple(host_red, host_out_counter);
91 }
95 MC::pool_type _random_pool,
96 MC::KernelConcentrationType _concentrations,
97 MC::ContributionView _contribs_scatter,
98 MC::EventContainer _event,
101 ProbeAutogeneratedBuffer _probes_div)
102 : cycle_reducer("cycle_reducer"), move_reducer("move_reducer"),
103 cycle_kernel(options.m_p_p_team_model,
104 container,
105 _random_pool,
106 _concentrations,
107 _event,
108 _probes_div),
109 move_kernel(options.m_p_p_team_move,
110 options.m_p_p_team_leave,
111 container.position,
112 container.status,
113 std::move(m),
114 _random_pool,
115 _event,
116 _probes,
117 container.ages),
118 // contribution_kernel(
119 // options.m_p_p_team_contribs, _contribs_scatter, container),
120 contribution_kernel(options.m_p_p_team_contribs,
121 _contribs_scatter,
122 container,
123 _random_pool,
124 _concentrations,
125 _event),
126 m_options(options)
127
128 {
129 }
130
131 void
132 launch_move(const std::size_t n_particle)
133 {
134 bool is_0d_reactor = move_kernel.do_move();
135 if (is_0d_reactor)
136 {
137
138 std::size_t npt = m_options.m_p_p_team_move;
139
140 if (n_particle <= npt)
141 {
142 move_kernel.m_p_team_move = 1;
143 npt = 1;
144 }
145
146 const std::size_t league_size = Common::c_league_size(n_particle, npt);
147
148 auto cycle_policy
149 = Kokkos::TeamPolicy<TagMove>(model_space,
150 static_cast<int>(league_size),
151 Kokkos::AUTO(),
152 Kokkos::AUTO());
153
154 cycle_policy.set_scratch_size(0,
155 Kokkos::PerTeam(sizeof(float) * npt * 2));
156
157 Kokkos ::parallel_for("cycle_move", cycle_policy, move_kernel);
158 }
159
160 if (move_kernel.do_leave())
161 {
162
163 std::size_t npt = move_kernel.m_p_team_leave;
164 if (n_particle <= npt)
165 {
166 move_kernel.m_p_team_leave = 1;
167 npt = 1;
168 }
169 const std::size_t league_size = Common::c_league_size(n_particle, npt);
170
171 // This is duplicated code but there is no simple alternative to select
172 // policy tag at runtime
173 if (!is_0d_reactor)
174 {
175 auto _policy_leave
176 = Kokkos::TeamPolicy<TagLeaveB0D>(move_space,
177 static_cast<int>(league_size),
178 Kokkos::AUTO(),
179 Kokkos::AUTO());
180
181 Kokkos::parallel_reduce(
182 "cycle_move_leave", _policy_leave, move_kernel, move_reducer);
183 }
184 else
185 {
186 auto _policy_leave
187 = Kokkos::TeamPolicy<TagLeave>(move_space,
188 static_cast<int>(league_size),
189 Kokkos::AUTO(),
190 Kokkos::AUTO());
191
192 // auto _policy_leave
193 // = Kokkos::RangePolicy<TagLeave>(move_space, 0, n_particle);
194
195 Kokkos::parallel_reduce(
196 "cycle_move_leave", _policy_leave, move_kernel, move_reducer);
197 }
198 }
199 }
200
201 void
202 launch_model(const std::size_t n_particle)
203 {
204
205 std::size_t npt = m_options.m_p_p_team_model;
206
207 if (n_particle <= npt)
208 {
209 cycle_kernel.m_p_team = 1;
210 npt = 1;
211 }
212
213 std::size_t league_size = Common::c_league_size(n_particle, npt);
214
215 // const auto cycle_policy
216 // = Kokkos::TeamPolicy<TagCycle, Kokkos::Schedule<Kokkos::Dynamic>>(
217 // model_space,
218 // static_cast<int>(league_size),
219 // Kokkos::AUTO(),
220 // Kokkos::AUTO());
221
222 // Kokkos::parallel_reduce(
223 // "cycle_model",
224 // cycle_policy,
225 // cycle_kernel,
226 // KernelInline::CycleReducer<ComputeSpace>(cycle_reducer));
227 // Kokkos::fence(); // TODO needed ?
228
229 // // Assumptions
230 // // Newborn cells do not contribte in current time step
231 // // Mother cell doesn´t exist but
232 // // Contribution array is not changed during division and
233
234 if (cycle_kernel.do_contribs())
235 {
236
237 std::size_t npt = m_options.m_p_p_team_contribs;
238 if (n_particle <= npt)
239 {
240 contribution_kernel.m_particle_per_team = 1;
241 npt = 1;
242 }
243
244 league_size = Common::c_league_size(n_particle, npt);
245 static_assert(ConstWeightModelType<Model>,
246 "ModelType:Constapply_weight()");
247
249 {
250
251 const auto policy_contribs
252 = Kokkos::TeamPolicy<typename ContributionFunctor<Model>::Tag3D>(
253 model_space, league_size, Kokkos::AUTO(), Kokkos::AUTO());
254 Kokkos::parallel_for(
255 "cycle_model_contribs", policy_contribs, contribution_kernel);
256 }
257 else
258 {
259 auto policy_contribs
260 = Kokkos::TeamPolicy<typename ContributionFunctor<Model>::Tag0D>(
261 model_space, league_size, Kokkos::AUTO(), Kokkos::AUTO());
262 policy_contribs.set_scratch_size(
263 0, Kokkos::PerTeam(sizeof(float) * Model::n_c));
264 Kokkos::parallel_for(
265 "cycle_model_contribs_0d", policy_contribs, contribution_kernel);
266 }
267 }
268 }
269 };
270
271} // namespace Simulation::KernelInline
272
273#endif
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:57
KOKKOS_INLINE_FUNCTION std::size_t n_particles() const
Gets the number of particles in the container.
Definition particles_container.hpp:448
MC::ParticlePositions position
Definition particles_container.hpp:84
ParticleAges ages
Definition particles_container.hpp:87
MC::ParticleStatus status
Definition particles_container.hpp:85
Kokkos::View< value_type, Space > result_view_type
Definition model_kernel.hpp:60
Concept to check if a model type has uniform_weight
Definition traits.hpp:203
std::size_t c_league_size(std::size_t n_tot, std::size_t n_per_team) noexcept
Definition common.cpp:17
decltype(Kokkos::Experimental::create_scatter_view( kernelContribution())) ContributionView
Definition alias.hpp:162
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:100
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > KernelConcentrationType
Definition alias.hpp:165
Definition kernels.hpp:19
constexpr bool enable_leave
Definition move_kernel.hpp:24
KernelInline::CycleReducer< Space >::result_view_type cycle_reducer_view_type
Definition kernels.hpp:22
constexpr bool enable_move
Definition move_kernel.hpp:27
Kokkos::View< std::size_t, Space > move_reducer_view_type
Definition kernels.hpp:24
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:150
Definition contribution_kernel.hpp:11
Definition execinfo.hpp:12
Structure to store information about domain needed during MC cycle data is likely to change between e...
Definition domain.hpp:29
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:151
Definition model_kernel.hpp:124
CycleFunctor< Model > cycle_kernel_type
Definition kernels.hpp:30
cycle_kernel_type cycle_kernel
Definition kernels.hpp:39
ComputeSpace model_space
Definition kernels.hpp:35
MoveFunctor move_kernel_type
Definition kernels.hpp:31
bool f_multi_compartment
Definition kernels.hpp:48
move_kernel_type move_kernel
Definition kernels.hpp:40
void launch_model(const std::size_t n_particle)
Definition kernels.hpp:201
auto get_host_reduction()
Definition kernels.hpp:81
KernelDispatchOptions m_options
Definition kernels.hpp:46
ComputeSpace move_space
Definition kernels.hpp:33
cycle_reducer_view_type< Space > cycle_reducer
Definition kernels.hpp:37
move_reducer_view_type< Space > move_reducer
Definition kernels.hpp:38
void launch_move(const std::size_t n_particle)
Definition kernels.hpp:131
Model FModel
Definition kernels.hpp:28
ContributionFunctor< Model > contribution_kernel
Definition kernels.hpp:42
void update(const double d_t, MC::ParticlesContainer< Model > container, MC::DomainState< ComputeSpace > &&new_move)
Definition kernels.hpp:51
Definition move_kernel.hpp:115