BioCMAMC-ST
kernels.hpp
1#ifndef __SIMULATION_KERNELS_HPP__
2#define __SIMULATION_KERNELS_HPP__
3
4#include <Kokkos_Core_fwd.hpp>
5#include <common/common.hpp>
6#include <common/kokkos_getpolicy.hpp>
7#include <mc/domain.hpp>
8#include <mc/unit.hpp>
9#include <simulation/kernels/contribution_kernel.hpp>
10#include <simulation/kernels/model_kernel.hpp>
11#include <simulation/kernels/move_kernel.hpp>
12
13#include <common/execinfo.hpp>
14#include <stdexcept>
15
17{
18
19 template <typename Space>
22 template <typename Space>
23 using move_reducer_view_type = Kokkos::View<std::size_t, Space>;
25 template <typename Space, ModelType Model> struct CycleFunctors
26 {
27 using FModel = Model;
32 ComputeSpace move_space;
34 ComputeSpace model_space;
43 CycleFunctors() = default;
48
49 void
50 update(const double d_t,
53 {
54 f_multi_compartment = new_move.liquid_volume.size() > 1;
56 const bool enable_leave = new_move.leaving_flow.size() != 0;
57
58 // FIXME: cycle_kernel: need to update container because we change:
59 // n_used_element counter which is size_t outside of kernel. As functor
60 // owns a copy of container this counter is not update between iterations.
61 // 1. Use n_used_element as a reference counter type
62 // 2. Manually update counter in update function (dirty way)
63
64 cycle_kernel.update(d_t, container);
65
66 contribution_kernel.update(container);
67
68 // TODO: Why need to update all views (where did we lost the refcount ? )
69 move_kernel.update(d_t,
70 container.n_particles(),
71 std::move(new_move),
72 container.position,
73 container.status,
74 container.ages,
77 }
78
79 auto
81 {
82 const auto host_red
83 = Kokkos::create_mirror_view_and_copy(HostSpace(), cycle_reducer)();
84
85 const auto host_out_counter
86 = Kokkos::create_mirror_view_and_copy(HostSpace(), move_reducer)();
87
88 return std::tuple(host_red, host_out_counter);
89 }
93 MC::pool_type _random_pool,
94 MC::KernelConcentrationType _concentrations,
95 MC::ContributionView _contribs_scatter,
96 MC::EventContainer _event,
99 ProbeAutogeneratedBuffer _probes_div)
100 : cycle_reducer("cycle_reducer"), move_reducer("move_reducer"),
101 cycle_kernel(options.m_p_p_team_model,
102 container,
103 _random_pool,
104 std::move(_concentrations),
105 _event,
106 _probes_div),
107 move_kernel(options.m_p_p_team_move,
108 options.m_p_p_team_leave,
109 container.position,
110 container.status,
111 std::move(m),
112 _random_pool,
113 _event,
114 _probes,
115 container.ages),
117 options.m_p_p_team_contribs, _contribs_scatter, container),
118 m_options(options)
119
120 {
121 }
122
123 void
124 launch_move(const std::size_t n_particle) const
125 {
126
127 if (move_kernel.enable_move)
128 {
129 const auto npt = m_options.m_p_p_team_move;
130 if (n_particle <= npt)
131 {
132 // TODO
133 throw std::runtime_error("Nparticle<n per team");
134 }
135
136 const std::size_t league_size = Common::c_league_size(n_particle, npt);
137
138 auto cycle_policy
139 = Kokkos::TeamPolicy<TagMove>(model_space,
140 static_cast<int>(league_size),
141 Kokkos::AUTO(),
142 Kokkos::AUTO());
143
144 cycle_policy.set_scratch_size(0,
145 Kokkos::PerTeam(sizeof(float) * npt * 2));
146
147 Kokkos ::parallel_for("cycle_move", cycle_policy, move_kernel);
148 }
149
150 if (move_kernel.enable_leave)
151 {
152
153 const auto _policy_leave = Kokkos::RangePolicy<KernelInline::TagLeave>(
154 move_space, 0, n_particle);
155 Kokkos ::parallel_reduce(
156 "cycle_move_leave", _policy_leave, move_kernel, move_reducer);
157 }
158 }
159
160 void
161 launch_model(const std::size_t n_particle) const
162 {
163 if (n_particle <= m_options.m_p_p_team_model)
164 {
165 // TODO
166 throw std::runtime_error("Nparticle<n per team");
167 }
168
169 std::size_t league_size
170 = Common::c_league_size(n_particle, m_options.m_p_p_team_model);
171
172 const auto cycle_policy
173 = Kokkos::TeamPolicy<TagCycle>(model_space,
174 static_cast<int>(league_size),
175 Kokkos::AUTO(),
176 Kokkos::AUTO());
177
178 Kokkos::parallel_reduce(
179 "cycle_model",
180 cycle_policy,
183 Kokkos::fence(); // TODO needed ?
184
185 // Assumptions
186 // Newborn cells do not contribte in current time step
187 // Mother cell doesn´t exist but
188 // Contribution array is not changed during division and
189
190 if (cycle_kernel.do_contribs())
191 {
192
193 if (n_particle <= m_options.m_p_p_team_contribs)
194 {
195 // TODO
196 throw std::runtime_error("Nparticle<n per team");
197 }
198
199 league_size
200 = Common::c_league_size(n_particle, m_options.m_p_p_team_contribs);
201 static_assert(ConstWeightModelType<Model>,
202 "ModelType:Constapply_weight()");
203
205 {
206
207 const auto policy_contribs
208 = Kokkos::TeamPolicy<typename ContributionFunctor<Model>::Tag3D>(
209 model_space, league_size, Kokkos::AUTO(), Kokkos::AUTO());
210 Kokkos::parallel_for(
211 "cycle_model_contribs", policy_contribs, contribution_kernel);
212 }
213 else
214 {
215 auto policy_contribs
216 = Kokkos::TeamPolicy<typename ContributionFunctor<Model>::Tag0D>(
217 model_space, league_size, Kokkos::AUTO(), Kokkos::AUTO());
218 policy_contribs.set_scratch_size(
219 0, Kokkos::PerTeam(sizeof(float) * Model::n_c));
220 Kokkos::parallel_for(
221 "cycle_model_contribs_0d", policy_contribs, contribution_kernel);
222 }
223 }
224 }
225 };
226
227} // namespace Simulation::KernelInline
228
229#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:449
MC::ParticlePositions position
Definition particles_container.hpp:85
ParticleAges ages
Definition particles_container.hpp:88
MC::ParticleStatus status
Definition particles_container.hpp:86
Definition model_kernel.hpp:55
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:201
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:17
constexpr bool enable_leave
Definition move_kernel.hpp:22
KernelInline::CycleReducer< Space >::result_view_type cycle_reducer_view_type
Definition kernels.hpp:20
constexpr bool enable_move
Definition move_kernel.hpp:25
Kokkos::View< std::size_t, Space > move_reducer_view_type
Definition kernels.hpp:22
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:148
Definition contribution_kernel.hpp:9
Definition execinfo.hpp:12
Structure to store information about domain needed during MC cycle data is likely to change between e...
Definition domain.hpp:28
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:150
Definition model_kernel.hpp:124
CycleFunctor< Model > cycle_kernel_type
Definition kernels.hpp:28
cycle_kernel_type cycle_kernel
Definition kernels.hpp:37
ComputeSpace model_space
Definition kernels.hpp:33
MoveFunctor move_kernel_type
Definition kernels.hpp:29
bool f_multi_compartment
Definition kernels.hpp:46
move_kernel_type move_kernel
Definition kernels.hpp:38
auto get_host_reduction()
Definition kernels.hpp:79
void launch_move(const std::size_t n_particle) const
Definition kernels.hpp:123
KernelDispatchOptions m_options
Definition kernels.hpp:44
ComputeSpace move_space
Definition kernels.hpp:31
cycle_reducer_view_type< Space > cycle_reducer
Definition kernels.hpp:35
move_reducer_view_type< Space > move_reducer
Definition kernels.hpp:36
void launch_model(const std::size_t n_particle) const
Definition kernels.hpp:160
Model FModel
Definition kernels.hpp:26
ContributionFunctor< Model > contribution_kernel
Definition kernels.hpp:40
void update(const double d_t, MC::ParticlesContainer< Model > container, MC::DomainState< ComputeSpace > &&new_move)
Definition kernels.hpp:49
Definition move_kernel.hpp:115