Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
TpetraExt_MatrixMatrix_Cuda.hpp
1// @HEADER
2// *****************************************************************************
3// Tpetra: Templated Linear Algebra Services Package
4//
5// Copyright 2008 NTESS and the Tpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TPETRA_MATRIXMATRIX_CUDA_DEF_HPP
11#define TPETRA_MATRIXMATRIX_CUDA_DEF_HPP
12
13#include "Tpetra_Details_IntRowPtrHelper.hpp"
14
15#ifdef HAVE_TPETRA_INST_CUDA
16namespace Tpetra {
17namespace MMdetails {
18
19template <>
20struct KokkosKernelsSPGEMMBackend<Tpetra::KokkosCompat::KokkosCudaWrapperNode> {
21 static std::string parameter_prefix() { return "cuda"; }
22 static std::string algorithm_label() { return "Cuda"; }
23
24 template <class MatrixType>
25 static void pre_spgemm(MatrixType& Bmerged) {
26#if KOKKOSKERNELS_VERSION >= 50299
27 (void)Bmerged;
28#elif defined(KOKKOS_ENABLE_CUDA) && defined(KOKKOSKERNELS_ENABLE_TPL_CUSPARSE) && ((CUDA_VERSION < 11000) || (CUDA_VERSION >= 11040))
29 using device_t = typename MatrixType::device_type;
30 if constexpr (std::is_same_v<typename device_t::execution_space, Kokkos::Cuda>) {
31 if (!KokkosSparse::isCrsGraphSorted(Bmerged.graph.row_map, Bmerged.graph.entries)) {
32 Import_Util::sortCrsMatrix(Bmerged);
33 }
34 }
35#else
36 (void)Bmerged;
37#endif
38 }
39
40 template <class Scalar, class LocalOrdinal, class GlobalOrdinal>
41 static void pre_spgemm(const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosCudaWrapperNode>& A) {
42#if KOKKOSKERNELS_VERSION >= 50299
43 (void)A;
44#elif defined(KOKKOS_ENABLE_CUDA) && defined(KOKKOSKERNELS_ENABLE_TPL_CUSPARSE) && ((CUDA_VERSION < 11000) || (CUDA_VERSION >= 11040))
45 if (A.getCrsGraph()->isSorted()) {
46 return;
47 }
48 auto localA = A.getLocalMatrixDevice();
49 pre_spgemm(localA);
50#else
51 (void)A;
52#endif
53 }
54};
55
56/*********************************************************************************************************/
57// MMM KernelWrappers for Partial Specialization to CUDA
58template <class Scalar,
59 class LocalOrdinal,
60 class GlobalOrdinal,
61 class LocalOrdinalViewType>
62struct KernelWrappers<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosCudaWrapperNode, LocalOrdinalViewType> {
63 using Node = Tpetra::KokkosCompat::KokkosCudaWrapperNode;
64
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);
77 }
78
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);
92 }
93};
94
95// Jacobi KernelWrappers for Partial Specialization to Cuda
96template <class Scalar,
97 class LocalOrdinal,
98 class GlobalOrdinal, class LocalOrdinalViewType>
99struct KernelWrappers2<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosCudaWrapperNode, LocalOrdinalViewType> {
100 using Node = Tpetra::KokkosCompat::KokkosCudaWrapperNode;
101
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) {
114 // Node-specific code
115 using Teuchos::RCP;
116 using Teuchos::rcp;
117 RCP<Tpetra::Details::ProfilingRegion> MM = rcp(new Tpetra::Details::ProfilingRegion("TpetraExt: MMM: Jacobi CudaWrapper"));
118
119 // Options
120 // int team_work_size = 16; // Defaults to 16 as per Deveci 12/7/16 - csiefer // unreferenced
121 std::string myalg("KK");
122 if (!params.is_null()) {
123 if (params->isParameter("cuda: jacobi algorithm"))
124 myalg = params->get("cuda: jacobi algorithm", myalg);
125 }
126
127 if (myalg == "MSAK") {
128 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
129 } else if (myalg == "KK") {
130 kokkos_kernels_jacobi_A_B_newmatrix(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
131 } else {
132 throw std::runtime_error("Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel");
133 }
134
135 MM = Teuchos::null;
136 MM = rcp(new Tpetra::Details::ProfilingRegion("TpetraExt: Jacobi: Newmatrix CudaESFC"));
137
138 // Final Fillcomplete
139 RCP<Teuchos::ParameterList> labelList = rcp(new Teuchos::ParameterList);
140 labelList->set("Timer Label", label);
141 if (!params.is_null()) labelList->set("compute global constants", params->get("compute global constants", true));
142
143 // NOTE: MSAK already fillCompletes, so we have to check here
144 if (!C.isFillComplete()) {
145 RCP<const Export<LocalOrdinal, GlobalOrdinal, Node> > dummyExport;
146 C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport, dummyExport, labelList);
147 }
148 }
149
150 static inline void jacobi_A_B_reuse_kernel_wrapper(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
151 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
152 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
153 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
154 const LocalOrdinalViewType& Acol2Brow,
155 const LocalOrdinalViewType& Acol2Irow,
156 const LocalOrdinalViewType& Bcol2Ccol,
157 const LocalOrdinalViewType& Icol2Ccol,
158 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
159 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
160 const std::string& label = std::string(),
161 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
162 host_jacobi_A_B_reuse(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
163 }
164};
165
166} // namespace MMdetails
167} // namespace Tpetra
168
169#endif // CUDA
170
171#endif
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.