$treeview $search $mathjax $extrastylesheet
artdaq_mpich_plugin
v1_00_06
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH 00002 #define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH 00003 00004 #include <vector> 00005 00006 #include "artdaq-mpich-plugin/Utilities/quiet_mpi.hh" 00007 #include "artdaq-core/Data/Fragment.hh" 00008 #include "artdaq/TransferPlugins/TransferInterface.hh" 00009 00010 /* 00011 Protocol: want to do a send for each request object, then wait for for 00012 pending requests to complete, followed by a reset to allow another set 00013 of sends to be completed. 00014 00015 This needs to be separated into a thing for sending and a thing for receiving. 00016 There probably needs to be a common class that both use. 00017 */ 00018 00019 namespace artdaq 00020 { 00024 class MPITransfer : public TransferInterface 00025 { 00026 public: 00038 MPITransfer(fhicl::ParameterSet pset, Role role); 00039 00043 MPITransfer(const MPITransfer&) = delete; 00044 00049 MPITransfer& operator=(const MPITransfer&) = delete; 00050 00054 virtual ~MPITransfer(); 00055 00062 CopyStatus transfer_fragment_min_blocking_mode(Fragment const& frag, size_t timeout_usec) override; 00063 00069 CopyStatus transfer_fragment_reliable_mode(Fragment&& frag) override; 00070 00077 int receiveFragmentHeader(detail::RawFragmentHeader& header, size_t receiveTimeout) override; 00078 00085 int receiveFragmentData(RawDataType* destination, size_t wordCount) override; 00086 00091 void flush_buffers() override; 00092 00093 private: 00094 00095 CopyStatus sendFragment(Fragment&& frag, size_t timeout_usec); 00096 00097 void cancelReq_(MPI_Request req) const; 00098 00099 // Identify an available buffer. 00100 int findAvailable(); 00101 00102 static std::mutex mpi_mutex_; 00103 00104 std::vector<MPI_Request> reqs_; 00105 Fragments payload_; 00106 int pos_; 00107 }; 00108 } 00109 00110 #endif //define ARTDAQ_TRANSFERPLUGINS_MPITRANSFER_HH