artdaq_mpich_plugin  v1_00_08a
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  public:
36  MPITransfer(fhicl::ParameterSet pset, Role role);
37 
41  MPITransfer(const MPITransfer&) = delete;
42 
47  MPITransfer& operator=(const MPITransfer&) = delete;
48 
52  virtual ~MPITransfer();
53 
60  CopyStatus transfer_fragment_min_blocking_mode(Fragment const& frag, size_t timeout_usec) override;
61 
67  CopyStatus transfer_fragment_reliable_mode(Fragment&& frag) override;
68 
75  int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
76 
83  int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
84 
89  void flush_buffers() override;
90 
91  private:
92  CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec);
93 
94  void cancelReq_(MPI_Request req) const;
95 
96  // Identify an available buffer.
97  int findAvailable();
98 
99  static std::mutex mpi_mutex_;
100 
101  std::vector<MPI_Request> reqs_;
102  Fragments payload_;
103  int pos_;
104 };
105 } // namespace artdaq
106 
107 #endif // define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
virtual ~MPITransfer()
MPITransfer Destructor.
Definition: MPI_transfer.cc:36
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:46
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:65
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:60
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.