10#ifndef TPETRA_MATRIXMATRIX_OPENMP_DEF_HPP
11#define TPETRA_MATRIXMATRIX_OPENMP_DEF_HPP
13#ifdef HAVE_TPETRA_INST_OPENMP
18struct KokkosKernelsSPGEMMBackend<Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> {
19 static std::string parameter_prefix() {
return "openmp"; }
20 static std::string algorithm_label() {
return "OpenMP"; }
22 template <
class MatrixType>
23 static void pre_spgemm(MatrixType& Bmerged) {
24#if KOKKOSKERNELS_VERSION >= 50299
26#elif defined(KOKKOSKERNELS_ENABLE_TPL_MKL)
27 using device_t =
typename MatrixType::device_type;
28 if constexpr (std::is_same_v<typename device_t::execution_space, Kokkos::OpenMP>) {
29 if (!KokkosSparse::isCrsGraphSorted(Bmerged.graph.row_map, Bmerged.graph.entries)) {
30 Import_Util::sortCrsMatrix(Bmerged);
38 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal>
39 static void pre_spgemm(
const Tpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& A) {
40#if KOKKOSKERNELS_VERSION >= 50299
42#elif defined(KOKKOSKERNELS_ENABLE_TPL_MKL)
56template <
class Scalar,
58 class GlobalOrdinal,
class LocalOrdinalViewType>
59struct KernelWrappers<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
60 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
61 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
62 const LocalOrdinalViewType& Acol2Brow,
63 const LocalOrdinalViewType& Acol2Irow,
64 const LocalOrdinalViewType& Bcol2Ccol,
65 const LocalOrdinalViewType& Icol2Ccol,
66 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
67 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
68 const std::string& label = std::string(),
69 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
70 std::string myalg(
"SPGEMM_DEFAULT");
72 if (!params.is_null()) {
73 if (params->isParameter(
"openmp: algorithm"))
74 myalg = params->get(
"openmp: algorithm", myalg);
79 ::Tpetra::MatrixMatrix::ExtraKernels::mult_A_B_newmatrix_LowThreadGustavsonKernel(Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
81 Tpetra::MMdetails::kokkos_kernels_mult_A_B_newmatrix(
82 Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
87 Teuchos::ArrayRCP< const size_t > Crowptr;
88 Teuchos::ArrayRCP< const LocalOrdinal > Ccolind;
89 Teuchos::ArrayRCP< const Scalar > Cvalues;
90 C.getAllValues(Crowptr,Ccolind,Cvalues);
93 int MyPID = C->getComm()->getRank();
94 printf(
"[%d] Crowptr = ",MyPID);
95 for(
size_t i=0; i<(size_t) Crowptr.size(); i++) {
96 printf(
"%3d ",(
int)Crowptr.getConst()[i]);
99 printf(
"[%d] Ccolind = ",MyPID);
100 for(
size_t i=0; i<(size_t)Ccolind.size(); i++) {
101 printf(
"%3d ",(
int)Ccolind.getConst()[i]);
110 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
111 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
112 const LocalOrdinalViewType& Acol2Brow,
113 const LocalOrdinalViewType& Acol2Irow,
114 const LocalOrdinalViewType& Bcol2Ccol,
115 const LocalOrdinalViewType& Icol2Ccol,
116 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
117 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
118 const std::string& label = std::string(),
119 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
120#ifdef HAVE_TPETRA_MMM_TIMINGS
121 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
122 using Teuchos::TimeMonitor;
123 Teuchos::RCP<TimeMonitor> MM;
130 int team_work_size = 16;
131 std::string myalg(
"LTG");
132 if (!params.is_null()) {
133 if (params->isParameter(
"openmp: algorithm"))
134 myalg = params->get(
"openmp: algorithm", myalg);
135 if (params->isParameter(
"openmp: team work size"))
136 team_work_size = params->get(
"openmp: team work size", team_work_size);
139 if (myalg ==
"LTG") {
141 ::Tpetra::MatrixMatrix::ExtraKernels::mult_A_B_reuse_LowThreadGustavsonKernel(Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
143 throw std::runtime_error(
"Tpetra::MatrixMatrix::MMM reuse unknown kernel");
146#ifdef HAVE_TPETRA_MMM_TIMINGS
148 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"MMM Reuse OpenMPESFC"))));
150 C.fillComplete(C.getDomainMap(), C.getRangeMap());
155template <
class Scalar,
157 class GlobalOrdinal,
class LocalOrdinalViewType>
158struct KernelWrappers2<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
159 static inline void jacobi_A_B_newmatrix_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
160 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Dinv,
161 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
162 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
163 const LocalOrdinalViewType& Acol2Brow,
164 const LocalOrdinalViewType& Acol2Irow,
165 const LocalOrdinalViewType& Bcol2Ccol,
166 const LocalOrdinalViewType& Icol2Ccol,
167 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
168 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
169 const std::string& label = std::string(),
170 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
171#ifdef HAVE_TPETRA_MMM_TIMINGS
172 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
173 using Teuchos::TimeMonitor;
174 Teuchos::RCP<TimeMonitor> MM;
181 int team_work_size = 16;
182 std::string myalg(
"LTG");
183 if (!params.is_null()) {
184 if (params->isParameter(
"openmp: jacobi algorithm"))
185 myalg = params->get(
"openmp: jacobi algorithm", myalg);
186 if (params->isParameter(
"openmp: team work size"))
187 team_work_size = params->get(
"openmp: team work size", team_work_size);
190 if (myalg ==
"LTG") {
192 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_LowThreadGustavsonKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
193 }
else if (myalg ==
"MSAK") {
194 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
195 }
else if (myalg ==
"KK") {
196 kokkos_kernels_jacobi_A_B_newmatrix(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
198 throw std::runtime_error(
"Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel");
201#ifdef HAVE_TPETRA_MMM_TIMINGS
203 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"Jacobi Newmatrix OpenMPESFC"))));
207 RCP<Teuchos::ParameterList> labelList = rcp(
new Teuchos::ParameterList);
208 labelList->set(
"Timer Label", label);
209 if (!params.is_null()) labelList->set(
"compute global constants", params->get(
"compute global constants",
true));
212 if (!C.isFillComplete()) {
213 RCP<const Export<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > dummyExport;
214 C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport, dummyExport, labelList);
218 static inline void jacobi_A_B_reuse_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
219 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Dinv,
220 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
221 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
222 const LocalOrdinalViewType& Acol2Brow,
223 const LocalOrdinalViewType& Acol2Irow,
224 const LocalOrdinalViewType& Bcol2Ccol,
225 const LocalOrdinalViewType& Icol2Ccol,
226 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
227 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
228 const std::string& label = std::string(),
229 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
230#ifdef HAVE_TPETRA_MMM_TIMINGS
231 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
232 using Teuchos::TimeMonitor;
233 Teuchos::RCP<TimeMonitor> MM;
240 int team_work_size = 16;
241 std::string myalg(
"LTG");
242 if (!params.is_null()) {
243 if (params->isParameter(
"openmp: jacobi algorithm"))
244 myalg = params->get(
"openmp: jacobi algorithm", myalg);
245 if (params->isParameter(
"openmp: team work size"))
246 team_work_size = params->get(
"openmp: team work size", team_work_size);
249 if (myalg ==
"LTG") {
251 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_reuse_LowThreadGustavsonKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
253 throw std::runtime_error(
"Tpetra::MatrixMatrix::Jacobi reuse unknown kernel");
256#ifdef HAVE_TPETRA_MMM_TIMINGS
258 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"Jacobi Reuse OpenMPESFC"))));
260 C.fillComplete(C.getDomainMap(), C.getRangeMap());
265template <
class Scalar,
267 class GlobalOrdinal,
class LocalOrdinalViewType>
268struct KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
269 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
270 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
271 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
272 const LocalOrdinalViewType& Acol2Prow,
273 const LocalOrdinalViewType& Acol2PIrow,
274 const LocalOrdinalViewType& Pcol2Ccol,
275 const LocalOrdinalViewType& PIcol2Ccol,
276 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
277 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
278 const std::string& label = std::string(),
279 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
281 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
282 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
283 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
284 const LocalOrdinalViewType& Acol2Prow,
285 const LocalOrdinalViewType& Acol2PIrow,
286 const LocalOrdinalViewType& Pcol2Ccol,
287 const LocalOrdinalViewType& PIcol2Ccol,
288 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
289 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
290 const std::string& label = std::string(),
291 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
293 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
294 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
295 const LocalOrdinalViewType& Acol2Prow,
296 const LocalOrdinalViewType& Acol2PIrow,
297 const LocalOrdinalViewType& Pcol2Ccol,
298 const LocalOrdinalViewType& PIcol2Ccol,
299 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
300 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
301 const std::string& label = std::string(),
302 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
304 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
305 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
306 const LocalOrdinalViewType& Acol2Prow,
307 const LocalOrdinalViewType& Acol2PIrow,
308 const LocalOrdinalViewType& Pcol2Ccol,
309 const LocalOrdinalViewType& PIcol2Ccol,
310 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
311 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
312 const std::string& label = std::string(),
313 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
317template <
class Scalar,
320 class LocalOrdinalViewType>
321void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
322 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
323 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
324 const LocalOrdinalViewType& Acol2Prow,
325 const LocalOrdinalViewType& Acol2PIrow,
326 const LocalOrdinalViewType& Pcol2Accol,
327 const LocalOrdinalViewType& PIcol2Accol,
328 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
329 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
330 const std::string& label,
331 const Teuchos::RCP<Teuchos::ParameterList>& params) {
332#ifdef HAVE_TPETRA_MMM_TIMINGS
333 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
334 using Teuchos::TimeMonitor;
335 Teuchos::RCP<TimeMonitor> MM;
339 std::string nodename(
"OpenMP");
342 std::string myalg(
"LTG");
344 if (!params.is_null()) {
345 if (params->isParameter(
"openmp: rap algorithm"))
346 myalg = params->get(
"openmp: rap algorithm", myalg);
349 if (myalg ==
"LTG") {
351 ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_newmatrix_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol, PIcol2Accol, Ac, Acimport, label, params);
353 throw std::runtime_error(
"Tpetra::MatrixMatrix::R_A_P newmatrix unknown kernel");
358template <
class Scalar,
361 class LocalOrdinalViewType>
362void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_R_A_P_reuse_kernel_wrapper(
363 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
364 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
365 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
367 const LocalOrdinalViewType& Acol2Prow,
368 const LocalOrdinalViewType& Acol2Irow,
369 const LocalOrdinalViewType& Pcol2Ccol,
370 const LocalOrdinalViewType& Icol2Ccol,
371 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
372 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
373 const std::string& label,
374 const Teuchos::RCP<Teuchos::ParameterList>& params) {
375#ifdef HAVE_TPETRA_MMM_TIMINGS
376 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
377 using Teuchos::TimeMonitor;
378 Teuchos::RCP<TimeMonitor> MM;
385 std::string myalg(
"LTG");
386 if (!params.is_null()) {
387 if (params->isParameter(
"openmp: rap algorithm"))
388 myalg = params->get(
"openmp: rap algorithm", myalg);
391 if (myalg ==
"LTG") {
393 ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_reuse_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2Irow, Pcol2Ccol, Icol2Ccol, C, Cimport, label, params);
395 throw std::runtime_error(
"Tpetra::MatrixMatrix::R_A_P newmatrix unknown kernel");
398#ifdef HAVE_TPETRA_MMM_TIMINGS
400 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"RAP Reuse OpenMPESFC"))));
402 C.fillComplete(C.getDomainMap(), C.getRangeMap());
406template <
class Scalar,
409 class LocalOrdinalViewType>
410void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
412 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
413 const LocalOrdinalViewType& Acol2Prow,
414 const LocalOrdinalViewType& Acol2PIrow,
415 const LocalOrdinalViewType& Pcol2Accol,
416 const LocalOrdinalViewType& PIcol2Accol,
417 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
418 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
419 const std::string& label,
420 const Teuchos::RCP<Teuchos::ParameterList>& params) {
421#ifdef HAVE_TPETRA_MMM_TIMINGS
422 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
423 using Teuchos::TimeMonitor;
424 Teuchos::RCP<TimeMonitor> MM;
428 std::string nodename(
"OpenMP");
431 std::string myalg(
"LTG");
433 if (!params.is_null()) {
434 if (params->isParameter(
"openmp: ptap algorithm"))
435 myalg = params->get(
"openmp: ptap algorithm", myalg);
438 if (myalg ==
"LTG") {
439#ifdef HAVE_TPETRA_MMM_TIMINGS
441 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"PTAP local transpose"))));
444 using Teuchos::ParameterList;
446 using LO = LocalOrdinal;
447 using GO = GlobalOrdinal;
451 using transposer_type =
452 RowMatrixTransposer<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>;
453 transposer_type transposer(Pview.origMatrix, label +
"XP: ");
454 RCP<ParameterList> transposeParams(
new ParameterList);
455 if (!params.is_null()) {
456 transposeParams->set(
"compute global constants",
457 params->get(
"compute global constants: temporaries",
460 transposeParams->set(
"sort",
false);
461 RCP<CrsMatrix<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Ptrans =
462 transposer.createTransposeLocal(transposeParams);
463 CrsMatrixStruct<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> Rview;
464 Rview.origMatrix = Ptrans;
466 using ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_newmatrix_LowThreadGustavsonKernel;
467 mult_R_A_P_newmatrix_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol,
468 PIcol2Accol, Ac, Acimport, label, params);
470 throw std::runtime_error(
"Tpetra::MatrixMatrix::PT_A_P newmatrix unknown kernel");
475template <
class Scalar,
478 class LocalOrdinalViewType>
479void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
481 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
482 const LocalOrdinalViewType& Acol2Prow,
483 const LocalOrdinalViewType& Acol2PIrow,
484 const LocalOrdinalViewType& Pcol2Accol,
485 const LocalOrdinalViewType& PIcol2Accol,
486 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
487 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
488 const std::string& label,
489 const Teuchos::RCP<Teuchos::ParameterList>& params) {
490#ifdef HAVE_TPETRA_MMM_TIMINGS
491 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
492 using Teuchos::TimeMonitor;
493 Teuchos::RCP<TimeMonitor> MM;
497 std::string nodename(
"OpenMP");
500 std::string myalg(
"LTG");
502 if (!params.is_null()) {
503 if (params->isParameter(
"openmp: ptap algorithm"))
504 myalg = params->get(
"openmp: ptap algorithm", myalg);
507 if (myalg ==
"LTG") {
508#ifdef HAVE_TPETRA_MMM_TIMINGS
510 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"PTAP local transpose"))));
513 using Teuchos::ParameterList;
515 using LO = LocalOrdinal;
516 using GO = GlobalOrdinal;
520 using transposer_type =
521 RowMatrixTransposer<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>;
522 transposer_type transposer(Pview.origMatrix, label +
"XP: ");
523 RCP<ParameterList> transposeParams(
new ParameterList);
524 if (!params.is_null()) {
525 transposeParams->set(
"compute global constants",
526 params->get(
"compute global constants: temporaries",
529 transposeParams->set(
"sort",
false);
530 RCP<CrsMatrix<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Ptrans =
531 transposer.createTransposeLocal(transposeParams);
532 CrsMatrixStruct<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> Rview;
533 Rview.origMatrix = Ptrans;
535 using ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_reuse_LowThreadGustavsonKernel;
536 mult_R_A_P_reuse_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol,
537 PIcol2Accol, Ac, Acimport, label, params);
539 throw std::runtime_error(
"Tpetra::MatrixMatrix::PT_A_P reuse unknown kernel");
541 Ac.fillComplete(Ac.getDomainMap(), Ac.getRangeMap());
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.