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&) {}
28template <
class Scalar,
30 class GlobalOrdinal,
class LocalOrdinalViewType>
31struct KernelWrappers<Scalar, LocalOrdinal, GlobalOrdinal,
Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
32 static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
33 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
34 const LocalOrdinalViewType& Acol2Brow,
35 const LocalOrdinalViewType& Acol2Irow,
36 const LocalOrdinalViewType& Bcol2Ccol,
37 const LocalOrdinalViewType& Icol2Ccol,
38 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
39 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
40 const std::string& label = std::string(),
41 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
42 std::string myalg(
"SPGEMM_DEFAULT");
44 if (!params.is_null()) {
45 if (params->isParameter(
"openmp: algorithm"))
46 myalg = params->get(
"openmp: algorithm", myalg);
51 ::Tpetra::MatrixMatrix::ExtraKernels::mult_A_B_newmatrix_LowThreadGustavsonKernel(Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
53 Tpetra::MMdetails::kokkos_kernels_mult_A_B_newmatrix(
54 Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
59 Teuchos::ArrayRCP< const size_t > Crowptr;
60 Teuchos::ArrayRCP< const LocalOrdinal > Ccolind;
61 Teuchos::ArrayRCP< const Scalar > Cvalues;
62 C.getAllValues(Crowptr,Ccolind,Cvalues);
65 int MyPID = C->getComm()->getRank();
66 printf(
"[%d] Crowptr = ",MyPID);
67 for(
size_t i=0; i<(size_t) Crowptr.size(); i++) {
68 printf(
"%3d ",(
int)Crowptr.getConst()[i]);
71 printf(
"[%d] Ccolind = ",MyPID);
72 for(
size_t i=0; i<(size_t)Ccolind.size(); i++) {
73 printf(
"%3d ",(
int)Ccolind.getConst()[i]);
82 static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
83 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
84 const LocalOrdinalViewType& Acol2Brow,
85 const LocalOrdinalViewType& Acol2Irow,
86 const LocalOrdinalViewType& Bcol2Ccol,
87 const LocalOrdinalViewType& Icol2Ccol,
88 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
89 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
90 const std::string& label = std::string(),
91 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
92#ifdef HAVE_TPETRA_MMM_TIMINGS
93 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
94 using Teuchos::TimeMonitor;
95 Teuchos::RCP<TimeMonitor> MM;
102 int team_work_size = 16;
103 std::string myalg(
"LTG");
104 if (!params.is_null()) {
105 if (params->isParameter(
"openmp: algorithm"))
106 myalg = params->get(
"openmp: algorithm", myalg);
107 if (params->isParameter(
"openmp: team work size"))
108 team_work_size = params->get(
"openmp: team work size", team_work_size);
111 if (myalg ==
"LTG") {
113 ::Tpetra::MatrixMatrix::ExtraKernels::mult_A_B_reuse_LowThreadGustavsonKernel(Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
115 throw std::runtime_error(
"Tpetra::MatrixMatrix::MMM reuse unknown kernel");
118#ifdef HAVE_TPETRA_MMM_TIMINGS
120 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"MMM Reuse OpenMPESFC"))));
122 C.fillComplete(C.getDomainMap(), C.getRangeMap());
127template <
class Scalar,
129 class GlobalOrdinal,
class LocalOrdinalViewType>
130struct KernelWrappers2<Scalar, LocalOrdinal, GlobalOrdinal,
Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
131 static inline void jacobi_A_B_newmatrix_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
132 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Dinv,
133 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
134 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
135 const LocalOrdinalViewType& Acol2Brow,
136 const LocalOrdinalViewType& Acol2Irow,
137 const LocalOrdinalViewType& Bcol2Ccol,
138 const LocalOrdinalViewType& Icol2Ccol,
139 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
140 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
141 const std::string& label = std::string(),
142 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
143#ifdef HAVE_TPETRA_MMM_TIMINGS
144 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
145 using Teuchos::TimeMonitor;
146 Teuchos::RCP<TimeMonitor> MM;
153 int team_work_size = 16;
154 std::string myalg(
"LTG");
155 if (!params.is_null()) {
156 if (params->isParameter(
"openmp: jacobi algorithm"))
157 myalg = params->get(
"openmp: jacobi algorithm", myalg);
158 if (params->isParameter(
"openmp: team work size"))
159 team_work_size = params->get(
"openmp: team work size", team_work_size);
162 if (myalg ==
"LTG") {
164 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_LowThreadGustavsonKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
165 }
else if (myalg ==
"MSAK") {
166 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
167 }
else if (myalg ==
"KK") {
168 kokkos_kernels_jacobi_A_B_newmatrix(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
170 throw std::runtime_error(
"Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel");
173#ifdef HAVE_TPETRA_MMM_TIMINGS
175 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"Jacobi Newmatrix OpenMPESFC"))));
179 RCP<Teuchos::ParameterList> labelList = rcp(
new Teuchos::ParameterList);
180 labelList->set(
"Timer Label", label);
181 if (!params.is_null()) labelList->set(
"compute global constants", params->get(
"compute global constants",
true));
184 if (!C.isFillComplete()) {
185 RCP<const Export<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > dummyExport;
186 C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport, dummyExport, labelList);
190 static inline void jacobi_A_B_reuse_kernel_wrapper(
typename Teuchos::ScalarTraits<Scalar>::magnitudeType omega,
191 const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Dinv,
192 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
193 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Bview,
194 const LocalOrdinalViewType& Acol2Brow,
195 const LocalOrdinalViewType& Acol2Irow,
196 const LocalOrdinalViewType& Bcol2Ccol,
197 const LocalOrdinalViewType& Icol2Ccol,
198 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
199 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
200 const std::string& label = std::string(),
201 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
202#ifdef HAVE_TPETRA_MMM_TIMINGS
203 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
204 using Teuchos::TimeMonitor;
205 Teuchos::RCP<TimeMonitor> MM;
212 int team_work_size = 16;
213 std::string myalg(
"LTG");
214 if (!params.is_null()) {
215 if (params->isParameter(
"openmp: jacobi algorithm"))
216 myalg = params->get(
"openmp: jacobi algorithm", myalg);
217 if (params->isParameter(
"openmp: team work size"))
218 team_work_size = params->get(
"openmp: team work size", team_work_size);
221 if (myalg ==
"LTG") {
223 ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_reuse_LowThreadGustavsonKernel(omega, Dinv, Aview, Bview, Acol2Brow, Acol2Irow, Bcol2Ccol, Icol2Ccol, C, Cimport, label, params);
225 throw std::runtime_error(
"Tpetra::MatrixMatrix::Jacobi reuse unknown kernel");
228#ifdef HAVE_TPETRA_MMM_TIMINGS
230 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"Jacobi Reuse OpenMPESFC"))));
232 C.fillComplete(C.getDomainMap(), C.getRangeMap());
237template <
class Scalar,
239 class GlobalOrdinal,
class LocalOrdinalViewType>
240struct KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal,
Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType> {
241 static inline void mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
242 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
243 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
244 const LocalOrdinalViewType& Acol2Prow,
245 const LocalOrdinalViewType& Acol2PIrow,
246 const LocalOrdinalViewType& Pcol2Ccol,
247 const LocalOrdinalViewType& PIcol2Ccol,
248 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
249 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
250 const std::string& label = std::string(),
251 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
253 static inline void mult_R_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
254 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
255 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
256 const LocalOrdinalViewType& Acol2Prow,
257 const LocalOrdinalViewType& Acol2PIrow,
258 const LocalOrdinalViewType& Pcol2Ccol,
259 const LocalOrdinalViewType& PIcol2Ccol,
260 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
261 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
262 const std::string& label = std::string(),
263 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
265 static inline void mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
266 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
267 const LocalOrdinalViewType& Acol2Prow,
268 const LocalOrdinalViewType& Acol2PIrow,
269 const LocalOrdinalViewType& Pcol2Ccol,
270 const LocalOrdinalViewType& PIcol2Ccol,
271 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
272 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
273 const std::string& label = std::string(),
274 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
276 static inline void mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
277 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
278 const LocalOrdinalViewType& Acol2Prow,
279 const LocalOrdinalViewType& Acol2PIrow,
280 const LocalOrdinalViewType& Pcol2Ccol,
281 const LocalOrdinalViewType& PIcol2Ccol,
282 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
283 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
284 const std::string& label = std::string(),
285 const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null);
289template <
class Scalar,
292 class LocalOrdinalViewType>
293void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_R_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
294 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
295 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
296 const LocalOrdinalViewType& Acol2Prow,
297 const LocalOrdinalViewType& Acol2PIrow,
298 const LocalOrdinalViewType& Pcol2Accol,
299 const LocalOrdinalViewType& PIcol2Accol,
300 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
301 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
302 const std::string& label,
303 const Teuchos::RCP<Teuchos::ParameterList>& params) {
304#ifdef HAVE_TPETRA_MMM_TIMINGS
305 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
306 using Teuchos::TimeMonitor;
307 Teuchos::RCP<TimeMonitor> MM;
311 std::string nodename(
"OpenMP");
314 std::string myalg(
"LTG");
316 if (!params.is_null()) {
317 if (params->isParameter(
"openmp: rap algorithm"))
318 myalg = params->get(
"openmp: rap algorithm", myalg);
321 if (myalg ==
"LTG") {
323 ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_newmatrix_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol, PIcol2Accol, Ac, Acimport, label, params);
325 throw std::runtime_error(
"Tpetra::MatrixMatrix::R_A_P newmatrix unknown kernel");
330template <
class Scalar,
333 class LocalOrdinalViewType>
334void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_R_A_P_reuse_kernel_wrapper(
335 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Rview,
336 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
337 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
339 const LocalOrdinalViewType& Acol2Prow,
340 const LocalOrdinalViewType& Acol2Irow,
341 const LocalOrdinalViewType& Pcol2Ccol,
342 const LocalOrdinalViewType& Icol2Ccol,
343 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& C,
344 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Cimport,
345 const std::string& label,
346 const Teuchos::RCP<Teuchos::ParameterList>& params) {
347#ifdef HAVE_TPETRA_MMM_TIMINGS
348 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
349 using Teuchos::TimeMonitor;
350 Teuchos::RCP<TimeMonitor> MM;
357 std::string myalg(
"LTG");
358 if (!params.is_null()) {
359 if (params->isParameter(
"openmp: rap algorithm"))
360 myalg = params->get(
"openmp: rap algorithm", myalg);
363 if (myalg ==
"LTG") {
365 ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_reuse_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2Irow, Pcol2Ccol, Icol2Ccol, C, Cimport, label, params);
367 throw std::runtime_error(
"Tpetra::MatrixMatrix::R_A_P newmatrix unknown kernel");
370#ifdef HAVE_TPETRA_MMM_TIMINGS
372 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"RAP Reuse OpenMPESFC"))));
374 C.fillComplete(C.getDomainMap(), C.getRangeMap());
378template <
class Scalar,
381 class LocalOrdinalViewType>
382void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_PT_A_P_newmatrix_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
384 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
385 const LocalOrdinalViewType& Acol2Prow,
386 const LocalOrdinalViewType& Acol2PIrow,
387 const LocalOrdinalViewType& Pcol2Accol,
388 const LocalOrdinalViewType& PIcol2Accol,
389 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
390 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
391 const std::string& label,
392 const Teuchos::RCP<Teuchos::ParameterList>& params) {
393#ifdef HAVE_TPETRA_MMM_TIMINGS
394 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
395 using Teuchos::TimeMonitor;
396 Teuchos::RCP<TimeMonitor> MM;
400 std::string nodename(
"OpenMP");
403 std::string myalg(
"LTG");
405 if (!params.is_null()) {
406 if (params->isParameter(
"openmp: ptap algorithm"))
407 myalg = params->get(
"openmp: ptap algorithm", myalg);
410 if (myalg ==
"LTG") {
411#ifdef HAVE_TPETRA_MMM_TIMINGS
413 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"PTAP local transpose"))));
416 using Teuchos::ParameterList;
418 using LO = LocalOrdinal;
419 using GO = GlobalOrdinal;
423 using transposer_type =
424 RowMatrixTransposer<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>;
425 transposer_type transposer(Pview.origMatrix, label +
"XP: ");
426 RCP<ParameterList> transposeParams(
new ParameterList);
427 if (!params.is_null()) {
428 transposeParams->set(
"compute global constants",
429 params->get(
"compute global constants: temporaries",
432 transposeParams->set(
"sort",
false);
433 RCP<CrsMatrix<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Ptrans =
434 transposer.createTransposeLocal(transposeParams);
435 CrsMatrixStruct<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> Rview;
436 Rview.origMatrix = Ptrans;
438 using ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_newmatrix_LowThreadGustavsonKernel;
439 mult_R_A_P_newmatrix_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol,
440 PIcol2Accol, Ac, Acimport, label, params);
442 throw std::runtime_error(
"Tpetra::MatrixMatrix::PT_A_P newmatrix unknown kernel");
447template <
class Scalar,
450 class LocalOrdinalViewType>
451void KernelWrappers3<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode, LocalOrdinalViewType>::mult_PT_A_P_reuse_kernel_wrapper(CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Aview,
453 CrsMatrixStruct<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Pview,
454 const LocalOrdinalViewType& Acol2Prow,
455 const LocalOrdinalViewType& Acol2PIrow,
456 const LocalOrdinalViewType& Pcol2Accol,
457 const LocalOrdinalViewType& PIcol2Accol,
458 CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>& Ac,
459 Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Acimport,
460 const std::string& label,
461 const Teuchos::RCP<Teuchos::ParameterList>& params) {
462#ifdef HAVE_TPETRA_MMM_TIMINGS
463 std::string prefix_mmm = std::string(
"TpetraExt ") + label + std::string(
": ");
464 using Teuchos::TimeMonitor;
465 Teuchos::RCP<TimeMonitor> MM;
469 std::string nodename(
"OpenMP");
472 std::string myalg(
"LTG");
474 if (!params.is_null()) {
475 if (params->isParameter(
"openmp: ptap algorithm"))
476 myalg = params->get(
"openmp: ptap algorithm", myalg);
479 if (myalg ==
"LTG") {
480#ifdef HAVE_TPETRA_MMM_TIMINGS
482 MM = rcp(
new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string(
"PTAP local transpose"))));
485 using Teuchos::ParameterList;
487 using LO = LocalOrdinal;
488 using GO = GlobalOrdinal;
492 using transposer_type =
493 RowMatrixTransposer<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode>;
494 transposer_type transposer(Pview.origMatrix, label +
"XP: ");
495 RCP<ParameterList> transposeParams(
new ParameterList);
496 if (!params.is_null()) {
497 transposeParams->set(
"compute global constants",
498 params->get(
"compute global constants: temporaries",
501 transposeParams->set(
"sort",
false);
502 RCP<CrsMatrix<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> > Ptrans =
503 transposer.createTransposeLocal(transposeParams);
504 CrsMatrixStruct<SC, LO, GO, Tpetra::KokkosCompat::KokkosOpenMPWrapperNode> Rview;
505 Rview.origMatrix = Ptrans;
507 using ::Tpetra::MatrixMatrix::ExtraKernels::mult_R_A_P_reuse_LowThreadGustavsonKernel;
508 mult_R_A_P_reuse_LowThreadGustavsonKernel(Rview, Aview, Pview, Acol2Prow, Acol2PIrow, Pcol2Accol,
509 PIcol2Accol, Ac, Acimport, label, params);
511 throw std::runtime_error(
"Tpetra::MatrixMatrix::PT_A_P reuse unknown kernel");
513 Ac.fillComplete(Ac.getDomainMap(), Ac.getRangeMap());
Namespace Tpetra contains the class and methods constituting the Tpetra library.