Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
TpetraExt_MatrixMatrix_SYCL.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_SYCL_DEF_HPP
11#define TPETRA_MATRIXMATRIX_SYCL_DEF_HPP
12
13#include "Tpetra_Details_IntRowPtrHelper.hpp"
14
15#ifdef HAVE_TPETRA_INST_SYCL
16namespace Tpetra {
17namespace MMdetails {
18
19template <>
20struct KokkosKernelsSPGEMMBackend<Tpetra::KokkosCompat::KokkosSYCLWrapperNode> {
21 static std::string parameter_prefix() { return "sycl"; }
22 static std::string algorithm_label() { return "SYCL"; }
23
24 template <class MatrixType>
25 static void pre_spgemm(MatrixType&) {}
26};
27
28/*********************************************************************************************************/
29// MMM KernelWrappers for Partial Specialization to SYCL
30template <class Scalar,
31 class LocalOrdinal,
32 class GlobalOrdinal,
33 class LocalOrdinalViewType>
34struct KernelWrappers<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosSYCLWrapperNode, LocalOrdinalViewType> {
35 using Node = Tpetra::KokkosCompat::KokkosSYCLWrapperNode;
36 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
37 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
38 const LocalOrdinalViewType& Acol2Brow,
39 const LocalOrdinalViewType& Acol2Irow,
40 const LocalOrdinalViewType& Bcol2Ccol,
41 const LocalOrdinalViewType& Icol2Ccol,
42 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
43 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
44 const std::string& label = std::string(),
45 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
46 Tpetra::MMdetails::kokkos_kernels_mult_A_B_newmatrix(
47 Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
48 }
49
50 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
51 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
52 const LocalOrdinalViewType& Acol2Brow,
53 const LocalOrdinalViewType& Acol2Irow,
54 const LocalOrdinalViewType& Bcol2Ccol,
55 const LocalOrdinalViewType& Icol2Ccol,
56 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
57 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
58 const std::string& label = std::string(),
59 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
60 Tpetra::MMdetails::host_mult_A_B_reuse(
61 Aview, Bview, Acol2Brow, Acol2Irow,
62 Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
63 }
64};
65
66// Jacobi KernelWrappers for Partial Specialization to SYCL
67template <class Scalar,
68 class LocalOrdinal,
69 class GlobalOrdinal, class LocalOrdinalViewType>
70struct KernelWrappers2<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosSYCLWrapperNode, LocalOrdinalViewType> {
71 using Node = Tpetra::KokkosCompat::KokkosSYCLWrapperNode;
72 static inline void jacobi_A_B_newmatrix_kernel_wrapper(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
73 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
74 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
75 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
76 const LocalOrdinalViewType& Acol2Brow,
77 const LocalOrdinalViewType& Acol2Irow,
78 const LocalOrdinalViewType& Bcol2Ccol,
79 const LocalOrdinalViewType& Icol2Ccol,
80 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
81 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
82 const std::string& label = std::string(),
83 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
84#ifdef HAVE_TPETRA_MMM_TIMINGS
85 std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": ");
86 using Teuchos::TimeMonitor;
87 Teuchos::RCP<TimeMonitor> MM;
88#endif
89
90 // Node-specific code
91 using Teuchos::RCP;
92
93 // Options
94 // int team_work_size = 16; // Defaults to 16 as per Deveci 12/7/16 - csiefer // unreferenced
95 std::string myalg("KK");
96 if (!params.is_null()) {
97 if (params->isParameter("sycl: jacobi algorithm"))
98 myalg = params->get("sycl: jacobi algorithm", myalg);
99 }
100
101 if (myalg == "MSAK") {
102 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
103 } else if (myalg == "KK") {
104 kokkos_kernels_jacobi_A_B_newmatrix(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
105 } else {
106 throw std::runtime_error("Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel");
107 }
108
109#ifdef HAVE_TPETRA_MMM_TIMINGS
110 MM = Teuchos::null;
111 MM = rcp(new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Newmatrix SYCLESFC"))));
112#endif
113
114 // Final Fillcomplete
115 RCP<Teuchos::ParameterList> labelList = rcp(new Teuchos::ParameterList);
116 labelList->set("Timer Label", label);
117 if (!params.is_null()) labelList->set("compute global constants", params->get("compute global constants", true));
118
119 // NOTE: MSAK already fillCompletes, so we have to check here
120 if (!C.isFillComplete()) {
121 RCP<const Export<LocalOrdinal, GlobalOrdinal, Node> > dummyExport;
122 C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport, dummyExport, labelList);
123 }
124 }
125
126 static inline void jacobi_A_B_reuse_kernel_wrapper(typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
127 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Dinv,
128 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Aview,
129 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Bview,
130 const LocalOrdinalViewType& Acol2Brow,
131 const LocalOrdinalViewType& Acol2Irow,
132 const LocalOrdinalViewType& Bcol2Ccol,
133 const LocalOrdinalViewType& Icol2Ccol,
134 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& C,
135 Teuchos::RCP<const Import<LocalOrdinal, GlobalOrdinal, Node> > Cimport,
136 const std::string& label = std::string(),
137 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
138 host_jacobi_A_B_reuse(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow,
139 Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
140 }
141};
142
143} // namespace MMdetails
144} // namespace Tpetra
145
146#endif // SYCL
147
148#endif
Namespace Tpetra contains the class and methods constituting the Tpetra library.