Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_DistObject_decl.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Tpetra: Templated Linear Algebra Services Package
4//
5// Copyright 2008 NTESS and the Tpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef TPETRA_DISTOBJECT_DECL_HPP
11#define TPETRA_DISTOBJECT_DECL_HPP
12
15
16#include "Tpetra_Details_DistributorActor.hpp"
17#include "Tpetra_Map.hpp"
18#include "Tpetra_Import.hpp"
19#include "Tpetra_Export.hpp"
22#include "KokkosKernels_ArithTraits.hpp"
23#include <memory>
24#include <type_traits>
25
26namespace KokkosClassic {
32 ReadWrite = 0,
33 OverwriteAll = 1
34};
35} // namespace KokkosClassic
36
37namespace Tpetra {
38
121template <class DistObjectType>
122void removeEmptyProcessesInPlace(Teuchos::RCP<DistObjectType>& input,
123 const Teuchos::RCP<const Map<typename DistObjectType::local_ordinal_type,
124 typename DistObjectType::global_ordinal_type,
125 typename DistObjectType::node_type> >& newMap);
126
163template <class DistObjectType>
164void removeEmptyProcessesInPlace(Teuchos::RCP<DistObjectType>& input);
165
277template <class Packet,
278 class LocalOrdinal,
279 class GlobalOrdinal,
280 class Node>
281class DistObject : virtual public SrcDistObject,
282 virtual public Teuchos::Describable {
283 public:
285
286
291 using packet_type = typename ::KokkosKernels::ArithTraits<Packet>::val_type;
297 using node_type = Node;
298
300 using device_type = typename Node::device_type;
302 using execution_space = typename device_type::execution_space;
303
306
308
310
314 explicit DistObject(const Teuchos::RCP<const map_type>& map);
315
318
321
324
327
337 virtual ~DistObject() = default;
338
340
342
370 void
373 const CombineMode CM,
374 const bool restrictedMode = false);
375
403 void
406 const CombineMode CM,
407 const bool restrictedMode = false);
408
437 void
440 const CombineMode CM,
441 const bool restrictedMode = false);
442
471 void
474 const CombineMode CM,
475 const bool restrictedMode = false);
476
477 void
478 beginImport(const SrcDistObject& source,
480 const CombineMode CM,
481 const bool restrictedMode = false);
482
483 void
484 beginExport(const SrcDistObject& source,
486 const CombineMode CM,
487 const bool restrictedMode = false);
488
489 void
490 beginImport(const SrcDistObject& source,
492 const CombineMode CM,
493 const bool restrictedMode = false);
494
495 void
496 beginExport(const SrcDistObject& source,
498 const CombineMode CM,
499 const bool restrictedMode = false);
500
501 void
502 endImport(const SrcDistObject& source,
504 const CombineMode CM,
505 const bool restrictedMode = false);
506
507 void
508 endExport(const SrcDistObject& source,
510 const CombineMode CM,
511 const bool restrictedMode = false);
512
513 void
514 endImport(const SrcDistObject& source,
516 const CombineMode CM,
517 const bool restrictedMode = false);
518
519 void
520 endExport(const SrcDistObject& source,
522 const CombineMode CM,
523 const bool restrictedMode = false);
524
527 bool transferArrived() const;
528
530
532
538 bool isDistributed() const;
539
546 virtual Teuchos::RCP<const map_type> getMap() const { return map_; }
547
549
551
556 void print(std::ostream& os) const;
557
559
561
566 virtual std::string description() const;
567
572 virtual void
573 describe(Teuchos::FancyOStream& out,
574 const Teuchos::EVerbosityLevel verbLevel =
575 Teuchos::Describable::verbLevel_default) const;
576
578
580
627 virtual void
628 removeEmptyProcessesInPlace(const Teuchos::RCP<const map_type>& newMap);
629
631 const Details::DistributorActor& getActor() { return distributorActor_; }
632
634
635 protected:
645 DoForward, //*!< Perform the transfer in forward mode.
646 DoReverse //*!< Perform the transfer in reverse mode.
647 };
648
665 virtual size_t constantNumberOfPackets() const;
666
686 virtual void
687 doTransfer(const SrcDistObject& src,
688 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
689 const char modeString[],
690 const ReverseOption revOp,
691 const CombineMode CM,
692 const bool restrictedMode);
693
708 virtual bool
710 const size_t numImportLIDs);
711
715 ::Tpetra::Details::DefaultTypes::comm_buffer_memory_space<device_type>;
716
717 public:
729 Kokkos::Device<typename device_type::execution_space,
731
732 protected:
738 void beginTransfer(const SrcDistObject& src,
739 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
740 const char modeString[],
741 const ReverseOption revOp,
742 const CombineMode CM,
743 const bool restrictedMode);
744
745 void endTransfer(const SrcDistObject& src,
746 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
747 const char modeString[],
748 const ReverseOption revOp,
749 const CombineMode CM,
750 const bool restrictedMode);
751
752 void doPostRecvs(const Details::DistributorPlan& distributorPlan,
753 size_t constantNumPackets,
754 bool commOnHost,
755 std::shared_ptr<std::string> prefix,
756 const bool canTryAliasing,
757 const CombineMode CM);
758
759 void doPostSends(const Details::DistributorPlan& distributorPlan,
760 size_t constantNumPackets,
761 bool commOnHost,
762 std::shared_ptr<std::string> prefix);
763
764 void doPackAndPrepare(const SrcDistObject& src,
765 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
766 size_t& constantNumPackets,
767 const execution_space& space);
768
769 void doUnpackAndCombine(const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& remoteLIDs,
770 size_t constantNumPackets,
772 const execution_space& space);
773
784
785
789 virtual bool
791
821 virtual void
823 const size_t numSameIDs,
824 const Kokkos::DualView<const local_ordinal_type*,
826 const Kokkos::DualView<const local_ordinal_type*,
828 const CombineMode CM);
829
832 virtual void copyAndPermute(
833 const SrcDistObject& source, const size_t numSameIDs,
834 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs,
835 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs,
836 const CombineMode CM, const execution_space& space);
837
875 virtual void
877 const Kokkos::DualView<const local_ordinal_type*,
879 Kokkos::DualView<packet_type*,
880 buffer_device_type>& exports,
881 Kokkos::DualView<size_t*,
884 size_t& constantNumPackets);
885
888 virtual void
890 const Kokkos::DualView<const local_ordinal_type*,
892 Kokkos::DualView<packet_type*,
893 buffer_device_type>& exports,
894 Kokkos::DualView<size_t*,
897 size_t& constantNumPackets,
898 const execution_space& space);
899
939 virtual void
940 unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*,
942 Kokkos::DualView<packet_type*,
944 imports,
945 Kokkos::DualView<size_t*,
948 const size_t constantNumPackets,
950
951 virtual void
952 unpackAndCombine(const Kokkos::DualView<const local_ordinal_type*,
954 Kokkos::DualView<packet_type*,
956 imports,
957 Kokkos::DualView<size_t*,
960 const size_t constantNumPackets,
962 const execution_space& space);
963
965 Teuchos::RCP<const map_type> map_;
966
967 protected:
968 std::unique_ptr<std::string>
969 createPrefix(const char className[],
970 const char methodName[]) const;
971
978 Kokkos::DualView<packet_type*, buffer_device_type> imports_;
979
998 virtual bool
999 reallocImportsIfNeeded(const size_t newSize,
1000 const bool verbose,
1001 const std::string* prefix,
1002 const bool remoteLIDsContiguous = false,
1003 const CombineMode CM = INSERT);
1004
1018 Kokkos::DualView<size_t*, buffer_device_type> numImportPacketsPerLID_;
1019
1025 Kokkos::DualView<packet_type*, buffer_device_type> exports_;
1026
1040 Kokkos::DualView<size_t*, buffer_device_type> numExportPacketsPerLID_;
1041
1042 private:
1044
1045 Details::DistributorActor distributorActor_;
1046
1047}; // class DistObject
1048} // namespace Tpetra
1049
1050#endif // TPETRA_DISTOBJECT_DECL_HPP
ReadWriteOption
Read/write options for non-const views.
Forward declaration of Tpetra::DistObject.
Abstract base class for sources of an Import or Export.
Struct that holds views of the contents of a CrsMatrix.
Base class for distributed Tpetra objects that support data redistribution.
DistObject(const DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy constructor (default).
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.
::Tpetra::Details::DefaultTypes::comm_buffer_memory_space< device_type > buffer_memory_space
Kokkos memory space for communication buffers.
DistObject(DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move constructor (default).
Kokkos::DualView< size_t *, buffer_device_type > numImportPacketsPerLID_
Number of packets to receive for each receive operation.
Kokkos::DualView< packet_type *, buffer_device_type > exports_
Buffer from which packed data are exported (sent to other processes).
Kokkos::DualView< packet_type *, buffer_device_type > imports_
Buffer into which packed data are imported (received from other processes).
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.
bool transferArrived() const
Whether the data from an import/export operation has arrived, and is ready for the unpack and combine...
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).
DistObject & operator=(const DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &)=default
Assignment operator (default).
DistObject & operator=(DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move assignment (default).
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.
typename Node::device_type device_type
The Kokkos Device type.
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.
virtual bool checkSizes(const SrcDistObject &source)=0
Compare the source and target (this) objects for compatibility.
typename device_type::execution_space execution_space
The Kokkos execution space.
void print(std::ostream &os) const
Print this object to the given output stream.
GlobalOrdinal global_ordinal_type
The type of global indices.
Kokkos::DualView< size_t *, buffer_device_type > numExportPacketsPerLID_
Number of packets to send for each send operation.
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.
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.
Teuchos::RCP< const map_type > map_
The Map over which this object is distributed.
ReverseOption
Whether the data transfer should be performed in forward or reverse mode.
Node node_type
The Node type. If you don't know what this is, don't use it.
const Details::DistributorActor & getActor()
Getter for the DistributorActor.
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 Teuchos::RCP< const map_type > getMap() const
The Map describing the parallel distribution of this object.
virtual ~DistObject()=default
Destructor (virtual for memory safety of derived classes).
typename ::KokkosKernels::ArithTraits< Packet >::val_type packet_type
The type of each datum being sent or received in an Import or Export.
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.
A parallel distribution of indices over processes.
Abstract base class for objects that can be the source of an Import or Export operation.
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.
CombineMode
Rule for combining data in an Import or Export.
@ INSERT
Insert new values that don't currently exist.