1#ifndef AMREX_CTO_PARALLEL_FOR_H_
2#define AMREX_CTO_PARALLEL_FOR_H_
27 template<
class F,
int... ctr>
31 template<
class... Args>
34 ->
decltype(
f(args..., std::integral_constant<int, ctr>{}...)) {
35 return f(args..., std::integral_constant<int, ctr>{}...);
45 template <
class L,
typename... As,
class... Fs>
48 std::array<
int,
sizeof...(As)>
const& runtime_options,
const Fs&...cto_functs)
50 if (runtime_options == std::array<
int,
sizeof...(As)>{As::value...}) {
51 if constexpr (
sizeof...(cto_functs) != 0) {
65 template <
class L,
typename... PPs,
typename RO,
class...Fs>
68 RO
const& runtime_options,
const Fs&...cto_functs)
70 bool found_option = (
false || ... ||
178template <
class L,
class... Fs,
typename... CTOs>
180 std::array<
int,
sizeof...(CTOs)>
const& runtime_options,
181 L&& l, Fs&&...cto_functs)
186 std::forward<Fs>(cto_functs)...);
189template <
int MT,
typename T,
class F,
typename... CTOs>
190std::enable_if_t<std::is_integral_v<T>>
192 std::array<
int,
sizeof...(CTOs)>
const& runtime_options,
195 AnyCTO(ctos, runtime_options,
197 ParallelFor<MT>(N, cto_func);
203template <
int MT,
class F,
int dim,
typename... CTOs>
205 std::array<
int,
sizeof...(CTOs)>
const& runtime_options,
208 AnyCTO(ctos, runtime_options,
210 ParallelFor<MT>(box, cto_func);
216template <
int MT,
typename T,
class F,
int dim,
typename... CTOs>
217std::enable_if_t<std::is_integral_v<T>>
219 std::array<
int,
sizeof...(CTOs)>
const& runtime_options,
222 AnyCTO(ctos, runtime_options,
224 ParallelFor<MT>(box, ncomp, cto_func);
274template <
typename T,
class F,
typename... CTOs>
275std::enable_if_t<std::is_integral_v<T>>
277 std::array<
int,
sizeof...(CTOs)>
const& option,
280 ParallelFor<AMREX_GPU_MAX_THREADS>(ctos, option, N, std::forward<F>(f));
328template <
class F,
int dim,
typename... CTOs>
330 std::array<
int,
sizeof...(CTOs)>
const& option,
333 ParallelFor<AMREX_GPU_MAX_THREADS>(ctos, option, box, std::forward<F>(f));
382template <
typename T,
class F,
int dim,
typename... CTOs>
383std::enable_if_t<std::is_integral_v<T>>
385 std::array<
int,
sizeof...(CTOs)>
const& option,
388 ParallelFor<AMREX_GPU_MAX_THREADS>(ctos, option, box, ncomp, std::forward<F>(f));
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
A Rectangular Domain on an Integer Lattice.
Definition AMReX_Box.H:43
void AnyCTO_helper1(const L &l, TypeList< PPs... >, RO const &runtime_options, const Fs &...cto_functs)
Definition AMReX_CTOParallelForImpl.H:67
bool AnyCTO_helper2(const L &l, TypeList< As... >, std::array< int, sizeof...(As)> const &runtime_options, const Fs &...cto_functs)
Definition AMReX_CTOParallelForImpl.H:47
Definition AMReX_Amr.cpp:49
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:191
void AnyCTO(TypeList< CTOs... > list_of_compile_time_options, std::array< int, sizeof...(CTOs)> const &runtime_options, L &&l, Fs &&...cto_functs)
Compile time optimization of kernels with run time options.
Definition AMReX_CTOParallelForImpl.H:179
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:127
constexpr auto CartesianProduct(Ls...)
Cartesian Product of TypeLists.
Definition AMReX_TypeList.H:150
const int[]
Definition AMReX_BLProfiler.cpp:1664
Definition AMReX_FabArrayCommI.H:896
Definition AMReX_CTOParallelForImpl.H:20
Struct for holding types.
Definition AMReX_TypeList.H:12
Definition AMReX_CTOParallelForImpl.H:28
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto operator()(Args... args) const noexcept -> decltype(f(args..., std::integral_constant< int, ctr >{}...))
Definition AMReX_CTOParallelForImpl.H:33
F f
Definition AMReX_CTOParallelForImpl.H:29
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE constexpr std::array< int, sizeof...(ctr)> GetOptions() noexcept
Definition AMReX_CTOParallelForImpl.H:40