40#ifndef TPETRA_DISTOBJECT_DECL_HPP
41#define TPETRA_DISTOBJECT_DECL_HPP
46#include "Tpetra_Details_DistributorActor.hpp"
47#include "Tpetra_Map.hpp"
48#include "Tpetra_Import.hpp"
49#include "Tpetra_Export.hpp"
52#include "Kokkos_ArithTraits.hpp"
60#ifdef HAVE_TPETRA_TRANSFER_TIMERS
61# undef HAVE_TPETRA_TRANSFER_TIMERS
64namespace KokkosClassic {
159 template<
class DistObjectType>
162 const Teuchos::RCP<
const Map<
typename DistObjectType::local_ordinal_type,
163 typename DistObjectType::global_ordinal_type,
164 typename DistObjectType::node_type> >& newMap);
202 template<
class DistObjectType>
317 template <
class Packet,
323 virtual public Teuchos::Describable
333 using packet_type = typename ::Kokkos::Details::ArithTraits<Packet>::val_type;
356 explicit DistObject (
const Teuchos::RCP<const map_type>& map);
416 const bool restrictedMode =
false);
449 const bool restrictedMode =
false);
483 const bool restrictedMode =
false);
517 const bool restrictedMode =
false);
523 const bool restrictedMode =
false);
529 const bool restrictedMode =
false);
535 const bool restrictedMode =
false);
541 const bool restrictedMode =
false);
547 const bool restrictedMode =
false);
553 const bool restrictedMode =
false);
559 const bool restrictedMode =
false);
565 const bool restrictedMode =
false);
588 virtual Teuchos::RCP<const map_type>
getMap ()
const {
return map_; }
598 void print (std::ostream& os)
const;
615 describe (Teuchos::FancyOStream &out,
616 const Teuchos::EVerbosityLevel verbLevel =
617 Teuchos::Describable::verbLevel_default)
const;
727 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
728 const char modeString[],
731 const bool restrictedMode);
749 const size_t numImportLIDs);
755 ::Tpetra::Details::DefaultTypes::comm_buffer_memory_space<device_type>;
769 Kokkos::Device<
typename device_type::execution_space,
778 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
779 const char modeString[],
782 const bool restrictedMode);
785 const ::Tpetra::Details::Transfer<local_ordinal_type, global_ordinal_type, node_type>& transfer,
786 const char modeString[],
789 const bool restrictedMode);
792 size_t constantNumPackets,
794 std::shared_ptr<std::string> prefix,
795 const bool canTryAliasing,
799 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& exportLIDs,
800 size_t& constantNumPackets);
802 void doUnpackAndCombine(
const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& remoteLIDs,
803 size_t constantNumPackets,
855 const size_t numSameIDs,
905 Kokkos::DualView<
size_t*,
907 size_t& constantNumPackets);
953 Kokkos::DualView<
size_t*,
955 const size_t constantNumPackets,
960 Teuchos::RCP<const map_type>
map_;
963 std::unique_ptr<std::string>
964 createPrefix(
const char className[],
965 const char methodName[])
const;
973 Kokkos::DualView<packet_type*, buffer_device_type>
imports_;
996 const std::string* prefix,
997 const bool remoteLIDsContiguous=
false,
1020 Kokkos::DualView<packet_type*, buffer_device_type>
exports_;
1040 Details::DistributorActor distributorActor_;
1042#ifdef HAVE_TPETRA_TRANSFER_TIMERS
1043 Teuchos::RCP<Teuchos::Time> doXferTimer_;
1044 Teuchos::RCP<Teuchos::Time> copyAndPermuteTimer_;
1045 Teuchos::RCP<Teuchos::Time> packAndPrepareTimer_;
1046 Teuchos::RCP<Teuchos::Time> doPostsAndWaitsTimer_;
1047 Teuchos::RCP<Teuchos::Time> unpackAndCombineTimer_;
ReadWriteOption
Read/write options for non-const views.
Forward declaration of Tpetra::DistObject.
Abstract base class for sources of an Import or Export.
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).
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.
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.
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.
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).
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...
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.