artdaq_mpich_plugin  v1_00_13
MPITransfer.hh
1 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
2 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
3 
4 #include <vector>
5 
6 #include "artdaq-core/Data/Fragment.hh"
8 #include "artdaq/TransferPlugins/TransferInterface.hh"
9 
10 /*
11  Protocol: want to do a send for each request object, then wait for for
12  pending requests to complete, followed by a reset to allow another set
13  of sends to be completed.
14 
15  This needs to be separated into a thing for sending and a thing for receiving.
16  There probably needs to be a common class that both use.
17 */
18 
19 namespace artdaq {
23 class MPITransfer : public TransferInterface
24 {
25 public:
37  MPITransfer(fhicl::ParameterSet pset, Role role);
38 
42  MPITransfer(const MPITransfer&) = delete;
43 
48  MPITransfer& operator=(const MPITransfer&) = delete;
49 
53  virtual ~MPITransfer();
54 
61  CopyStatus transfer_fragment_min_blocking_mode(Fragment const& frag, size_t timeout_usec) override;
62 
68  CopyStatus transfer_fragment_reliable_mode(Fragment&& frag) override;
69 
76  int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
77 
84  int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
85 
90  void flush_buffers() override;
91 
92 private:
93  CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec);
94 
95  void cancelReq_(MPI_Request req) const;
96 
97  // Identify an available buffer.
98  int findAvailable();
99 
100  static std::mutex mpi_mutex_;
101 
102  std::vector<MPI_Request> reqs_;
103  Fragments payload_;
104  int pos_;
105 };
106 } // namespace artdaq
107 
108 #endif // define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
virtual ~MPITransfer()
MPITransfer Destructor.
Definition: MPI_transfer.cc:38
void flush_buffers() override
Flush any in-flight data. This should be used by the receiver after the receive loop has ended...
Definition: MPI_transfer.cc:49
int receiveFragmentHeader(detail::RawFragmentHeader &header, size_t receiveTimeout) override
Receive a Fragment Header from the transport mechanism.
MPITransfer(fhicl::ParameterSet pset, Role role)
MPITransfer Constructor.
Definition: MPI_transfer.cc:25
CopyStatus transfer_fragment_reliable_mode(Fragment &&frag) override
Move a Fragment to the destination.
Definition: MPI_transfer.cc:73
MPITransfer & operator=(const MPITransfer &)=delete
Copy Assignment operator is deleted.
MPITransfer is a TransferInterface implementation plugin that transfers data using MPI...
Definition: MPITransfer.hh:23
CopyStatus transfer_fragment_min_blocking_mode(Fragment const &frag, size_t timeout_usec) override
Copy a Fragment to the destination. Forces asynchronous send.
Definition: MPI_transfer.cc:67
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.