40 #ifndef TPETRA_DISTOBJECT_DEF_HPP 41 #define TPETRA_DISTOBJECT_DEF_HPP 51 #include "Tpetra_Distributor.hpp" 54 #include "Tpetra_Details_checkGlobalError.hpp" 57 #include "Teuchos_CommHelpers.hpp" 58 #include "Teuchos_TypeNameTraits.hpp" 66 template<
class DeviceType,
class IndexType =
size_t>
68 SumFunctor (
const Kokkos::View<const size_t*, DeviceType>& viewToSum) :
69 viewToSum_ (viewToSum) {}
70 KOKKOS_INLINE_FUNCTION
void operator() (
const IndexType i,
size_t& lclSum)
const {
71 lclSum += viewToSum_(i);
73 Kokkos::View<const size_t*, DeviceType> viewToSum_;
76 template<
class DeviceType,
class IndexType =
size_t>
78 countTotalImportPackets (
const Kokkos::View<const size_t*, DeviceType>& numImportPacketsPerLID)
80 using Kokkos::parallel_reduce;
81 typedef DeviceType DT;
82 typedef typename DT::execution_space DES;
83 typedef Kokkos::RangePolicy<DES, IndexType> range_type;
85 const IndexType numOut = numImportPacketsPerLID.extent (0);
86 size_t totalImportPackets = 0;
87 parallel_reduce (
"Count import packets",
88 range_type (0, numOut),
89 SumFunctor<DeviceType, IndexType> (numImportPacketsPerLID),
91 return totalImportPackets;
96 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
101 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 104 using Teuchos::TimeMonitor;
106 RCP<Time> doXferTimer =
107 TimeMonitor::lookupCounter (
"Tpetra::DistObject::doTransfer");
108 if (doXferTimer.is_null ()) {
110 TimeMonitor::getNewCounter (
"Tpetra::DistObject::doTransfer");
112 doXferTimer_ = doXferTimer;
114 RCP<Time> copyAndPermuteTimer =
115 TimeMonitor::lookupCounter (
"Tpetra::DistObject::copyAndPermute");
116 if (copyAndPermuteTimer.is_null ()) {
117 copyAndPermuteTimer =
118 TimeMonitor::getNewCounter (
"Tpetra::DistObject::copyAndPermute");
120 copyAndPermuteTimer_ = copyAndPermuteTimer;
122 RCP<Time> packAndPrepareTimer =
123 TimeMonitor::lookupCounter (
"Tpetra::DistObject::packAndPrepare");
124 if (packAndPrepareTimer.is_null ()) {
125 packAndPrepareTimer =
126 TimeMonitor::getNewCounter (
"Tpetra::DistObject::packAndPrepare");
128 packAndPrepareTimer_ = packAndPrepareTimer;
130 RCP<Time> doPostsAndWaitsTimer =
131 TimeMonitor::lookupCounter (
"Tpetra::DistObject::doPostsAndWaits");
132 if (doPostsAndWaitsTimer.is_null ()) {
133 doPostsAndWaitsTimer =
134 TimeMonitor::getNewCounter (
"Tpetra::DistObject::doPostsAndWaits");
136 doPostsAndWaitsTimer_ = doPostsAndWaitsTimer;
138 RCP<Time> unpackAndCombineTimer =
139 TimeMonitor::lookupCounter (
"Tpetra::DistObject::unpackAndCombine");
140 if (unpackAndCombineTimer.is_null ()) {
141 unpackAndCombineTimer =
142 TimeMonitor::getNewCounter (
"Tpetra::DistObject::unpackAndCombine");
144 unpackAndCombineTimer_ = unpackAndCombineTimer;
145 #endif // HAVE_TPETRA_TRANSFER_TIMERS 148 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
153 using Teuchos::TypeNameTraits;
155 std::ostringstream os;
156 os <<
"\"Tpetra::DistObject\": {" 157 <<
"Packet: " << TypeNameTraits<packet_type>::name ()
158 <<
", LocalOrdinal: " << TypeNameTraits<local_ordinal_type>::name ()
159 <<
", GlobalOrdinal: " << TypeNameTraits<global_ordinal_type>::name ()
160 <<
", Node: " << TypeNameTraits<Node>::name ();
161 if (this->getObjectLabel () !=
"") {
162 os <<
"Label: \"" << this->getObjectLabel () <<
"\"";
168 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
172 const Teuchos::EVerbosityLevel verbLevel)
const 174 using Teuchos::rcpFromRef;
175 using Teuchos::TypeNameTraits;
177 const Teuchos::EVerbosityLevel vl = (verbLevel == Teuchos::VERB_DEFAULT) ?
178 Teuchos::VERB_LOW : verbLevel;
179 Teuchos::RCP<const Teuchos::Comm<int> > comm = this->getMap ()->getComm ();
180 const int myRank = comm.is_null () ? 0 : comm->getRank ();
181 const int numProcs = comm.is_null () ? 1 : comm->getSize ();
183 if (vl != Teuchos::VERB_NONE) {
184 Teuchos::OSTab tab0 (out);
186 out <<
"\"Tpetra::DistObject\":" << endl;
188 Teuchos::OSTab tab1 (out);
190 out <<
"Template parameters:" << endl;
192 Teuchos::OSTab tab2 (out);
193 out <<
"Packet: " << TypeNameTraits<packet_type>::name () << endl
194 <<
"LocalOrdinal: " << TypeNameTraits<local_ordinal_type>::name () << endl
195 <<
"GlobalOrdinal: " << TypeNameTraits<global_ordinal_type>::name () << endl
196 <<
"Node: " << TypeNameTraits<node_type>::name () << endl;
198 if (this->getObjectLabel () !=
"") {
199 out <<
"Label: \"" << this->getObjectLabel () <<
"\"" << endl;
206 out <<
"Map:" << endl;
208 Teuchos::OSTab tab2 (out);
209 map_->describe (out, vl);
213 if (vl > Teuchos::VERB_LOW) {
214 for (
int p = 0; p < numProcs; ++p) {
216 out <<
"Process " << myRank <<
":" << endl;
217 Teuchos::OSTab tab2 (out);
218 out <<
"Export buffer size (in packets): " 219 << exports_.extent (0)
221 <<
"Import buffer size (in packets): " 222 << imports_.extent (0)
225 if (! comm.is_null ()) {
235 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
240 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
241 "Tpetra::DistObject::removeEmptyProcessesInPlace: Not implemented");
273 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
279 const bool restrictedMode)
283 const char modeString[] =
"doImport (forward mode)";
288 const bool verbose = Behavior::verbose(
"DistObject");
289 std::unique_ptr<std::string> prefix;
291 prefix = this->createPrefix(
"DistObject", modeString);
292 std::ostringstream os;
293 os << *prefix <<
"Start" << endl;
294 std::cerr << os.str ();
296 this->beginImport(source, importer, CM, restrictedMode);
297 this->endImport(source, importer, CM, restrictedMode);
299 std::ostringstream os;
300 os << *prefix <<
"Done" << endl;
301 std::cerr << os.str ();
305 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
311 const bool restrictedMode)
315 const char modeString[] =
"doExport (forward mode)";
320 const bool verbose = Behavior::verbose(
"DistObject");
321 std::unique_ptr<std::string> prefix;
323 prefix = this->createPrefix(
"DistObject", modeString);
324 std::ostringstream os;
325 os << *prefix <<
"Start" << endl;
326 std::cerr << os.str ();
328 this->beginExport(source, exporter, CM, restrictedMode);
329 this->endExport(source, exporter, CM, restrictedMode);
331 std::ostringstream os;
332 os << *prefix <<
"Done" << endl;
333 std::cerr << os.str ();
337 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
343 const bool restrictedMode)
347 const char modeString[] =
"doImport (reverse mode)";
352 const bool verbose = Behavior::verbose(
"DistObject");
353 std::unique_ptr<std::string> prefix;
355 prefix = this->createPrefix(
"DistObject", modeString);
356 std::ostringstream os;
357 os << *prefix <<
"Start" << endl;
358 std::cerr << os.str ();
360 this->beginImport(source, exporter, CM, restrictedMode);
361 this->endImport(source, exporter, CM, restrictedMode);
363 std::ostringstream os;
364 os << *prefix <<
"Done" << endl;
365 std::cerr << os.str ();
369 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
375 const bool restrictedMode)
379 const char modeString[] =
"doExport (reverse mode)";
384 const bool verbose = Behavior::verbose(
"DistObject");
385 std::unique_ptr<std::string> prefix;
387 prefix = this->createPrefix(
"DistObject", modeString);
388 std::ostringstream os;
389 os << *prefix <<
"Start" << endl;
390 std::cerr << os.str ();
392 this->beginExport(source, importer, CM, restrictedMode);
393 this->endExport(source, importer, CM, restrictedMode);
395 std::ostringstream os;
396 os << *prefix <<
"Done" << endl;
397 std::cerr << os.str ();
401 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
407 const bool restrictedMode)
411 const char modeString[] =
"doImport (forward mode)";
416 const bool verbose = Behavior::verbose(
"DistObject");
417 std::unique_ptr<std::string> prefix;
419 prefix = this->createPrefix(
"DistObject", modeString);
420 std::ostringstream os;
421 os << *prefix <<
"Start" << endl;
422 std::cerr << os.str ();
424 this->beginTransfer(source, importer, modeString, DoForward, CM, restrictedMode);
426 std::ostringstream os;
427 os << *prefix <<
"Done" << endl;
428 std::cerr << os.str ();
432 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
434 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
435 beginExport(
const SrcDistObject& source,
436 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
438 const bool restrictedMode)
440 using Details::Behavior;
442 const char modeString[] =
"doExport (forward mode)";
447 const bool verbose = Behavior::verbose(
"DistObject");
448 std::unique_ptr<std::string> prefix;
451 std::ostringstream os;
452 os << *prefix <<
"Start" << endl;
453 std::cerr << os.str ();
455 this->beginTransfer(source, exporter, modeString, DoForward, CM, restrictedMode);
457 std::ostringstream os;
458 os << *prefix <<
"Done" << endl;
459 std::cerr << os.str ();
463 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
465 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
466 beginImport(
const SrcDistObject& source,
467 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
469 const bool restrictedMode)
471 using Details::Behavior;
473 const char modeString[] =
"doImport (reverse mode)";
478 const bool verbose = Behavior::verbose(
"DistObject");
479 std::unique_ptr<std::string> prefix;
482 std::ostringstream os;
483 os << *prefix <<
"Start" << endl;
484 std::cerr << os.str ();
486 this->beginTransfer(source, exporter, modeString, DoReverse, CM, restrictedMode);
488 std::ostringstream os;
489 os << *prefix <<
"Done" << endl;
490 std::cerr << os.str ();
494 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
496 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
497 beginExport(
const SrcDistObject& source,
498 const Import<LocalOrdinal, GlobalOrdinal, Node> & importer,
500 const bool restrictedMode)
502 using Details::Behavior;
504 const char modeString[] =
"doExport (reverse mode)";
509 const bool verbose = Behavior::verbose(
"DistObject");
510 std::unique_ptr<std::string> prefix;
513 std::ostringstream os;
514 os << *prefix <<
"Start" << endl;
515 std::cerr << os.str ();
517 this->beginTransfer(source, importer, modeString, DoReverse, CM, restrictedMode);
519 std::ostringstream os;
520 os << *prefix <<
"Done" << endl;
521 std::cerr << os.str ();
525 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
527 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
528 endImport(
const SrcDistObject& source,
529 const Import<LocalOrdinal, GlobalOrdinal, Node>& importer,
531 const bool restrictedMode)
533 using Details::Behavior;
535 const char modeString[] =
"doImport (forward mode)";
540 const bool verbose = Behavior::verbose(
"DistObject");
541 std::unique_ptr<std::string> prefix;
544 std::ostringstream os;
545 os << *prefix <<
"Start" << endl;
546 std::cerr << os.str ();
548 this->endTransfer(source, importer, modeString, DoForward, CM, restrictedMode);
550 std::ostringstream os;
551 os << *prefix <<
"Done" << endl;
552 std::cerr << os.str ();
556 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
558 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
559 endExport(
const SrcDistObject& source,
560 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
562 const bool restrictedMode)
564 using Details::Behavior;
566 const char modeString[] =
"doExport (forward mode)";
571 const bool verbose = Behavior::verbose(
"DistObject");
572 std::unique_ptr<std::string> prefix;
575 std::ostringstream os;
576 os << *prefix <<
"Start" << endl;
577 std::cerr << os.str ();
579 this->endTransfer(source, exporter, modeString, DoForward, CM, restrictedMode);
581 std::ostringstream os;
582 os << *prefix <<
"Done" << endl;
583 std::cerr << os.str ();
587 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
589 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
590 endImport(
const SrcDistObject& source,
591 const Export<LocalOrdinal, GlobalOrdinal, Node>& exporter,
593 const bool restrictedMode)
595 using Details::Behavior;
597 const char modeString[] =
"doImport (reverse mode)";
602 const bool verbose = Behavior::verbose(
"DistObject");
603 std::unique_ptr<std::string> prefix;
606 std::ostringstream os;
607 os << *prefix <<
"Start" << endl;
608 std::cerr << os.str ();
610 this->endTransfer(source, exporter, modeString, DoReverse, CM, restrictedMode);
612 std::ostringstream os;
613 os << *prefix <<
"Done" << endl;
614 std::cerr << os.str ();
618 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
620 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
621 endExport(
const SrcDistObject& source,
622 const Import<LocalOrdinal, GlobalOrdinal, Node> & importer,
624 const bool restrictedMode)
626 using Details::Behavior;
628 const char modeString[] =
"doExport (reverse mode)";
633 const bool verbose = Behavior::verbose(
"DistObject");
634 std::unique_ptr<std::string> prefix;
637 std::ostringstream os;
638 os << *prefix <<
"Start" << endl;
639 std::cerr << os.str ();
641 this->endTransfer(source, importer, modeString, DoReverse, CM, restrictedMode);
643 std::ostringstream os;
644 os << *prefix <<
"Done" << endl;
645 std::cerr << os.str ();
649 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
651 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
652 isDistributed ()
const {
653 return map_->isDistributed ();
656 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
663 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
667 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
668 const char modeString[],
673 beginTransfer(src, transfer, modeString, revOp, CM, restrictedMode);
674 endTransfer(src, transfer, modeString, revOp, CM, restrictedMode);
677 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
682 const std::string* prefix,
687 std::ostringstream os;
688 os << *prefix <<
"Realloc (if needed) imports_ from " 689 << imports_.extent (0) <<
" to " << newSize << std::endl;
690 std::cerr << os.str ();
693 const bool reallocated =
696 std::ostringstream os;
697 os << *prefix <<
"Finished realloc'ing imports_" << std::endl;
698 std::cerr << os.str ();
703 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
707 const size_t numImportLIDs)
717 constexpr
size_t tooBigFactor = 10;
719 const bool verbose = Behavior::verbose(
"DistObject");
720 std::unique_ptr<std::string> prefix;
722 prefix = this->createPrefix(
"DistObject",
723 "reallocArraysForNumPacketsPerLid");
724 std::ostringstream os;
726 <<
"numExportLIDs: " << numExportLIDs
727 <<
", numImportLIDs: " << numImportLIDs
729 os << *prefix <<
"DualView status before:" << endl
732 "numExportPacketsPerLID_")
736 "numImportPacketsPerLID_")
738 std::cerr << os.str ();
742 const bool firstReallocated =
745 "numExportPacketsPerLID",
752 const bool needFenceBeforeNextAlloc = ! firstReallocated;
753 const bool secondReallocated =
756 "numImportPacketsPerLID",
758 needFenceBeforeNextAlloc);
761 std::ostringstream os;
762 os << *prefix <<
"DualView status after:" << endl
764 "numExportPacketsPerLID_")
767 "numImportPacketsPerLID_")
769 std::cerr << os.str ();
772 return firstReallocated || secondReallocated;
775 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
779 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
780 const char modeString[],
789 using Kokkos::Compat::getArrayView;
790 using Kokkos::Compat::getConstArrayView;
791 using Kokkos::Compat::getKokkosViewDeepCopy;
792 using Kokkos::Compat::create_const_view;
796 const char funcName[] =
"Tpetra::DistObject::doTransfer";
798 ProfilingRegion region_doTransfer(funcName);
799 const bool verbose = Behavior::verbose(
"DistObject");
800 std::shared_ptr<std::string> prefix;
802 std::ostringstream os;
803 prefix = this->createPrefix(
"DistObject",
"doTransfer");
804 os << *prefix <<
"Source type: " << Teuchos::typeName(src)
805 <<
", Target type: " << Teuchos::typeName(*
this) << endl;
806 std::cerr << os.str();
819 const bool debug = Behavior::debug(
"DistObject");
821 if (! restrictedMode && revOp == DoForward) {
822 const bool myMapSameAsTransferTgtMap =
823 this->getMap ()->isSameAs (* (transfer.getTargetMap ()));
824 TEUCHOS_TEST_FOR_EXCEPTION
825 (! myMapSameAsTransferTgtMap, std::invalid_argument,
826 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 827 "communication, the target DistObject's Map must be the same " 828 "(in the sense of Tpetra::Map::isSameAs) as the input " 829 "Export/Import object's target Map.");
831 else if (! restrictedMode && revOp == DoReverse) {
832 const bool myMapSameAsTransferSrcMap =
833 this->getMap ()->isSameAs (* (transfer.getSourceMap ()));
834 TEUCHOS_TEST_FOR_EXCEPTION
835 (! myMapSameAsTransferSrcMap, std::invalid_argument,
836 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 837 "communication, the target DistObject's Map must be the same " 838 "(in the sense of Tpetra::Map::isSameAs) as the input " 839 "Export/Import object's source Map.");
841 else if (restrictedMode && revOp == DoForward) {
842 const bool myMapLocallyFittedTransferTgtMap =
843 this->getMap ()->isLocallyFitted (* (transfer.getTargetMap ()));
844 TEUCHOS_TEST_FOR_EXCEPTION
845 (! myMapLocallyFittedTransferTgtMap , std::invalid_argument,
846 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 847 "communication using restricted mode, Export/Import object's " 848 "target Map must be locally fitted (in the sense of " 849 "Tpetra::Map::isLocallyFitted) to target DistObject's Map.");
852 const bool myMapLocallyFittedTransferSrcMap =
853 this->getMap ()->isLocallyFitted (* (transfer.getSourceMap ()));
854 TEUCHOS_TEST_FOR_EXCEPTION
855 (! myMapLocallyFittedTransferSrcMap, std::invalid_argument,
856 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 857 "communication using restricted mode, Export/Import object's " 858 "source Map must be locally fitted (in the sense of " 859 "Tpetra::Map::isLocallyFitted) to target DistObject's Map.");
866 if (srcDistObj !=
nullptr) {
867 if (revOp == DoForward) {
868 const bool srcMapSameAsImportSrcMap =
869 srcDistObj->
getMap ()->isSameAs (* (transfer.getSourceMap ()));
870 TEUCHOS_TEST_FOR_EXCEPTION
871 (! srcMapSameAsImportSrcMap, std::invalid_argument,
872 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 873 "communication, the source DistObject's Map must be the same " 874 "as the input Export/Import object's source Map.");
877 const bool srcMapSameAsImportTgtMap =
878 srcDistObj->
getMap ()->isSameAs (* (transfer.getTargetMap ()));
879 TEUCHOS_TEST_FOR_EXCEPTION
880 (! srcMapSameAsImportTgtMap, std::invalid_argument,
881 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 882 "communication, the source DistObject's Map must be the same " 883 "as the input Export/Import object's target Map.");
888 const size_t numSameIDs = transfer.getNumSameIDs ();
892 TEUCHOS_TEST_FOR_EXCEPTION
893 (debug && restrictedMode &&
894 (transfer.getPermuteToLIDs_dv().extent(0) != 0 ||
895 transfer.getPermuteFromLIDs_dv().extent(0) != 0),
896 std::invalid_argument,
897 "Tpetra::DistObject::" << modeString <<
": Transfer object " 898 "cannot have permutes in restricted mode.");
901 const bool commOnHost = ! Behavior::assumeMpiIsCudaAware ();
903 std::ostringstream os;
904 os << *prefix <<
"doTransfer: Use new interface; " 905 "commOnHost=" << (commOnHost ?
"true" :
"false") << endl;
906 std::cerr << os.str ();
909 using const_lo_dv_type =
910 Kokkos::DualView<const local_ordinal_type*, buffer_device_type>;
911 const_lo_dv_type permuteToLIDs = (revOp == DoForward) ?
912 transfer.getPermuteToLIDs_dv () :
913 transfer.getPermuteFromLIDs_dv ();
914 const_lo_dv_type permuteFromLIDs = (revOp == DoForward) ?
915 transfer.getPermuteFromLIDs_dv () :
916 transfer.getPermuteToLIDs_dv ();
917 const_lo_dv_type remoteLIDs = (revOp == DoForward) ?
918 transfer.getRemoteLIDs_dv () :
919 transfer.getExportLIDs_dv ();
920 const_lo_dv_type exportLIDs = (revOp == DoForward) ?
921 transfer.getExportLIDs_dv () :
922 transfer.getRemoteLIDs_dv ();
923 const bool canTryAliasing = (revOp == DoForward) ?
924 transfer.areRemoteLIDsContiguous() :
925 transfer.areExportLIDsContiguous();
928 ProfilingRegion region_dTN(funcName);
929 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 932 Teuchos::TimeMonitor doXferMon (*doXferTimer_);
933 #endif // HAVE_TPETRA_TRANSFER_TIMERS 936 std::ostringstream os;
937 os << *prefix <<
"Input arguments:" << endl
939 << *prefix <<
" numSameIDs: " << numSameIDs << endl
948 << *prefix <<
" revOp: Do" << (revOp == DoReverse ?
"Reverse" :
"Forward") << endl
949 << *prefix <<
" commOnHost: " << (commOnHost ?
"true" :
"false") << endl;
950 std::cerr << os.str ();
954 ProfilingRegion region_cs (
"Tpetra::DistObject::doTransferNew::checkSizes");
956 std::ostringstream os;
957 os << *prefix <<
"1. checkSizes" << endl;
958 std::cerr << os.str ();
960 const bool checkSizesResult = this->checkSizes (src);
961 TEUCHOS_TEST_FOR_EXCEPTION
962 (! checkSizesResult, std::invalid_argument,
963 "Tpetra::DistObject::doTransfer: checkSizes() indicates that the " 964 "destination object is not a legal target for redistribution from the " 965 "source object. This probably means that they do not have the same " 966 "dimensions. For example, MultiVectors must have the same number of " 967 "rows and columns.");
974 if (!restrictedMode && numSameIDs + permuteToLIDs.extent (0) != 0) {
977 std::ostringstream os;
978 os << *prefix <<
"2. copyAndPermute" << endl;
979 std::cerr << os.str ();
981 ProfilingRegion region_cp
982 (
"Tpetra::DistObject::doTransferNew::copyAndPermute");
983 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 986 Teuchos::TimeMonitor copyAndPermuteMon (*copyAndPermuteTimer_);
987 #endif // HAVE_TPETRA_TRANSFER_TIMERS 989 if (numSameIDs + permuteToLIDs.extent (0) != 0) {
992 std::ostringstream os;
993 os << *prefix <<
"2. copyAndPermute" << endl;
994 std::cerr << os.str ();
996 this->copyAndPermute (src, numSameIDs, permuteToLIDs,
997 permuteFromLIDs, CM);
999 std::ostringstream os;
1000 os << *prefix <<
"After copyAndPermute:" << endl
1007 std::cerr << os.str ();
1020 size_t constantNumPackets = this->constantNumberOfPackets ();
1022 std::ostringstream os;
1023 os << *prefix <<
"constantNumPackets=" << constantNumPackets << endl;
1024 std::cerr << os.str ();
1032 if (constantNumPackets == 0) {
1034 std::ostringstream os;
1035 os << *prefix <<
"3. (Re)allocate num{Ex,Im}portPacketsPerLID" 1037 std::cerr << os.str ();
1041 this->reallocArraysForNumPacketsPerLid (exportLIDs.extent (0),
1042 remoteLIDs.extent (0));
1046 std::ostringstream os;
1047 os << *prefix <<
"4. packAndPrepare: before, " 1050 std::cerr << os.str ();
1053 doPackAndPrepare(src, exportLIDs, constantNumPackets);
1055 this->exports_.sync_host();
1058 this->exports_.sync_device();
1062 std::ostringstream os;
1063 os << *prefix <<
"5.1. After packAndPrepare, " 1066 std::cerr << os.str ();
1072 if (constantNumPackets != 0) {
1077 const size_t rbufLen = remoteLIDs.extent (0) * constantNumPackets;
1078 reallocImportsIfNeeded (rbufLen, verbose, prefix.get (), canTryAliasing, CM);
1082 bool needCommunication =
true;
1087 if (revOp == DoReverse && ! this->isDistributed ()) {
1088 needCommunication =
false;
1097 else if (revOp == DoForward && srcDistObj != NULL &&
1099 needCommunication =
false;
1102 if (! needCommunication) {
1104 std::ostringstream os;
1105 os << *prefix <<
"Comm not needed; skipping" << endl;
1106 std::cerr << os.str ();
1110 ProfilingRegion region_dpw
1111 (
"Tpetra::DistObject::doTransferNew::doPostsAndWaits");
1112 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 1115 Teuchos::TimeMonitor doPostsAndWaitsMon (*doPostsAndWaitsTimer_);
1116 #endif // HAVE_TPETRA_TRANSFER_TIMERS 1119 std::ostringstream os;
1120 os << *prefix <<
"7.0. " 1121 << (revOp == DoReverse ?
"Reverse" :
"Forward")
1123 std::cerr << os.str ();
1126 doPosts(distributorPlan, constantNumPackets, commOnHost, prefix, canTryAliasing, CM);
1131 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1135 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
1136 const char modeString[],
1137 const ReverseOption revOp,
1139 bool restrictedMode)
1145 using Kokkos::Compat::getArrayView;
1146 using Kokkos::Compat::getConstArrayView;
1147 using Kokkos::Compat::getKokkosViewDeepCopy;
1148 using Kokkos::Compat::create_const_view;
1152 const char funcName[] =
"Tpetra::DistObject::doTransfer";
1154 ProfilingRegion region_doTransfer(funcName);
1155 const bool verbose = Behavior::verbose(
"DistObject");
1156 std::shared_ptr<std::string> prefix;
1158 std::ostringstream os;
1159 prefix = this->createPrefix(
"DistObject",
"doTransfer");
1160 os << *prefix <<
"Source type: " << Teuchos::typeName(src)
1161 <<
", Target type: " << Teuchos::typeName(*
this) << endl;
1162 std::cerr << os.str();
1175 const bool debug = Behavior::debug(
"DistObject");
1177 if (! restrictedMode && revOp == DoForward) {
1178 const bool myMapSameAsTransferTgtMap =
1179 this->getMap ()->isSameAs (* (transfer.getTargetMap ()));
1180 TEUCHOS_TEST_FOR_EXCEPTION
1181 (! myMapSameAsTransferTgtMap, std::invalid_argument,
1182 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 1183 "communication, the target DistObject's Map must be the same " 1184 "(in the sense of Tpetra::Map::isSameAs) as the input " 1185 "Export/Import object's target Map.");
1187 else if (! restrictedMode && revOp == DoReverse) {
1188 const bool myMapSameAsTransferSrcMap =
1189 this->getMap ()->isSameAs (* (transfer.getSourceMap ()));
1190 TEUCHOS_TEST_FOR_EXCEPTION
1191 (! myMapSameAsTransferSrcMap, std::invalid_argument,
1192 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 1193 "communication, the target DistObject's Map must be the same " 1194 "(in the sense of Tpetra::Map::isSameAs) as the input " 1195 "Export/Import object's source Map.");
1197 else if (restrictedMode && revOp == DoForward) {
1198 const bool myMapLocallyFittedTransferTgtMap =
1199 this->getMap ()->isLocallyFitted (* (transfer.getTargetMap ()));
1200 TEUCHOS_TEST_FOR_EXCEPTION
1201 (! myMapLocallyFittedTransferTgtMap , std::invalid_argument,
1202 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 1203 "communication using restricted mode, Export/Import object's " 1204 "target Map must be locally fitted (in the sense of " 1205 "Tpetra::Map::isLocallyFitted) to target DistObject's Map.");
1208 const bool myMapLocallyFittedTransferSrcMap =
1209 this->getMap ()->isLocallyFitted (* (transfer.getSourceMap ()));
1210 TEUCHOS_TEST_FOR_EXCEPTION
1211 (! myMapLocallyFittedTransferSrcMap, std::invalid_argument,
1212 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 1213 "communication using restricted mode, Export/Import object's " 1214 "source Map must be locally fitted (in the sense of " 1215 "Tpetra::Map::isLocallyFitted) to target DistObject's Map.");
1221 const this_type* srcDistObj =
dynamic_cast<const this_type*
> (&src);
1222 if (srcDistObj !=
nullptr) {
1223 if (revOp == DoForward) {
1224 const bool srcMapSameAsImportSrcMap =
1225 srcDistObj->getMap ()->isSameAs (* (transfer.getSourceMap ()));
1226 TEUCHOS_TEST_FOR_EXCEPTION
1227 (! srcMapSameAsImportSrcMap, std::invalid_argument,
1228 "Tpetra::DistObject::" << modeString <<
": For forward-mode " 1229 "communication, the source DistObject's Map must be the same " 1230 "as the input Export/Import object's source Map.");
1233 const bool srcMapSameAsImportTgtMap =
1234 srcDistObj->getMap ()->isSameAs (* (transfer.getTargetMap ()));
1235 TEUCHOS_TEST_FOR_EXCEPTION
1236 (! srcMapSameAsImportTgtMap, std::invalid_argument,
1237 "Tpetra::DistObject::" << modeString <<
": For reverse-mode " 1238 "communication, the source DistObject's Map must be the same " 1239 "as the input Export/Import object's target Map.");
1244 Distributor& distor = transfer.getDistributor ();
1245 const Details::DistributorPlan& distributorPlan = (revOp == DoForward) ? distor.getPlan() : *distor.getPlan().getReversePlan();
1247 TEUCHOS_TEST_FOR_EXCEPTION
1248 (debug && restrictedMode &&
1249 (transfer.getPermuteToLIDs_dv().extent(0) != 0 ||
1250 transfer.getPermuteFromLIDs_dv().extent(0) != 0),
1251 std::invalid_argument,
1252 "Tpetra::DistObject::" << modeString <<
": Transfer object " 1253 "cannot have permutes in restricted mode.");
1256 const bool commOnHost = ! Behavior::assumeMpiIsCudaAware ();
1258 std::ostringstream os;
1259 os << *prefix <<
"doTransfer: Use new interface; " 1260 "commOnHost=" << (commOnHost ?
"true" :
"false") << endl;
1261 std::cerr << os.str ();
1264 using const_lo_dv_type =
1265 Kokkos::DualView<const local_ordinal_type*, buffer_device_type>;
1266 const_lo_dv_type permuteToLIDs = (revOp == DoForward) ?
1267 transfer.getPermuteToLIDs_dv () :
1268 transfer.getPermuteFromLIDs_dv ();
1269 const_lo_dv_type permuteFromLIDs = (revOp == DoForward) ?
1270 transfer.getPermuteFromLIDs_dv () :
1271 transfer.getPermuteToLIDs_dv ();
1272 const_lo_dv_type remoteLIDs = (revOp == DoForward) ?
1273 transfer.getRemoteLIDs_dv () :
1274 transfer.getExportLIDs_dv ();
1275 const_lo_dv_type exportLIDs = (revOp == DoForward) ?
1276 transfer.getExportLIDs_dv () :
1277 transfer.getRemoteLIDs_dv ();
1278 const bool canTryAliasing = (revOp == DoForward) ?
1279 transfer.areRemoteLIDsContiguous() :
1280 transfer.areExportLIDsContiguous();
1282 size_t constantNumPackets = this->constantNumberOfPackets ();
1286 if (constantNumPackets != 0) {
1291 const size_t rbufLen = remoteLIDs.extent (0) * constantNumPackets;
1292 reallocImportsIfNeeded (rbufLen, verbose, prefix.get (), canTryAliasing, CM);
1296 bool needCommunication =
true;
1299 const this_type* srcDistObj =
dynamic_cast<const this_type*
> (&src);
1301 if (revOp == DoReverse && ! this->isDistributed ()) {
1302 needCommunication =
false;
1311 else if (revOp == DoForward && srcDistObj != NULL &&
1312 ! srcDistObj->isDistributed ()) {
1313 needCommunication =
false;
1316 if (! needCommunication) {
1318 std::ostringstream os;
1319 os << *prefix <<
"Comm not needed; skipping" << endl;
1320 std::cerr << os.str ();
1324 distributorActor_.doWaits(distributorPlan);
1327 std::ostringstream os;
1328 os << *prefix <<
"8. unpackAndCombine" << endl;
1329 std::cerr << os.str ();
1331 doUnpackAndCombine(remoteLIDs, constantNumPackets, CM);
1336 std::ostringstream os;
1337 os << *prefix <<
"9. Done!" << endl;
1338 std::cerr << os.str ();
1342 std::ostringstream os;
1343 os << *prefix <<
"Tpetra::DistObject::doTransfer: Done!" << endl;
1344 std::cerr << os.str ();
1348 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1350 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
1351 doPosts(
const Details::DistributorPlan& distributorPlan,
1352 size_t constantNumPackets,
1354 std::shared_ptr<std::string> prefix,
1355 const bool canTryAliasing,
1360 using Kokkos::Compat::create_const_view;
1363 const bool verbose = Details::Behavior::verbose(
"DistObject");
1365 if (constantNumPackets == 0) {
1367 std::ostringstream os;
1368 os << *prefix <<
"7.1. Variable # packets / LID: first comm " 1369 <<
"(commOnHost = " << (commOnHost ?
"true" :
"false") <<
")" 1371 std::cerr << os.str ();
1373 size_t totalImportPackets = 0;
1375 if (this->numExportPacketsPerLID_.need_sync_host ()) {
1376 this->numExportPacketsPerLID_.sync_host ();
1378 if (this->numImportPacketsPerLID_.need_sync_host ()) {
1379 this->numImportPacketsPerLID_.sync_host ();
1381 this->numImportPacketsPerLID_.modify_host ();
1383 create_const_view (this->numExportPacketsPerLID_.view_host ());
1384 auto numImp_h = this->numImportPacketsPerLID_.view_host ();
1388 std::ostringstream os;
1389 os << *prefix <<
"Call doPostsAndWaits" 1391 std::cerr << os.str ();
1393 distributorActor_.doPostsAndWaits(distributorPlan, numExp_h, 1, numImp_h);
1396 std::ostringstream os;
1397 os << *prefix <<
"Count totalImportPackets" << std::endl;
1398 std::cerr << os.str ();
1400 using the_dev_type =
typename decltype (numImp_h)::device_type;
1401 totalImportPackets = countTotalImportPackets<the_dev_type> (numImp_h);
1404 this->numExportPacketsPerLID_.sync_device ();
1405 this->numImportPacketsPerLID_.sync_device ();
1406 this->numImportPacketsPerLID_.modify_device ();
1407 auto numExp_d = create_const_view
1408 (this->numExportPacketsPerLID_.view_device ());
1409 auto numImp_d = this->numImportPacketsPerLID_.view_device ();
1413 std::ostringstream os;
1414 os << *prefix <<
"Call doPostsAndWaits" 1416 std::cerr << os.str ();
1418 distributorActor_.doPostsAndWaits(distributorPlan, numExp_d, 1, numImp_d);
1421 std::ostringstream os;
1422 os << *prefix <<
"Count totalImportPackets" << std::endl;
1423 std::cerr << os.str ();
1425 using the_dev_type =
typename decltype (numImp_d)::device_type;
1426 totalImportPackets = countTotalImportPackets<the_dev_type> (numImp_d);
1430 std::ostringstream os;
1431 os << *prefix <<
"totalImportPackets=" << totalImportPackets << endl;
1432 std::cerr << os.str ();
1434 this->reallocImportsIfNeeded (totalImportPackets, verbose,
1435 prefix.get (), canTryAliasing, CM);
1437 std::ostringstream os;
1438 os << *prefix <<
"7.3. Second comm" << std::endl;
1439 std::cerr << os.str ();
1445 this->numExportPacketsPerLID_.sync_host ();
1446 this->numImportPacketsPerLID_.sync_host ();
1455 auto numExportPacketsPerLID_av =
1457 auto numImportPacketsPerLID_av =
1465 this->imports_.clear_sync_state ();
1468 std::ostringstream os;
1469 os << *prefix <<
"Comm on " 1470 << (commOnHost ?
"host" :
"device")
1471 <<
"; call doPosts" << endl;
1472 std::cerr << os.str ();
1476 this->imports_.modify_host ();
1477 distributorActor_.doPosts
1479 create_const_view (this->exports_.view_host ()),
1480 numExportPacketsPerLID_av,
1481 this->imports_.view_host (),
1482 numImportPacketsPerLID_av);
1486 this->imports_.modify_device ();
1487 distributorActor_.doPosts
1489 create_const_view (this->exports_.view_device ()),
1490 numExportPacketsPerLID_av,
1491 this->imports_.view_device (),
1492 numImportPacketsPerLID_av);
1497 std::ostringstream os;
1498 os << *prefix <<
"7.1. Const # packets per LID: " << endl
1505 std::cerr << os.str ();
1512 this->imports_.clear_sync_state ();
1515 std::ostringstream os;
1516 os << *prefix <<
"7.2. Comm on " 1517 << (commOnHost ?
"host" :
"device")
1518 <<
"; call doPosts" << endl;
1519 std::cerr << os.str ();
1522 this->imports_.modify_host ();
1523 distributorActor_.doPosts
1525 create_const_view (this->exports_.view_host ()),
1527 this->imports_.view_host ());
1531 this->imports_.modify_device ();
1532 distributorActor_.doPosts
1534 create_const_view (this->exports_.view_device ()),
1536 this->imports_.view_device ());
1541 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1543 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
1544 doPackAndPrepare(
const SrcDistObject& src,
1545 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
1546 size_t& constantNumPackets)
1548 using Details::ProfilingRegion;
1550 const bool debug = Details::Behavior::debug(
"DistObject");
1552 ProfilingRegion region_pp
1553 (
"Tpetra::DistObject::doTransferNew::packAndPrepare");
1554 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 1557 Teuchos::TimeMonitor packAndPrepareMon (*packAndPrepareTimer_);
1558 #endif // HAVE_TPETRA_TRANSFER_TIMERS 1577 std::ostringstream lclErrStrm;
1578 bool lclSuccess =
false;
1580 this->packAndPrepare (src, exportLIDs, this->exports_,
1581 this->numExportPacketsPerLID_,
1582 constantNumPackets);
1585 catch (std::exception& e) {
1586 lclErrStrm <<
"packAndPrepare threw an exception: " 1587 << endl << e.what();
1590 lclErrStrm <<
"packAndPrepare threw an exception " 1591 "not a subclass of std::exception.";
1593 const char gblErrMsgHeader[] =
"Tpetra::DistObject " 1594 "threw an exception in packAndPrepare on " 1595 "one or more processes in the DistObject's communicator.";
1596 auto comm = getMap()->getComm();
1597 Details::checkGlobalError(std::cerr, lclSuccess,
1598 lclErrStrm.str().c_str(),
1599 gblErrMsgHeader, *comm);
1602 this->packAndPrepare (src, exportLIDs, this->exports_,
1603 this->numExportPacketsPerLID_,
1604 constantNumPackets);
1608 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1610 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
1611 doUnpackAndCombine(
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& remoteLIDs,
1612 size_t constantNumPackets,
1615 using Details::ProfilingRegion;
1617 const bool debug = Details::Behavior::debug(
"DistObject");
1619 ProfilingRegion region_uc
1620 (
"Tpetra::DistObject::doTransferNew::unpackAndCombine");
1621 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 1624 Teuchos::TimeMonitor unpackAndCombineMon (*unpackAndCombineTimer_);
1625 #endif // HAVE_TPETRA_TRANSFER_TIMERS 1628 std::ostringstream lclErrStrm;
1629 bool lclSuccess =
false;
1632 this->numImportPacketsPerLID_,
1633 constantNumPackets, CM);
1636 catch (std::exception& e) {
1637 lclErrStrm <<
"unpackAndCombine threw an exception: " 1638 << endl << e.what();
1641 lclErrStrm <<
"unpackAndCombine threw an exception " 1642 "not a subclass of std::exception.";
1644 const char gblErrMsgHeader[] =
"Tpetra::DistObject " 1645 "threw an exception in unpackAndCombine on " 1646 "one or more processes in the DistObject's communicator.";
1647 auto comm = getMap()->getComm();
1648 Details::checkGlobalError(std::cerr, lclSuccess,
1649 lclErrStrm.str().c_str(),
1650 gblErrMsgHeader, *comm);
1654 this->numImportPacketsPerLID_,
1655 constantNumPackets, CM);
1659 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1661 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
1665 const Kokkos::DualView<
1668 const Kokkos::DualView<
1674 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1679 const Kokkos::DualView<
1691 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1695 (
const Kokkos::DualView<
1709 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1714 using Teuchos::FancyOStream;
1715 using Teuchos::getFancyOStream;
1717 using Teuchos::rcpFromRef;
1720 RCP<FancyOStream> out = getFancyOStream (rcpFromRef (os));
1721 this->describe (*out, Teuchos::VERB_DEFAULT);
1724 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
1725 std::unique_ptr<std::string>
1728 const char methodName[])
const 1730 auto map = this->getMap();
1731 auto comm = map.is_null() ? Teuchos::null : map->getComm();
1732 return Details::createPrefix(
1733 comm.getRawPtr(), className, methodName);
1736 template<
class DistObjectType>
1738 removeEmptyProcessesInPlace(
1739 Teuchos::RCP<DistObjectType>& input,
1740 const Teuchos::RCP<
const Map<
1741 typename DistObjectType::local_ordinal_type,
1742 typename DistObjectType::global_ordinal_type,
1743 typename DistObjectType::node_type>>& newMap)
1745 input->removeEmptyProcessesInPlace (newMap);
1746 if (newMap.is_null ()) {
1747 input = Teuchos::null;
1751 template<
class DistObjectType>
1755 auto newMap = input->getMap ()->removeEmptyProcesses ();
1756 removeEmptyProcessesInPlace<DistObjectType> (input, newMap);
1760 #define TPETRA_DISTOBJECT_INSTANT(SCALAR, LO, GO, NODE) \ 1761 template class DistObject< SCALAR , LO , GO , NODE >; 1765 #define TPETRA_DISTOBJECT_INSTANT_CHAR(LO, GO, NODE) \ 1766 template class DistObject< char , LO , GO , NODE >; 1770 #endif // TPETRA_DISTOBJECT_DEF_HPP Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
const Details::DistributorPlan & getPlan() const
Get this Distributor's DistributorPlan.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Declaration of Tpetra::Details::Profiling, a scope guard for Kokkos Profiling.
void removeEmptyProcessesInPlace(Teuchos::RCP< DistObjectType > &input, const Teuchos::RCP< const Map< typename DistObjectType::local_ordinal_type, typename DistObjectType::global_ordinal_type, typename DistObjectType::node_type > > &newMap)
Remove processes which contain no elements in this object's Map.
virtual Teuchos::RCP< const map_type > getMap() const
The Map describing the parallel distribution of this object.
typename ::Kokkos::Details::ArithTraits< GlobalOrdinal >::val_type packet_type
The type of each datum being sent or received in an Import or Export.
Kokkos::DualView< T *, DT > getDualViewCopyFromArrayView(const Teuchos::ArrayView< const T > &x_av, const char label[], const bool leaveOnHost)
Get a 1-D Kokkos::DualView which is a deep copy of the input Teuchos::ArrayView (which views host mem...
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
Sets up and executes a communication plan for a Tpetra DistObject.
CombineMode
Rule for combining data in an Import or Export.
bool reallocDualViewIfNeeded(Kokkos::DualView< ValueType *, DeviceType > &dv, const size_t newSize, const char newLabel[], const size_t tooBigFactor=2, const bool needFenceBeforeRealloc=true)
Reallocate the DualView in/out argument, if needed.
Abstract base class for objects that can be the source of an Import or Export operation.
Declaration and definition of Tpetra::Details::reallocDualViewIfNeeded, an implementation detail of T...
LocalOrdinal local_ordinal_type
The type of local indices.
Replace old values with zero.
std::string combineModeToString(const CombineMode combineMode)
Human-readable string representation of the given CombineMode.
ReverseOption
Whether the data transfer should be performed in forward or reverse mode.
DistObject(const Teuchos::RCP< const map_type > &map)
Constructor.
std::string dualViewStatusToString(const DualViewType &dv, const char name[])
Return the status of the given Kokkos::DualView, as a human-readable string.
Teuchos::ArrayView< typename DualViewType::t_dev::value_type > getArrayViewFromDualView(const DualViewType &x)
Get a Teuchos::ArrayView which views the host Kokkos::View of the input 1-D Kokkos::DualView.
bool isDistributed() const
Whether this is a globally distributed object.
Stand-alone utility functions and macros.
void unpackAndCombine(const RowView &row_ptrs_beg, const RowView &row_ptrs_end, IndicesView &indices, const Kokkos::View< const GlobalOrdinal *, BufferDevice, Kokkos::MemoryUnmanaged > &imports, const Kokkos::View< const size_t *, BufferDevice, Kokkos::MemoryUnmanaged > &num_packets_per_lid, const Kokkos::View< const LocalOrdinal *, BufferDevice, Kokkos::MemoryUnmanaged > &import_lids, const typename CrsGraph< LocalOrdinal, GlobalOrdinal, Node >::padding_type &padding, const bool unpack_pids, const int myRank, const bool verbose)
Perform the unpack operation for the graph.
Kokkos::Device< typename device_type::execution_space, buffer_memory_space > buffer_device_type
Kokkos::Device specialization for communication buffers.
Base class for distributed Tpetra objects that support data redistribution.
std::unique_ptr< std::string > createPrefix(const int myRank, const char prefix[])
Create string prefix for each line of verbose output.
Description of Tpetra's behavior.
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.