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