BioCMAMC-ST
alg.hpp
1#ifndef __COMMON_ALG_HPP__
2#define __COMMON_ALG_HPP__
3#include <Kokkos_Sort.hpp>
4#include <common/common.hpp>
5#include <functional>
6#include <limits>
7#include <sorting/Kokkos_BinSortPublicAPI.hpp>
8#include <sorting/impl/Kokkos_CopyOpsForBinSortImpl.hpp>
9#include <sorting/impl/Kokkos_SortByKeyImpl.hpp>
10double naive_newton(const std::function<double(double)>& f,
11 double x_init,
12 bool* success,
13 double tolerance = std::numeric_limits<double>::epsilon());
14
15namespace Sorting
16{
17 namespace
18 {
19 template <typename PermType, typename... Views>
20 void
21 copy_data(std::size_t n_allocated_elements,
22 std::size_t n_used_elements,
23 const PermType& perm,
24 std::size_t src_offset,
25 Views... views)
26 {
27 // The following may not work on GPU
28
29 // auto tmp_views = std::make_tuple(Kokkos::create_mirror(views)...);
30
31 // Kokkos::parallel_for(
32 // "Sort::copy_data",
33 // Kokkos::RangePolicy<>(0, n_allocated_elements),
34 // KOKKOS_LAMBDA(int i) {
35 // if (perm(i) >= n_used_elements)
36 // {
37 // return;
38 // }
39
40 // const int idx = src_offset + perm(i);
41
42 // std::apply(
43 // [&](auto&... tmp)
44 // {
45 // ((Kokkos::Impl::CopyOp<
46 // std::decay_t<decltype(views)>,
47 // std::decay_t<decltype(views)>>::copy(tmp, i, views,
48 // idx)),
49 // ...);
50 // },
51 // tmp_views);
52 // });
53
54 // auto do_deep_copy = [](auto& dst, auto& src)
55 // { Kokkos::deep_copy(dst, src); };
56
57 // std::apply([&](auto&... tmps) { (do_deep_copy(views, tmps), ...); },
58 // tmp_views);
59 }
60
61 } // namespace
62
63 template <typename RefView, typename... ViewType>
64 void
65 sort_soa(std::size_t n0,
66 std::size_t nn,
67 std::size_t n_e,
68 std::size_t n_max,
69 RefView ref_sorting,
70 ViewType... views)
71 {
72 using ExecSpace = Kokkos::DefaultExecutionSpace;
73 PROFILE_SECTION("SORT")
74 if (nn - n0 == 1 || nn < n0)
75 {
76 return;
77 }
78 const int bin_size = 2048;
79 using view_type = decltype(ref_sorting);
80 auto binop = Kokkos::BinOp1D<view_type>(bin_size, n0, nn);
81
82 auto sorter = Kokkos::BinSort<view_type, decltype(binop)>(
83 ExecSpace(), ref_sorting, 0, n_e, binop, false);
84
85 sorter.create_permute_vector();
86 auto perm = sorter.get_permute_vector();
87 auto src_offset = 0;
88 copy_data(n_max, n_e, perm, src_offset, views...);
89 }
90} // namespace Sorting
91
92#endif //__COMMON_ALG_HPP__
Definition alg.hpp:16
void sort_soa(std::size_t n0, std::size_t nn, std::size_t n_e, std::size_t n_max, RefView ref_sorting, ViewType... views)
Definition alg.hpp:65