1#ifndef __CONTRIBUTION_KERNEL_HPP__
2#define __CONTRIBUTION_KERNEL_HPP__
3#include "Kokkos_Assert.hpp"
4#include <Kokkos_Core.hpp>
5#include <mc/particles_container.hpp>
6#include <mc/traits.hpp>
22 TeamPolicy::execution_space::scratch_memory_space>;
49 KOKKOS_INLINE_FUNCTION
55 const std::size_t n_particle =
m_particles.n_particles();
58 static const auto n_c = M::n_c;
62 Kokkos::parallel_for(Kokkos::TeamVectorRange(team, n_c),
63 [&](
const std::size_t j)
64 { scratch(j) =
float_t{ 0 }; });
71 && (p0 + upper_bound) <= n_particle);
76 Kokkos::TeamThreadRange(team, 0, upper_bound),
77 [&](
const std::size_t relative_index)
79 const std::size_t flatten_index = p0 + relative_index;
84 const auto weight =
m_particles.get_weight(flatten_index);
85 for (std::size_t j = 0; j < n_c; ++j)
87 Kokkos::atomic_add(&scratch(j),
88 weight * contribs(flatten_index, j));
94 Kokkos::single(Kokkos::PerTeam(team),
97 auto access = cs.access();
98 for (std::size_t j = 0; j < M::n_c; ++j)
100 access(j, 0) += scratch(j);
145 KOKKOS_INLINE_FUNCTION
156 constexpr std::size_t work_per_thread = 32;
161 KOKKOS_ASSERT(upper_bound >= 0 && upper_bound < n_particle);
162 const auto range = (upper_bound + work_per_thread - 1) / work_per_thread;
166 Kokkos::parallel_for(
167 Kokkos::TeamThreadRange(team, 0, range),
168 [&](
const std::size_t i)
171 for (std::size_t k = 0; k < work_per_thread; ++k)
173 const std::size_t p = p0 + i * work_per_thread + k;
179 const auto pos = positions(p);
180 Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, 0, M::n_c),
182 { access(j, pos) += weight * c(p, j); });
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:57
decltype(Kokkos::Experimental::create_scatter_view( kernelContribution())) ContributionView
Definition alias.hpp:162
@ Idle
Definition alias.hpp:126
Definition contribution_kernel.hpp:11
Definition contribution_kernel.hpp:14
TeamPolicy::member_type TeamMember
Definition contribution_kernel.hpp:18
KOKKOS_INLINE_FUNCTION void operator()(Tag0D _tag, const TeamMember &team) const
Definition contribution_kernel.hpp:50
ContributionFunctor(std::size_t particle_per_team, MC::ContributionView contribution_scatter, MC::ParticlesContainer< M > particles)
Definition contribution_kernel.hpp:24
Kokkos::View< float_t *, TeamPolicy::execution_space::scratch_memory_space > ScratchView
Definition contribution_kernel.hpp:20
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition contribution_kernel.hpp:17
void update(MC::ParticlesContainer< M > _particles)
Definition contribution_kernel.hpp:36
float float_t
Definition contribution_kernel.hpp:22
size_t np
Definition contribution_kernel.hpp:33
MC::ParticlesContainer< M > m_particles
Definition contribution_kernel.hpp:46
MC::ContributionView m_contribution_scatter
Definition contribution_kernel.hpp:45
std::size_t m_particle_per_team
Definition contribution_kernel.hpp:43