52 #ifndef AMESOS2_KOKKOS_IMPL_HPP
53 #define AMESOS2_KOKKOS_IMPL_HPP
55 #include <type_traits>
57 #include <Kokkos_Core.hpp>
58 #include <KokkosSparse_CrsMatrix.hpp>
59 #include <Tpetra_KokkosCompat_ClassicNodeAPI_Wrapper.hpp>
61 #define AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(S,LO,NODE_TYPE) \
62 template class Amesos2::AMESOS2_KOKKOS_IMPL_SOLVER_NAME<KokkosSparse::CrsMatrix<S, LO, \
63 typename NODE_TYPE::device_type>, \
64 Kokkos::View<S**, Kokkos::LayoutLeft, typename NODE_TYPE::device_type> >;
66 #ifdef KOKKOS_ENABLE_CUDA_UVM
67 #define AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(S,LO) \
68 template class Amesos2::AMESOS2_KOKKOS_IMPL_SOLVER_NAME<KokkosSparse::CrsMatrix<S, LO, \
69 Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>>, \
70 Kokkos::View<S**, Kokkos::LayoutLeft, Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>> >;
72 #define AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(S,LO)
75 #if defined(KOKKOS_ENABLE_SERIAL)
76 #ifdef HAVE_TPETRA_INST_FLOAT
77 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
79 #ifdef HAVE_TPETRA_INST_DOUBLE
80 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
82 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
83 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
85 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
86 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
90 #if defined(KOKKOS_ENABLE_THREADS)
91 #ifdef HAVE_TPETRA_INST_FLOAT
92 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
94 #ifdef HAVE_TPETRA_INST_DOUBLE
95 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
97 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
98 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
100 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
101 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
103 #endif // KOKKOS_ENABLE_THREADS
105 #if defined(KOKKOS_ENABLE_OPENMP)
106 #ifdef HAVE_TPETRA_INST_FLOAT
107 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
109 #ifdef HAVE_TPETRA_INST_DOUBLE
110 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
112 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
113 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
115 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
116 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
118 #endif // KOKKOS_ENABLE_OPENMP
120 #if defined(KOKKOS_ENABLE_CUDA)
121 #ifdef HAVE_TPETRA_INST_FLOAT
122 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosCudaWrapperNode)
123 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(
float,
int)
125 #ifdef HAVE_TPETRA_INST_DOUBLE
126 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosCudaWrapperNode)
127 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(
double,
int)
129 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
130 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosCudaWrapperNode)
131 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(Kokkos::complex<
float>,
int)
133 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
134 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosCudaWrapperNode)
135 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(Kokkos::complex<
double>,
int)
137 #endif // KOKKOS_ENABLE_CUDA
139 #if defined(KOKKOS_ENABLE_HIP)
140 #ifdef HAVE_TPETRA_INST_FLOAT
141 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
143 #ifdef HAVE_TPETRA_INST_DOUBLE
144 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
146 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
147 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
149 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
150 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
152 #endif // KOKKOS_ENABLE_HIP
154 #if defined(KOKKOS_ENABLE_SYCL)
155 #ifdef HAVE_TPETRA_INST_FLOAT
156 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
float,
int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
158 #ifdef HAVE_TPETRA_INST_DOUBLE
159 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(
double,
int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
161 #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
162 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>,
int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
164 #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
165 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>,
int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
167 #endif // KOKKOS_ENABLE_SYCL
169 #endif // AMESOS2_KOKKOS_IMPL_HPP
Amesos2::MultiVecAdapter specialization for the Kokkos::View class.