12#ifndef SST_CORE_SYNC_SYNCMANAGER_H
13#define SST_CORE_SYNC_SYNCMANAGER_H
15#include "sst/core/action.h"
16#include "sst/core/link.h"
17#include "sst/core/rankInfo.h"
18#include "sst/core/simulation.h"
19#include "sst/core/sst_types.h"
20#include "sst/core/threadsafe.h"
26#include <unordered_map>
48 explicit RankSync(
RankInfo num_ranks) :
54 virtual ~RankSync() {}
58 void exchangeLinkInfo(uint32_t my_rank);
59 SimTime_t findSyncInterval(uint32_t my_rank);
61 virtual void execute(
int thread) = 0;
62 virtual void exchangeLinkUntimedData(
int thread, std::atomic<int>& msg_count) = 0;
63 virtual void finalizeLinkConfigurations() = 0;
64 virtual void prepareForComplete() = 0;
69 virtual bool getSignals(
int& end,
int& usr,
int& alrm) = 0;
72 virtual void setShutdownFlags(
bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode) = 0;
73 virtual void setCkptFlag(
bool generate_ckpt) = 0;
74 virtual void setFlags(
bool enter_interactive,
bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode) = 0;
76 virtual void getShutdownFlags(
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode) = 0;
77 virtual void getCkptFlag(
bool& generate_ckpt) = 0;
78 virtual void getFlags(
bool& enter_interactive,
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode) = 0;
82 virtual SimTime_t getNextSyncTime() {
return nextSyncTime; }
84 virtual void setRestartTime(SimTime_t time) { nextSyncTime = time; }
86 void setMaxPeriod(SimTime_t period) { max_period = period; }
87 SimTime_t getMaxPeriod() {
return max_period; }
89 virtual uint64_t getDataSize()
const = 0;
91 virtual void setProfileToolList(Profile::SyncProfileToolList* UNUSED(profile_list)) {}
94 SimTime_t nextSyncTime;
96 const RankInfo num_ranks_;
107 std::vector<std::vector<std::pair<uint64_t, uintptr_t>>>
link_maps;
109 void finalizeConfiguration(
Link* link) { link->finalizeConfiguration(); }
111 void prepareForCompleteInt(
Link* link) { link->prepareForComplete(); }
113 void sendUntimedData_sync(Link* link, Event* data) { link->sendUntimedData_sync(data); }
115 inline void setLinkDeliveryInfo(Link* link, uintptr_t info) { link->pair_link->setDeliveryInfo(info); }
117 inline Link* getDeliveryLink(Event* ev) {
return ev->getDeliveryLink(); }
124 virtual ~ThreadSync() {}
126 virtual void before() = 0;
127 virtual void after() = 0;
128 virtual void execute() = 0;
129 virtual void processLinkUntimedData() = 0;
130 virtual void finalizeLinkConfigurations() = 0;
131 virtual void prepareForComplete() = 0;
139 virtual void setShutdownFlags(
bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode) = 0;
140 virtual void setFlags(
bool enter_interactive,
bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode) = 0;
142 virtual void getShutdownFlags(
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode) = 0;
143 virtual void getFlags(
bool& enter_interactive,
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode) = 0;
147 virtual SimTime_t getNextSyncTime() {
return nextSyncTime; }
148 virtual void setRestartTime(SimTime_t time) { nextSyncTime = time; }
150 void setMaxPeriod(SimTime_t period) { max_period = period; }
151 SimTime_t getMaxPeriod() {
return max_period; }
157 virtual SimTime_t findSyncInterval() {
return bit_util::type_max<SimTime_t>; }
159 static SimTime_t updateMinimumLatency(SimTime_t lat = bit_util::type_max<SimTime_t>);
162 SimTime_t nextSyncTime;
163 SimTime_t max_period;
165 void finalizeConfiguration(
Link* link) { link->finalizeConfiguration(); }
167 void prepareForCompleteInt(Link* link) { link->prepareForComplete(); }
169 void sendUntimedData_sync(Link* link, Event* data) { link->sendUntimedData_sync(data); }
171 inline void setLinkDeliveryInfo(Link* link, uintptr_t info) { link->pair_link->setDeliveryInfo(info); }
173 inline Link* getDeliveryLink(Event* ev) {
return ev->getDeliveryLink(); }
191class SyncManager :
public Action
194 SyncManager(
const RankInfo& rank,
const RankInfo& num_ranks, SimTime_t min_part,
195 const std::vector<SimTime_t>& interThreadLatencies,
RealTimeManager* real_time);
197 virtual ~SyncManager() =
default;
201 void exchangeLinkInfo();
202 void handleShutdown();
203 void handleInteractiveConsole();
204 SimTime_t findRankSyncInterval();
205 SimTime_t findThreadSyncInterval();
206 void updateMinPart();
215 void print(
const std::string& header,
Output& out)
const override;
217 uint64_t getDataSize()
const;
219 void setRestartTime(SimTime_t time)
221 rankSync_->setRestartTime(time);
222 threadSync_->setRestartTime(time);
225 std::pair<SimTime_t, SimTime_t> getSyncIntervals()
227 return std::make_pair(rankSync_->getMaxPeriod(), threadSync_->getMaxPeriod());
236 enum sync_type_t { RANK, THREAD };
244 static SimTime_t next_rankSync_;
249 sync_type_t next_sync_type_;
254 static std::atomic<unsigned> ckpt_generate_;
259 void computeNextInsert(SimTime_t next_checkpoint_time = MAX_SIMTIME_T);
260 void setupSyncObjects();
261 void getSimShutdownFlags(
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode);
263 bool& enter_interactive,
bool& enter_shutdown, Simulation::ShutdownMode_t& shutdown_mode,
bool& generate_ckpt);
Base Class for a queue of Activities.
Definition activityQueue.h:22
A recurring event to trigger checkpoint generation.
Definition checkpointAction.h:69
Definition threadsafe.h:50
Exit Action.
Definition exit.h:35
Link between two components.
Definition link.h:57
uintptr_t delivery_info
Holds the delivery information.
Definition link.h:386
SimTime_t latency
Latency of the Link.
Definition link.h:398
Link * pair_link
Pointer to the opposite side of this Link.
Definition link.h:403
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file.
Definition output.h:58
Definition syncManager.h:46
virtual ActivityQueue * registerLink(const RankInfo &to_rank, const RankInfo &from_rank, Link *link)=0
Register a Link which this Sync Object is responsible for.
virtual void setSignals(int end, int usr, int alrm)=0
Set signals to exchange during sync.
std::vector< std::vector< std::pair< uint64_t, uintptr_t > > > link_maps
This uses uint64_t because it is used for two different types of data at different times:
Definition syncManager.h:107
virtual void setShutdownFlags(bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode)=0
Set interactive flags to exchange during sync.
virtual bool getSignals(int &end, int &usr, int &alrm)=0
Return exchanged signals after sync.
virtual void getShutdownFlags(bool &enter_shutdown, Simulation::ShutdownMode_t &shutdown_mode)=0
Return exchanged interactive flags after sync.
virtual void clearFlags()=0
Clear interactive flags before next run.
Class to manage real-time events (signals and alarms).
Definition realtime.h:175
Main control class for a SST Simulation.
Definition simulation.h:121
Definition syncManager.h:192
ActivityQueue * registerLink(const RankInfo &to_rank, const RankInfo &from_rank, Link *link)
Register a Link which this Sync Object is responsible for.
Definition syncManager.cc:453
void finalizeLinkConfigurations()
Finish link configuration.
Definition syncManager.cc:738
void exchangeLinkUntimedData(std::atomic< int > &msg_count)
Cause an exchange of Initialization Data to occur.
Definition syncManager.cc:727
void execute() override
Function which will be called when the time for this Activity comes to pass.
Definition syncManager.cc:538
void prepareForComplete()
Prepare for complete() phase.
Definition syncManager.cc:755
Definition syncQueue.h:100
Definition syncManager.h:121
virtual void setShutdownFlags(bool enter_shutdown, Simulation::ShutdownMode_t shutdown_mode)=0
Set interactive flags to exchange during sync.
virtual void setSignals(int end, int usr, int alrm)=0
Set signals to exchange during sync.
SimTime_t getLatency(Link *link)
Get the latency on the link in units of core atomic time base.
Definition syncManager.h:178
virtual void clearFlags()=0
Clear interactive flags before next run.
virtual void getShutdownFlags(bool &enter_shutdown, Simulation::ShutdownMode_t &shutdown_mode)=0
Return exchanged interactive flags after sync.
virtual void registerLink(Link *link)=0
Register a Link which this Sync Object is responsible for.
uintptr_t getDeliveryInfo(Link *link)
Get the delivery_info for the link.
Definition syncManager.h:183
Link * getPairLink(Link *link)
Get the pair_link.
Definition syncManager.h:188
virtual bool getSignals(int &end, int &usr, int &alrm)=0
Return exchanged signals after sync.
A class to convert between a component's view of time and the core's view of time.
Definition timeConverter.h:31