gem5  v22.1.0.0
dist_iface.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2016 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 /* @file
39  * The interface class for dist gem5 simulations.
40  *
41  * dist-gem5 is an extension to gem5 to enable parallel simulation of a
42  * distributed system (e.g. simulation of a pool of machines
43  * connected by Ethernet links). A dist gem5 run consists of seperate gem5
44  * processes running in parallel. Each gem5 process executes
45  * the simulation of a component of the simulated distributed system.
46  * (An example component can be a dist-core board with an Ethernet NIC.)
47  * The DistIface class below provides services to transfer data and
48  * control messages among the gem5 processes. The main such services are
49  * as follows.
50  *
51  * 1. Send a data packet coming from a simulated Ethernet link. The packet
52  * will be transferred to (all) the target(s) gem5 processes. The send
53  * operation is always performed by the simulation thread, i.e. the gem5
54  * thread that is processing the event queue associated with the simulated
55  * Ethernet link.
56  *
57  * 2. Spawn a receiver thread to process messages coming in from the
58  * from other gem5 processes. Each simulated Ethernet link has its own
59  * associated receiver thread. The receiver thread saves the incoming packet
60  * and schedule an appropriate receive event in the event queue.
61  *
62  * 3. Schedule a global barrier event periodically to keep the gem5
63  * processes in sync.
64  * Periodic barrier event to keep peer gem5 processes in sync. The basic idea
65  * is that no gem5 process can go ahead further than the simulated link
66  * transmission delay to ensure that a corresponding receive event can always
67  * be scheduled for any message coming in from a peer gem5 process.
68  *
69  *
70  *
71  * This interface is an abstract class. It can work with various low level
72  * send/receive service implementations (e.g. TCP/IP, MPI,...). A TCP
73  * stream socket version is implemented in src/dev/net/tcp_iface.[hh,cc].
74  */
75 #ifndef __DEV_DIST_IFACE_HH__
76 #define __DEV_DIST_IFACE_HH__
77 
78 #include <array>
79 #include <mutex>
80 #include <queue>
81 #include <thread>
82 #include <utility>
83 
84 #include "base/logging.hh"
85 #include "dev/net/dist_packet.hh"
86 #include "dev/net/etherpkt.hh"
87 #include "sim/drain.hh"
88 #include "sim/global_event.hh"
89 #include "sim/serialize.hh"
90 
91 namespace gem5
92 {
93 
94 class EventManager;
95 class System;
96 class ThreadContext;
97 
101 class DistIface : public Drainable, public Serializable
102 {
103  public:
105 
106  protected:
109 
110  private:
111  class SyncEvent;
118  class Sync : public Serializable
119  {
120  protected:
124  std::mutex lock;
130  std::condition_variable cv;
135  unsigned waitNum;
139  bool doExit;
143  bool doCkpt;
159  bool isAbort;
160 
161  friend class SyncEvent;
162 
163  public:
171  void init(Tick start, Tick repeat);
177  virtual bool run(bool same_tick) = 0;
184  virtual bool progress(Tick send_tick,
185  Tick next_repeat,
186  ReqType do_ckpt,
187  ReqType do_exit,
188  ReqType do_stop_sync) = 0;
193  void abort();
194 
195  virtual void requestCkpt(ReqType req) = 0;
196  virtual void requestExit(ReqType req) = 0;
197  virtual void requestStopSync(ReqType req) = 0;
198 
199  void drainComplete();
200 
201  virtual void serialize(CheckpointOut &cp) const override = 0;
202  virtual void unserialize(CheckpointIn &cp) override = 0;
203  };
204 
205  class SyncNode: public Sync
206  {
207  private:
220 
221  public:
222 
223  SyncNode();
225  bool run(bool same_tick) override;
226  bool progress(Tick max_req_tick,
227  Tick next_repeat,
228  ReqType do_ckpt,
229  ReqType do_exit,
230  ReqType do_stop_sync) override;
231 
232  void requestCkpt(ReqType req) override;
233  void requestExit(ReqType req) override;
234  void requestStopSync(ReqType req) override;
235 
236  void serialize(CheckpointOut &cp) const override;
237  void unserialize(CheckpointIn &cp) override;
238  };
239 
240  class SyncSwitch: public Sync
241  {
242  private:
246  unsigned numExitReq;
250  unsigned numCkptReq;
254  unsigned numStopSyncReq;
258  unsigned numNodes;
259 
260  public:
261  SyncSwitch(int num_nodes);
263 
264  bool run(bool same_tick) override;
265  bool progress(Tick max_req_tick,
266  Tick next_repeat,
267  ReqType do_ckpt,
268  ReqType do_exit,
269  ReqType do_stop_sync) override;
270 
271  void requestCkpt(ReqType) override {
272  panic("Switch requested checkpoint");
273  }
274  void requestExit(ReqType) override {
275  panic("Switch requested exit");
276  }
277  void requestStopSync(ReqType) override {
278  panic("Switch requested stop sync");
279  }
280 
281  void serialize(CheckpointOut &cp) const override;
282  void unserialize(CheckpointIn &cp) override;
283  };
284 
297  class SyncEvent : public GlobalSyncEvent
298  {
299  private:
303  bool _draining;
304  public:
310 
315  void start();
321  void process() override;
322 
323  bool draining() const { return _draining; }
324  void draining(bool fl) { _draining = fl; }
325  };
334  {
335  private:
341  struct Desc : public Serializable
342  {
346 
347  Desc() : sendTick(0), sendDelay(0) {}
349  packet(p), sendTick(s), sendDelay(d) {}
350  Desc(const Desc &d) :
352 
353  void serialize(CheckpointOut &cp) const override;
354  void unserialize(CheckpointIn &cp) override;
355  };
359  std::queue<Desc> descQueue;
401  Tick calcReceiveTick(Tick send_tick,
402  Tick send_delay,
403  Tick prev_recv_tick);
404 
410 
411  public:
419  prevRecvTick(0), recvDone(nullptr), linkDelay(0),
420  eventManager(em), ckptRestore(false) {}
421 
428  void init(Event *recv_done, Tick link_delay);
440  void pushPacket(EthPacketPtr new_packet,
441  Tick send_tick,
442  Tick send_delay);
443 
444  void serialize(CheckpointOut &cp) const override;
445  void unserialize(CheckpointIn &cp) override;
452  void resumeRecvTicks();
453  };
468  std::thread *recvThread;
477 
478  protected:
482  unsigned rank;
486  unsigned size;
490  static unsigned distIfaceNum;
494  unsigned distIfaceId;
495 
496  bool isPrimary;
497 
498  private:
502  static unsigned recvThreadsNum;
506  static Sync *sync;
519  static System *sys;
523  static bool isSwitch;
524 
525  private:
532  virtual void sendPacket(const Header &header, const EthPacketPtr &packet) = 0;
537  virtual void sendCmd(const Header &header) = 0;
543  virtual bool recvHeader(Header &header) = 0;
550  virtual void recvPacket(const Header &header, EthPacketPtr &packet) = 0;
554  virtual void initTransport() = 0;
561  void spawnRecvThread(const Event *recv_done, Tick link_delay);
565  void recvThreadFunc(Event *recv_done, Tick link_delay);
566 
567  public:
568 
576  DistIface(unsigned dist_rank,
577  unsigned dist_size,
578  Tick sync_start,
579  Tick sync_repeat,
580  EventManager *em,
581  bool use_pseudo_op,
582  bool is_switch,
583  int num_nodes);
584 
585  virtual ~DistIface();
591  void packetOut(EthPacketPtr pkt, Tick send_delay);
601 
602  DrainState drain() override;
603  void drainResume() override;
604  void init(const Event *e, Tick link_delay);
605  void startup();
606 
607  void serialize(CheckpointOut &cp) const override;
608  void unserialize(CheckpointIn &cp) override;
619  static bool readyToExit(Tick delay);
630  static bool readyToCkpt(Tick delay, Tick period);
634  static uint64_t rankParam();
638  static uint64_t sizeParam();
642  static void toggleSync(ThreadContext *tc);
643  };
644 
645 } // namespace gem5
646 
647 #endif // __DEV_DIST_IFACE_HH__
MsgType
The msg type defines what information a dist header packet carries.
Definition: dist_packet.hh:73
Class to encapsulate information about data packets received.
Definition: dist_iface.hh:334
Tick prevRecvTick
The tick when the most recent receive event was processed.
Definition: dist_iface.hh:367
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: dist_iface.cc:587
bool ckptRestore
Flag to set if receive ticks for pending packets need to be recalculated due to changed link latencie...
Definition: dist_iface.hh:409
std::queue< Desc > descQueue
The queue to store the receive descriptors.
Definition: dist_iface.hh:359
Tick linkDelay
The link delay in ticks for the simulated Ethernet link.
Definition: dist_iface.hh:381
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: dist_iface.cc:571
void init(Event *recv_done, Tick link_delay)
Initialize network link parameters.
Definition: dist_iface.cc:432
void resumeRecvTicks()
Adjust receive ticks for pending packets when restoring from a checkpoint.
Definition: dist_iface.cc:464
RecvScheduler(EventManager *em)
Scheduler for the incoming data packets.
Definition: dist_iface.hh:418
EthPacketPtr popPacket()
Fetch the next packet that is to be received by the simulated network link.
Definition: dist_iface.cc:535
void pushPacket(EthPacketPtr new_packet, Tick send_tick, Tick send_delay)
Push a newly arrived packet into the desc queue.
Definition: dist_iface.cc:497
Tick calcReceiveTick(Tick send_tick, Tick send_delay, Tick prev_recv_tick)
Calculate the tick to schedule the next receive done event.
Definition: dist_iface.cc:444
EventManager * eventManager
The event manager associated with the simulated Ethernet link.
Definition: dist_iface.hh:388
Event * recvDone
The receive done event for the simulated Ethernet link.
Definition: dist_iface.hh:374
The global event to schedule periodic dist sync.
Definition: dist_iface.hh:298
bool _draining
Flag to set when the system is draining.
Definition: dist_iface.hh:303
void start()
Schedule the first periodic sync event.
Definition: dist_iface.cc:334
SyncEvent()
Only the firstly instantiated DistIface object will call this constructor.
Definition: dist_iface.hh:309
void process() override
This is a global event so process() will only be called by exactly one simulation thread.
Definition: dist_iface.cc:368
void requestExit(ReqType req) override
Definition: dist_iface.cc:282
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: dist_iface.cc:307
ReqType needStopSync
Sync stop requested.
Definition: dist_iface.hh:219
bool progress(Tick max_req_tick, Tick next_repeat, ReqType do_ckpt, ReqType do_exit, ReqType do_stop_sync) override
Callback when the receiver thread gets a sync ack message.
Definition: dist_iface.cc:243
void requestCkpt(ReqType req) override
Definition: dist_iface.cc:271
bool run(bool same_tick) override
Core method to perform a full dist sync.
Definition: dist_iface.cc:127
ReqType needCkpt
Ckpt requested.
Definition: dist_iface.hh:215
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: dist_iface.cc:314
void requestStopSync(ReqType req) override
Definition: dist_iface.cc:847
ReqType needExit
Exit requested.
Definition: dist_iface.hh:211
bool run(bool same_tick) override
Core method to perform a full dist sync.
Definition: dist_iface.cc:159
SyncSwitch(int num_nodes)
Definition: dist_iface.cc:97
unsigned numExitReq
Counter for recording exit requests.
Definition: dist_iface.hh:246
void requestExit(ReqType) override
Definition: dist_iface.hh:274
void requestStopSync(ReqType) override
Definition: dist_iface.hh:277
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: dist_iface.cc:322
void requestCkpt(ReqType) override
Definition: dist_iface.hh:271
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: dist_iface.cc:328
unsigned numCkptReq
Counter for recording ckpt requests.
Definition: dist_iface.hh:250
bool progress(Tick max_req_tick, Tick next_repeat, ReqType do_ckpt, ReqType do_exit, ReqType do_stop_sync) override
Callback when the receiver thread gets a sync ack message.
Definition: dist_iface.cc:202
unsigned numStopSyncReq
Counter for recording stop sync requests.
Definition: dist_iface.hh:254
unsigned numNodes
Number of connected simulated nodes.
Definition: dist_iface.hh:258
This class implements global sync operations among gem5 peer processes.
Definition: dist_iface.hh:119
bool isAbort
Flag is set if the sync is aborted (e.g.
Definition: dist_iface.hh:159
Tick nextRepeat
The repeat value for the next periodic sync.
Definition: dist_iface.hh:151
bool doStopSync
Flag is set if sync is to stop upon sync completion.
Definition: dist_iface.hh:147
unsigned waitNum
Number of receiver threads that not yet completed the current global synchronisation.
Definition: dist_iface.hh:135
void init(Tick start, Tick repeat)
Initialize periodic sync params.
Definition: dist_iface.cc:70
Tick nextAt
Tick for the next periodic sync (if the event is not scheduled yet)
Definition: dist_iface.hh:155
bool doExit
Flag is set if exit is permitted upon sync completion.
Definition: dist_iface.hh:139
virtual void requestStopSync(ReqType req)=0
virtual bool run(bool same_tick)=0
Core method to perform a full dist sync.
virtual void requestExit(ReqType req)=0
virtual void requestCkpt(ReqType req)=0
std::mutex lock
The lock to protect access to the Sync object.
Definition: dist_iface.hh:124
std::condition_variable cv
Condition variable for the simulation thread to wait on until all receiver threads completes the curr...
Definition: dist_iface.hh:130
virtual bool progress(Tick send_tick, Tick next_repeat, ReqType do_ckpt, ReqType do_exit, ReqType do_stop_sync)=0
Callback when the receiver thread gets a sync ack message.
virtual void serialize(CheckpointOut &cp) const override=0
Serialize an object.
void abort()
Abort processing an on-going sync event (in case of an error, e.g.
Definition: dist_iface.cc:88
bool doCkpt
Flag is set if taking a ckpt is permitted upon sync completion.
Definition: dist_iface.hh:143
virtual void unserialize(CheckpointIn &cp) override=0
Unserialize an object.
The interface class to talk to peer gem5 processes.
Definition: dist_iface.hh:102
static uint64_t rankParam()
Getter for the dist rank param.
Definition: dist_iface.cc:916
virtual void initTransport()=0
Init hook for the underlaying transport.
RecvScheduler recvScheduler
Meta information about data packets received.
Definition: dist_iface.hh:472
static bool readyToExit(Tick delay)
Initiate the exit from the simulation.
Definition: dist_iface.cc:891
bool syncStartOnPseudoOp
Use pseudoOp to start synchronization.
Definition: dist_iface.hh:476
static void toggleSync(ThreadContext *tc)
Trigger the primary to start/stop synchronization.
Definition: dist_iface.cc:854
static bool readyToCkpt(Tick delay, Tick period)
Initiate taking a checkpoint.
Definition: dist_iface.cc:823
void init(const Event *e, Tick link_delay)
Definition: dist_iface.cc:786
unsigned rank
The rank of this process among the gem5 peers.
Definition: dist_iface.hh:482
unsigned distIfaceId
Unique id for the dist link.
Definition: dist_iface.hh:494
static DistIface * primary
The very first DistIface object created becomes the primary interface.
Definition: dist_iface.hh:515
DistHeaderPkt::MsgType MsgType
Definition: dist_iface.hh:107
static uint64_t sizeParam()
Getter for the dist size param.
Definition: dist_iface.cc:929
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition: dist_iface.cc:730
std::thread * recvThread
Receiver thread pointer.
Definition: dist_iface.hh:468
static SyncEvent * syncEvent
The singleton SyncEvent object to schedule periodic dist sync.
Definition: dist_iface.hh:510
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: dist_iface.cc:767
static System * sys
System pointer used to wakeup sleeping threads when stopping sync.
Definition: dist_iface.hh:519
EthPacketPtr packetIn()
Fetch the packet scheduled to be received next by the simulated network link.
Definition: dist_iface.hh:600
void recvThreadFunc(Event *recv_done, Tick link_delay)
The function executed by a receiver thread.
Definition: dist_iface.cc:672
virtual void sendCmd(const Header &header)=0
Send out a control command to the remote end.
virtual bool recvHeader(Header &header)=0
Receive a header (i.e.
static Sync * sync
The singleton Sync object to perform dist synchronisation.
Definition: dist_iface.hh:506
virtual void sendPacket(const Header &header, const EthPacketPtr &packet)=0
Send out a data packet to the remote end.
static unsigned distIfaceNum
Number of DistIface objects (i.e.
Definition: dist_iface.hh:490
void drainResume() override
Resume execution after a successful drain.
Definition: dist_iface.cc:740
virtual ~DistIface()
Definition: dist_iface.cc:634
void spawnRecvThread(const Event *recv_done, Tick link_delay)
spawn the receiver thread.
Definition: dist_iface.cc:718
static bool isSwitch
Is this node a switch?
Definition: dist_iface.hh:523
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: dist_iface.cc:748
virtual void recvPacket(const Header &header, EthPacketPtr &packet)=0
Receive a packet from the remote end.
Tick syncRepeat
Frequency of dist sync events in ticks.
Definition: dist_iface.hh:463
Tick syncStart
Tick to schedule the first dist sync event.
Definition: dist_iface.hh:459
DistHeaderPkt::Header Header
Definition: dist_iface.hh:104
static unsigned recvThreadsNum
Number of receiver threads (in this gem5 process)
Definition: dist_iface.hh:502
DistIface(unsigned dist_rank, unsigned dist_size, Tick sync_start, Tick sync_repeat, EventManager *em, bool use_pseudo_op, bool is_switch, int num_nodes)
ctor
Definition: dist_iface.cc:605
void packetOut(EthPacketPtr pkt, Tick send_delay)
Send out an Ethernet packet.
Definition: dist_iface.cc:650
unsigned size
The number of gem5 processes comprising this dist simulation.
Definition: dist_iface.hh:486
DistHeaderPkt::ReqType ReqType
Definition: dist_iface.hh:108
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:235
A special global event that synchronizes all threads and forces them to process asynchronously enqueu...
Basic support for object serialization.
Definition: serialize.hh:170
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Global events and related declarations.
DrainState
Object drain/handover states.
Definition: drain.hh:75
static const Priority Sim_Exit_Pri
If we want to exit on this cycle, it's the very last thing we do.
Definition: eventq.hh:234
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:178
Bitfield< 9 > e
Definition: misc_types.hh:65
Bitfield< 9 > d
Definition: misc_types.hh:64
Bitfield< 1 > s
Definition: pagetable.hh:64
Bitfield< 54 > p
Definition: pagetable.hh:70
Bitfield< 2 > em
Definition: misc.hh:607
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
std::ostream CheckpointOut
Definition: serialize.hh:66
uint64_t Tick
Tick count type.
Definition: types.hh:58
std::shared_ptr< EthPacketData > EthPacketPtr
Definition: etherpkt.hh:90
output header
Definition: nop.cc:36
Received packet descriptor.
Definition: dist_iface.hh:342
Desc(EthPacketPtr p, Tick s, Tick d)
Definition: dist_iface.hh:348
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: dist_iface.cc:554
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: dist_iface.cc:562

Generated on Wed Dec 21 2022 10:22:34 for gem5 by doxygen 1.9.1