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>
98 DistObject (
const Teuchos::RCP<const map_type>& map) :
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;
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>
171 describe (Teuchos::FancyOStream &out,
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;
450 prefix = this->createPrefix(
"DistObject", modeString);
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;
481 prefix = this->createPrefix(
"DistObject", modeString);
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)
597 const char modeString[] =
"doImport (reverse mode)";
602 const bool verbose = Behavior::verbose(
"DistObject");
603 std::unique_ptr<std::string> prefix;
605 prefix = this->createPrefix(
"DistObject", modeString);
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;
636 prefix = this->createPrefix(
"DistObject", modeString);
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>
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.");
865 const this_type* srcDistObj =
dynamic_cast<const this_type*
> (&src);
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 ();
889 Distributor& distor = transfer.getDistributor ();
890 const Details::DistributorPlan& distributorPlan = (revOp == DoForward) ? distor.getPlan() : *distor.getPlan().getReversePlan();
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_);
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_);
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;
1085 const this_type* srcDistObj =
dynamic_cast<const this_type*
> (&src);
1087 if (revOp == DoReverse && ! this->isDistributed ()) {
1088 needCommunication =
false;
1097 else if (revOp == DoForward && srcDistObj != NULL &&
1098 ! srcDistObj->isDistributed ()) {
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_);
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>
1133 DistObject<Packet, LocalOrdinal, GlobalOrdinal, Node>::
1134 endTransfer(
const SrcDistObject& src,
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)
1141 using Details::Behavior;
1144 using Details::ProfilingRegion;
1145 using Kokkos::Compat::getArrayView;
1146 using Kokkos::Compat::getConstArrayView;
1147 using Kokkos::Compat::getKokkosViewDeepCopy;
1148 using Kokkos::Compat::create_const_view;
1151 using Details::ProfilingRegion;
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;
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;
1552 ProfilingRegion region_pp
1553 (
"Tpetra::DistObject::doTransferNew::packAndPrepare");
1554 #ifdef HAVE_TPETRA_TRANSFER_TIMERS
1557 Teuchos::TimeMonitor packAndPrepareMon (*packAndPrepareTimer_);
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;
1619 ProfilingRegion region_uc
1620 (
"Tpetra::DistObject::doTransferNew::unpackAndCombine");
1621 #ifdef HAVE_TPETRA_TRANSFER_TIMERS
1624 Teuchos::TimeMonitor unpackAndCombineMon (*unpackAndCombineTimer_);
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>
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>
1712 print (std::ostream& os)
const
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();
1733 comm.getRawPtr(), className, methodName);
1736 template<
class DistObjectType>
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 >;
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.
Declaration of Tpetra::Details::Profiling, a scope guard for Kokkos Profiling.
Declaration and definition of Tpetra::Details::reallocDualViewIfNeeded, an implementation detail of T...
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.
Stand-alone utility functions and macros.
Description of Tpetra's behavior.
static bool debug()
Whether Tpetra is in debug mode.
static bool verbose()
Whether Tpetra is in verbose mode.
Base class for distributed Tpetra objects that support data redistribution.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print a descriptiion of this object to the given output stream.
virtual bool reallocImportsIfNeeded(const size_t newSize, const bool verbose, const std::string *prefix, const bool remoteLIDsContiguous=false, const CombineMode CM=INSERT)
Reallocate imports_ if needed.
virtual bool reallocArraysForNumPacketsPerLid(const size_t numExportLIDs, const size_t numImportLIDs)
Reallocate numExportPacketsPerLID_ and/or numImportPacketsPerLID_, if necessary.
void doImport(const SrcDistObject &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, const CombineMode CM, const bool restrictedMode=false)
Import data into this object using an Import object ("forward mode").
void beginTransfer(const SrcDistObject &src, const ::Tpetra::Details::Transfer< local_ordinal_type, global_ordinal_type, node_type > &transfer, const char modeString[], const ReverseOption revOp, const CombineMode CM, const bool restrictedMode)
Implementation detail of doTransfer.
DistObject(const Teuchos::RCP< const map_type > &map)
Constructor.
virtual void packAndPrepare(const SrcDistObject &source, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &exportLIDs, Kokkos::DualView< packet_type *, buffer_device_type > &exports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, size_t &constantNumPackets)
Pack data and metadata for communication (sends).
Kokkos::Device< typename device_type::execution_space, buffer_memory_space > buffer_device_type
Kokkos::Device specialization for communication buffers.
LocalOrdinal local_ordinal_type
The type of local indices.
virtual void doTransfer(const SrcDistObject &src, const ::Tpetra::Details::Transfer< local_ordinal_type, global_ordinal_type, node_type > &transfer, const char modeString[], const ReverseOption revOp, const CombineMode CM, const bool restrictedMode)
Redistribute data across (MPI) processes.
void print(std::ostream &os) const
Print this object to the given output stream.
virtual void unpackAndCombine(const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &importLIDs, Kokkos::DualView< packet_type *, buffer_device_type > imports, Kokkos::DualView< size_t *, buffer_device_type > numPacketsPerLID, const size_t constantNumPackets, const CombineMode combineMode)
Perform any unpacking and combining after communication.
typename ::Kokkos::Details::ArithTraits< Packet >::val_type packet_type
The type of each datum being sent or received in an Import or Export.
virtual void copyAndPermute(const SrcDistObject &source, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM)
Perform copies and permutations that are local to the calling (MPI) process.
ReverseOption
Whether the data transfer should be performed in forward or reverse mode.
virtual size_t constantNumberOfPackets() const
Whether the implementation's instance promises always to have a constant number of packets per LID (l...
void doExport(const SrcDistObject &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, const CombineMode CM, const bool restrictedMode=false)
Export data into this object using an Export object ("forward mode").
virtual std::string description() const
One-line descriptiion of this object.
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap)
Remove processes which contain no entries in this object's Map.
bool isDistributed() const
Whether this is a globally distributed object.
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
Abstract base class for objects that can be the source of an Import or Export operation.
std::unique_ptr< std::string > createPrefix(const int myRank, const char prefix[])
Create string prefix for each line of verbose output.
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...
std::string dualViewStatusToString(const DualViewType &dv, const char name[])
Return the status of the given Kokkos::DualView, as a human-readable string.
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.
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.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
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.
std::string combineModeToString(const CombineMode combineMode)
Human-readable string representation of the given CombineMode.
CombineMode
Rule for combining data in an Import or Export.
@ ZERO
Replace old values with zero.