Amesos2 - Direct Sparse Solver Interfaces Version of the Day
Amesos2_Kokkos_Impl.hpp
Go to the documentation of this file.
1// @HEADER
2//
3// ***********************************************************************
4//
5// Amesos2: Templated Direct Sparse Solver Package
6// Copyright 2011 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ***********************************************************************
41//
42// @HEADER
43
51
52#ifndef AMESOS2_KOKKOS_IMPL_HPP
53#define AMESOS2_KOKKOS_IMPL_HPP
54
55#include <type_traits>
57#include <Kokkos_Core.hpp>
58#include <KokkosSparse_CrsMatrix.hpp>
59#include <Tpetra_KokkosCompat_ClassicNodeAPI_Wrapper.hpp>
60
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> >;
65
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>> >;
71#else
72#define AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER_UVM_OFF(S,LO)
73#endif
74
75#if defined(KOKKOS_ENABLE_SERIAL)
76#ifdef HAVE_TPETRA_INST_FLOAT
77 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(float, int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
78#endif
79#ifdef HAVE_TPETRA_INST_DOUBLE
80 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(double, int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
81#endif
82#ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
83 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>, int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
84#endif
85#ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
86 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>, int, Tpetra::KokkosCompat::KokkosSerialWrapperNode)
87#endif
88#endif
89
90#if defined(KOKKOS_ENABLE_THREADS)
91#ifdef HAVE_TPETRA_INST_FLOAT
92 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(float, int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
93#endif
94#ifdef HAVE_TPETRA_INST_DOUBLE
95 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(double, int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
96#endif
97#ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
98 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>, int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
99#endif
100#ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
101 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>, int, Tpetra::KokkosCompat::KokkosKokkosThreadsWrapperNode)
102#endif
103#endif // KOKKOS_ENABLE_THREADS
104
105#if defined(KOKKOS_ENABLE_OPENMP)
106#ifdef HAVE_TPETRA_INST_FLOAT
107 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(float, int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
108#endif
109#ifdef HAVE_TPETRA_INST_DOUBLE
110 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(double, int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
111#endif
112#ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
113 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>, int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
114#endif
115#ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
116 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>, int, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode)
117#endif
118#endif // KOKKOS_ENABLE_OPENMP
119
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)
124#endif
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)
128#endif
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)
132#endif
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)
136#endif
137#endif // KOKKOS_ENABLE_CUDA
138
139#if defined(KOKKOS_ENABLE_HIP)
140#ifdef HAVE_TPETRA_INST_FLOAT
141 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(float, int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
142#endif
143#ifdef HAVE_TPETRA_INST_DOUBLE
144 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(double, int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
145#endif
146#ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
147 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>, int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
148#endif
149#ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
150 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>, int, Tpetra::KokkosCompat::KokkosHIPWrapperNode)
151#endif
152#endif // KOKKOS_ENABLE_HIP
153
154#if defined(KOKKOS_ENABLE_SYCL)
155#ifdef HAVE_TPETRA_INST_FLOAT
156 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(float, int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
157#endif
158#ifdef HAVE_TPETRA_INST_DOUBLE
159 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(double, int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
160#endif
161#ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT
162 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<float>, int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
163#endif
164#ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE
165 AMESOS2_KOKKOS_LOCAL_INSTANT_KOKKOS_ADAPTER(Kokkos::complex<double>, int, Tpetra::KokkosCompat::KokkosSYCLWrapperNode)
166#endif
167#endif // KOKKOS_ENABLE_SYCL
168
169#endif // AMESOS2_KOKKOS_IMPL_HPP
Amesos2::MultiVecAdapter specialization for the Kokkos::View class.