10#ifndef TPETRA_MATRIXMATRIX_HIP_DEF_HPP
11#define TPETRA_MATRIXMATRIX_HIP_DEF_HPP
13#include "Tpetra_Details_IntRowPtrHelper.hpp"
15#ifdef HAVE_TPETRA_INST_HIP
20struct KokkosKernelsSPGEMMBackend<Tpetra::KokkosCompat::KokkosHIPWrapperNode> {
21 static std::string parameter_prefix() {
return "hip"; }
22 static std::string algorithm_label() {
return "HIP"; }
24 template <
class MatrixType>
25 static void pre_spgemm(MatrixType& Bmerged) {
26#if KOKKOSKERNELS_VERSION >= 50299
28#elif defined(KOKKOS_ENABLE_HIP) && defined(KOKKOSKERNELS_ENABLE_TPL_ROCSPARSE)
29 using device_t =
typename MatrixType::device_type;
30 if constexpr (std::is_same_v<typename device_t::execution_space, Kokkos::HIP>) {
31 if (!KokkosSparse::isCrsGraphSorted(Bmerged.graph.row_map, Bmerged.graph.entries)) {
32 Import_Util::sortCrsMatrix(Bmerged);
40 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal>
41 static void pre_spgemm(
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosHIPWrapperNode>& A) {
42#if KOKKOSKERNELS_VERSION >= 50299
44#elif defined(KOKKOS_ENABLE_HIP) && defined(KOKKOSKERNELS_ENABLE_TPL_ROCSPARSE)
58template <
class Scalar,
61 class LocalOrdinalViewType>
62struct KernelWrappers<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosHIPWrapperNode, LocalOrdinalViewType> {
63 using Node = Tpetra::KokkosCompat::KokkosHIPWrapperNode;
65 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
66 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
67 const LocalOrdinalViewType& Acol2Brow,
68 const LocalOrdinalViewType& Acol2Irow,
69 const LocalOrdinalViewType& Bcol2Ccol,
70 const LocalOrdinalViewType& Icol2Ccol,
71 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
72 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
73 const std::string& label = std::string(),
74 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
75 Tpetra::MMdetails::kokkos_kernels_mult_A_B_newmatrix(
76 Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
79 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
80 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
81 const LocalOrdinalViewType& Acol2Brow,
82 const LocalOrdinalViewType& Acol2Irow,
83 const LocalOrdinalViewType& Bcol2Ccol,
84 const LocalOrdinalViewType& Icol2Ccol,
85 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
86 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
87 const std::string& label = std::string(),
88 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
89 Tpetra::MMdetails::host_mult_A_B_reuse(
90 Aview, Bview, Acol2Brow, Acol2Irow,
91 Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
96template <
class Scalar,
98 class GlobalOrdinal,
class LocalOrdinalViewType>
99struct KernelWrappers2<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosHIPWrapperNode, LocalOrdinalViewType> {
100 using Node = Tpetra::KokkosCompat::KokkosHIPWrapperNode;
102 static inline void jacobi_A_B_newmatrix_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
103 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
104 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
105 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
106 const LocalOrdinalViewType& Acol2Brow,
107 const LocalOrdinalViewType& Acol2Irow,
108 const LocalOrdinalViewType& Bcol2Ccol,
109 const LocalOrdinalViewType& Icol2Ccol,
110 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
111 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
112 const std::string& label = std::string(),
113 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
119 std::string myalg(
"KK");
120 if (!params.is_null()) {
121 if (params->isParameter(
"hip: jacobi algorithm"))
122 myalg = params->get(
"hip: jacobi algorithm", myalg);
125 if (myalg ==
"MSAK") {
126 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
127 }
else if (myalg ==
"KK") {
128 kokkos_kernels_jacobi_A_B_newmatrix(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
130 throw std::runtime_error(
"Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel");
133 Tpetra::Details::ProfilingRegion(
"TpetraExt: Jacobi: Newmatrix HIPESFC");
136 RCP<Teuchos::ParameterList> labelList = rcp(
new Teuchos::ParameterList);
137 labelList->set(
"Timer Label", label);
138 if (!params.is_null()) labelList->set(
"compute global constants", params->get(
"compute global constants",
true));
141 if (!C.isFillComplete()) {
142 RCP<const Export<LocalOrdinal, GlobalOrdinal, Node> > dummyExport;
143 C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport, dummyExport, labelList);
147 static inline void jacobi_A_B_reuse_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
148 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
149 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
150 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
151 const LocalOrdinalViewType& Acol2Brow,
152 const LocalOrdinalViewType& Acol2Irow,
153 const LocalOrdinalViewType& Bcol2Ccol,
154 const LocalOrdinalViewType& Icol2Ccol,
155 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
156 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
157 const std::string& label = std::string(),
158 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
159 host_jacobi_A_B_reuse(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow,
160 Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
TPETRA_DETAILS_ALWAYS_INLINE local_matrix_device_type getLocalMatrixDevice() const
The local sparse matrix.
Teuchos::RCP< const crs_graph_type > getCrsGraph() const
This matrix's graph, as a CrsGraph.
Namespace Tpetra contains the class and methods constituting the Tpetra library.