6#ifndef IPPL_TYPE_UTILS_H
7#define IPPL_TYPE_UTILS_H
9#include <Kokkos_Core.hpp>
11#include "Types/Variant.h"
13#include "Utility/IpplException.h"
24 template <
typename Check,
typename... Collection>
26 constexpr static bool enable = !std::disjunction_v<std::is_same<Check, Collection>...>;
38 template <
template <
typename>
class Wrapper>
40 template <
typename Check,
typename... Collection>
42 typedef Wrapper<Check> type;
43 constexpr static bool enable =
44 !std::disjunction_v<std::is_same<type, Collection>...>;
55 template <
bool B,
typename T>
56 using ConditionalType = std::conditional_t<B, T, void>;
65 template <
typename Type,
typename...>
67 constexpr static bool enable = !std::is_void_v<Type>;
74 template <
typename,
typename,
template <
typename...>
class Verifier =
IsUnique>
80 template <
template <
typename...>
class Verifier>
82 typedef std::variant<> type;
89 template <
typename... T,
template <
typename...>
class Verifier>
91 typedef std::variant<T...> type;
119 template <
typename Next,
typename... ToAdd,
typename... Added,
120 template <
typename...>
class Verifier>
123 template <
bool B,
class T,
class F>
124 using cond = std::conditional_t<B, T, F>;
125 template <
typename... T>
126 using variant = std::variant<T...>;
128 using Check = Verifier<Next, Added...>;
134 variant<
typename Check::type, Added...>, Verifier>::type,
136 typename ConstructVariant<variant<ToAdd...>, variant<Added...>, Verifier>::type>
145 template <
typename... Types>
146 using VariantFromConditionalTypes =
153 template <
typename... Types>
154 using VariantFromUniqueTypes =
166 template <
template <
typename...>
class Verifier,
typename... Types>
167 using VariantWithVerifier =
168 typename ConstructVariant<std::variant<Types...>, std::variant<>, Verifier>::type;
176 template <
template <
typename...>
class Type,
typename Pack>
182 template <
template <
typename...>
class Type,
typename... Spaces>
183 struct Forward<Type, std::variant<Spaces...>> {
184 using type = Type<Spaces...>;
190 template <
template <
typename...>
class Type,
typename T,
typename... Properties>
191 struct Forward<Type, Kokkos::View<T, Properties...>> {
192 using type = Type<Properties...>;
202 template <
template <
typename...>
class Type,
typename View>
204 using view_type =
typename View::uniform_type;
211 template <
template <
typename...>
class Type>
213 using unique_memory_spaces = VariantFromUniqueTypes<
214 Kokkos::HostSpace, Kokkos::SharedSpace, Kokkos::SharedHostPinnedSpace
215#ifdef KOKKOS_ENABLE_CUDA
217 Kokkos::CudaSpace, Kokkos::CudaHostPinnedSpace, Kokkos::CudaUVMSpace
219#ifdef KOKKOS_ENABLE_HIP
221 Kokkos::HIPSpace, Kokkos::HIPHostPinnedSpace, Kokkos::HIPManagedSpace
223#ifdef KOKKOS_ENABLE_SYCL
225 Kokkos::Experimental::SYCLDeviceUSMSpace, Kokkos::Experimental::SYCLHostUSMSpace,
226 Kokkos::Experimental::SYCLSharedUSMSpace
230 using unique_exec_spaces = VariantFromUniqueTypes<Kokkos::DefaultExecutionSpace
231#ifdef KOKKOS_ENABLE_OPENMP
235#ifdef KOKKOS_ENABLE_OPENMPTARGET
239#ifdef KOKKOS_ENABLE_THREADS
243#ifdef KOKKOS_ENABLE_SERIAL
247#ifdef KOKKOS_ENABLE_CUDA
251#ifdef KOKKOS_ENABLE_HIP
255#ifdef KOKKOS_ENABLE_SYCL
257 Kokkos::Experimental::SYCL
259#ifdef KOKKOS_ENABLE_HPX
275 template <
template <
typename>
class Type,
typename... Spaces>
277 template <
typename T,
typename... Ts>
280 using Types = VariantWithVerifier<Verifier, Spaces...>;
282 std::array<Types,
sizeof...(Spaces)> elements_m;
289 template <
typename Space,
unsigned Idx = 0>
290 constexpr static unsigned spaceToIndex() {
291 static_assert(Idx <
sizeof...(Spaces));
292 if constexpr (std::is_same_v<Space,
293 std::tuple_element_t<Idx, std::tuple<Spaces...>>>) {
296 return spaceToIndex<Space, Idx + 1>();
300 throw IpplException(
"detail::MultispaceContainer::spaceToIndex",
301 "Unreachable state");
307 template <
typename Space>
308 void initElements() {
309 elements_m[spaceToIndex<Space>()] = Type<Space>{};
316 template <
typename MemorySpace,
typename Filter,
317 std::enable_if_t<std::is_null_pointer_v<std::decay_t<Filter>>,
int> = 0>
318 constexpr bool copyToSpace(Filter&&) {
322 template <
typename MemorySpace,
typename Filter,
323 std::enable_if_t<!std::is_null_pointer_v<std::decay_t<Filter>>,
int> = 0>
324 bool copyToSpace(Filter&& predicate) {
325 return predicate.template operator()<MemorySpace>();
341 template <
typename DataType,
typename Filter = std::
nullptr_t>
344 using space =
typename DataType::memory_space;
345 static_assert(std::is_same_v<DataType, Type<space>>);
347 elements_m[spaceToIndex<space>()] = data;
348 copyToOtherSpaces<space>(predicate);
358 template <
typename Space,
typename Filter = std::
nullptr_t>
360 forAll([&]<
typename DataType>(DataType& dst) {
361 using memory_space =
typename DataType::memory_space;
362 if constexpr (!std::is_same_v<Space, memory_space>) {
363 if (copyToSpace<memory_space>(predicate)) {
364 dst = Kokkos::create_mirror_view_and_copy(
365 Kokkos::view_alloc(memory_space{}, Kokkos::WithoutInitializing),
377 template <
typename Space>
378 const Type<Space>&
get()
const {
379 return std::get<Type<Space>>(elements_m[spaceToIndex<Space>()]);
382 template <
typename Space>
384 return std::get<Type<Space>>(elements_m[spaceToIndex<Space>()]);
392 template <
typename Functor>
394 (f(get<Spaces>()), ...);
397 template <
typename Functor>
398 void forAll(Functor&& f) {
399 (f(get<Spaces>()), ...);
407 template <
template <
typename>
class Type>
409 template <
typename... Spaces>
412 using type =
typename TypeForAllSpaces<container_type>::memory_spaces_type;
415 template <
typename Functor>
416 static type createContainer(Functor&& initFunc) {
417 return type{std::forward<Functor>(initFunc)};
427 template <
typename Functor>
428 void runForAllSpaces(Functor&& f) {
429 using all_spaces =
typename TypeForAllSpaces<std::variant>::memory_spaces_type;
430 auto runner = [&]<
typename... Spaces>(
const std::variant<Spaces...>&) {
431 (f.template operator()<Spaces>(), ...);
433 runner(all_spaces{});
Definition IpplException.h:6
Definition TypeUtils.h:276
MultispaceContainer(const DataType &data, Filter &&predicate=nullptr)
Definition TypeUtils.h:342
void forAll(Functor &&f) const
Definition TypeUtils.h:393
const Type< Space > & get() const
Definition TypeUtils.h:378
void copyToOtherSpaces(Filter &&predicate=nullptr)
Definition TypeUtils.h:359
Definition TypeUtils.h:75
Definition TypeUtils.h:408
Definition TypeUtils.h:177
Definition TypeUtils.h:66
Definition TypeUtils.h:25
Definition TypeUtils.h:212
Definition TypeUtils.h:41
Definition TypeUtils.h:39