FairMQ  1.4.33
C++ Message Queuing Library and Framework
FairMQBenchmarkSampler.h
1 /********************************************************************************
2  * Copyright (C) 2014-2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 
9 #ifndef FAIRMQBENCHMARKSAMPLER_H_
10 #define FAIRMQBENCHMARKSAMPLER_H_
11 
12 #include "../FairMQLogger.h"
13 #include "FairMQDevice.h"
14 #include "tools/RateLimit.h"
15 
16 #include <chrono>
17 #include <cstddef> // size_t
18 #include <cstdint> // uint64_t
19 #include <cstring> // memset
20 #include <string>
21 
27 {
28  public:
30  : fMultipart(false)
31  , fMemSet(false)
32  , fNumParts(1)
33  , fMsgSize(10000)
34  , fMsgAlignment(0)
35  , fMsgRate(0)
36  , fNumIterations(0)
37  , fMaxIterations(0)
38  , fOutChannelName()
39  {}
40 
41  void InitTask() override
42  {
43  fMultipart = fConfig->GetProperty<bool>("multipart");
44  fMemSet = fConfig->GetProperty<bool>("memset");
45  fNumParts = fConfig->GetProperty<size_t>("num-parts");
46  fMsgSize = fConfig->GetProperty<size_t>("msg-size");
47  fMsgAlignment = fConfig->GetProperty<size_t>("msg-alignment");
48  fMsgRate = fConfig->GetProperty<float>("msg-rate");
49  fMaxIterations = fConfig->GetProperty<uint64_t>("max-iterations");
50  fOutChannelName = fConfig->GetProperty<std::string>("out-channel");
51  }
52 
53  void Run() override
54  {
55  // store the channel reference to avoid traversing the map on every loop iteration
56  FairMQChannel& dataOutChannel = fChannels.at(fOutChannelName).at(0);
57 
58  LOG(info) << "Starting the benchmark with message size of " << fMsgSize << " and " << fMaxIterations << " iterations.";
59  auto tStart = std::chrono::high_resolution_clock::now();
60 
61  fair::mq::tools::RateLimiter rateLimiter(fMsgRate);
62 
63  while (!NewStatePending()) {
64  if (fMultipart) {
65  FairMQParts parts;
66 
67  for (size_t i = 0; i < fNumParts; ++i) {
68  parts.AddPart(dataOutChannel.NewMessage(fMsgSize, fair::mq::Alignment{fMsgAlignment}));
69  if (fMemSet) {
70  std::memset(parts.At(i)->GetData(), 0, parts.At(i)->GetSize());
71  }
72  }
73 
74  if (dataOutChannel.Send(parts) >= 0) {
75  if (fMaxIterations > 0) {
76  if (fNumIterations >= fMaxIterations) {
77  break;
78  }
79  }
80  ++fNumIterations;
81  }
82  } else {
83  FairMQMessagePtr msg(dataOutChannel.NewMessage(fMsgSize, fair::mq::Alignment{fMsgAlignment}));
84  if (fMemSet) {
85  std::memset(msg->GetData(), 0, msg->GetSize());
86  }
87 
88  if (dataOutChannel.Send(msg) >= 0) {
89  if (fMaxIterations > 0) {
90  if (fNumIterations >= fMaxIterations) {
91  break;
92  }
93  }
94  ++fNumIterations;
95  }
96  }
97 
98  if (fMsgRate > 0) {
99  rateLimiter.maybe_sleep();
100  }
101  }
102 
103  auto tEnd = std::chrono::high_resolution_clock::now();
104 
105  LOG(info) << "Done " << fNumIterations << " iterations in " << std::chrono::duration<double, std::milli>(tEnd - tStart).count() << "ms.";
106  }
107 
108  protected:
109  bool fMultipart;
110  bool fMemSet;
111  size_t fNumParts;
112  size_t fMsgSize;
113  size_t fMsgAlignment;
114  float fMsgRate;
115  uint64_t fNumIterations;
116  uint64_t fMaxIterations;
117  std::string fOutChannelName;
118 };
119 
120 #endif /* FAIRMQBENCHMARKSAMPLER_H_ */
fair::mq::Alignment
Definition: FairMQMessage.h:25
FairMQDevice::fChannels
std::unordered_map< std::string, std::vector< FairMQChannel > > fChannels
Device channels.
Definition: FairMQDevice.h:383
FairMQParts::AddPart
void AddPart(FairMQMessage *msg)
Definition: FairMQParts.h:48
FairMQParts
FairMQParts is a lightweight convenience wrapper around a vector of unique pointers to FairMQMessage,...
Definition: FairMQParts.h:21
FairMQParts::At
std::unique_ptr< FairMQMessage > & At(const int index)
Definition: FairMQParts.h:84
FairMQBenchmarkSampler::Run
void Run() override
Runs the device (to be overloaded in child classes)
Definition: FairMQBenchmarkSampler.h:59
fair::mq::ProgOptions::GetProperty
T GetProperty(const std::string &key) const
Read config property, throw if no property with this key exists.
Definition: ProgOptions.h:69
fair::mq::tools::RateLimiter
Definition: RateLimit.h:42
FairMQChannel::Send
int64_t Send(FairMQMessagePtr &msg, int sndTimeoutInMs=-1)
Definition: FairMQChannel.h:260
FairMQBenchmarkSampler::InitTask
void InitTask() override
Task initialization (can be overloaded in child classes)
Definition: FairMQBenchmarkSampler.h:47
FairMQDevice::fConfig
fair::mq::ProgOptions * fConfig
Pointer to config (internal or external)
Definition: FairMQDevice.h:385
FairMQDevice::NewStatePending
bool NewStatePending() const
Returns true if a new state has been requested, signaling the current handler to stop.
Definition: FairMQDevice.h:470
FairMQChannel
Wrapper class for FairMQSocket and related methods.
Definition: FairMQChannel.h:35
FairMQBenchmarkSampler
Definition: FairMQBenchmarkSampler.h:27
FairMQDevice
Definition: FairMQDevice.h:50

privacy