artdaq_mpich_plugin  v1_00_03
MPITransfer.hh
1 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
2 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
3 
4 #include <vector>
5 
7 #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
20 {
24  class MPITransfer : public TransferInterface
25  {
26  public:
38  MPITransfer(fhicl::ParameterSet pset, Role role);
39 
43  MPITransfer(const MPITransfer&) = delete;
44 
49  MPITransfer& operator=(const MPITransfer&) = delete;
50 
54  virtual ~MPITransfer();
55 
62  CopyStatus copyFragment(Fragment& frag, size_t timeout_usec) override;
63 
69  CopyStatus moveFragment(Fragment&& frag) override;
70 
77  int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override;
78 
85  int receiveFragmentData(RawDataType* destination, size_t wordCount) override;
86 
87  private:
88 
89  CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec);
90 
91  void cancelReq_(MPI_Request req) const;
92 
93  // Identify an available buffer.
94  int findAvailable();
95 
96  static std::mutex mpi_mutex_;
97 
98  std::vector<MPI_Request> reqs_;
99  Fragments payload_;
100  int pos_;
101  };
102 }
103 
104 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH
virtual ~MPITransfer()
MPITransfer Destructor.
Definition: MPI_transfer.cc:45
int receiveFragmentHeader(detail::RawFragmentHeader &header, size_t receiveTimeout) override
Receive a Fragment Header from the transport mechanism.
CopyStatus moveFragment(Fragment &&frag) override
Move a Fragment to the destination.
Definition: MPI_transfer.cc:78
MPITransfer(fhicl::ParameterSet pset, Role role)
MPITransfer Constructor.
Definition: MPI_transfer.cc:26
MPITransfer & operator=(const MPITransfer &)=delete
Copy Assignment operator is deleted.
MPITransfer is a TransferInterface implementation plugin that transfers data using MPI...
Definition: MPITransfer.hh:24
int receiveFragmentData(RawDataType *destination, size_t wordCount) override
Receive the body of a Fragment to the given destination pointer.
CopyStatus copyFragment(Fragment &frag, size_t timeout_usec) override
Copy a Fragment to the destination. Forces asynchronous send.
Definition: MPI_transfer.cc:71