14 #ifndef SST_CORE_SIMULATION_IMPL_H
15 #define SST_CORE_SIMULATION_IMPL_H
17 #include "sst/core/clock.h"
18 #include "sst/core/componentInfo.h"
19 #include "sst/core/oneshot.h"
20 #include "sst/core/output.h"
21 #include "sst/core/profile/profiletool.h"
22 #include "sst/core/rankInfo.h"
23 #include "sst/core/simulation.h"
24 #include "sst/core/sst_types.h"
25 #include "sst/core/statapi/statengine.h"
26 #include "sst/core/unitAlgebra.h"
33 #include <unordered_map>
36 extern int main(
int argc,
char** argv);
40 #define _SIM_DBG(fmt, args...) __DBG(DBG_SIM, Sim, fmt, ##args)
41 #define STATALLFLAG "--ALLSTATS--"
49 class SimulatorHeartbeat;
53 class SharedRegionManager;
54 class SimulatorHeartbeat;
62 class SharedRegionManager;
64 namespace Statistics {
65 class StatisticOutput;
66 class StatisticProcessingEngine;
117 virtual void printStatus(
bool fullStatus)
override;
172 void exchangeLinkInfo();
195 bool isIndependentThread() {
return independent; }
197 void printProfilingInfo(FILE* fp);
199 void printPerformanceInfo();
209 const std::vector<SimTime_t>& getInterThreadLatencies()
const {
return interThreadLatencies; }
211 SimTime_t getInterThreadMinLatency()
const {
return interThreadMinLatency; }
213 static TimeConverter* getMinPartTC() {
return minPartTC; }
215 LinkMap* getComponentLinkMap(ComponentId_t
id)
const
217 ComponentInfo* info = compInfoMap.getByID(
id);
218 if (
nullptr == info ) {
return nullptr; }
220 return info->getLinkMap();
232 if (
nullptr != i ) {
return i->getComponent(); }
234 printf(
"Simulation::getComponent() couldn't find component with id = %" PRIu64
"\n",
id);
244 if (
nullptr != i ) {
return i; }
246 printf(
"Simulation::getComponentInfo() couldn't find component with id = %" PRIu64
"\n",
id);
268 uint64_t getTimeVortexMaxDepth()
const;
270 uint64_t getTimeVortexCurrentDepth()
const;
272 uint64_t getSyncQueueDataSize()
const;
302 friend int ::main(
int argc,
char** argv);
317 static void resizeBarriers(uint32_t nthr);
324 static std::mutex simulationMutex;
328 static std::map<LinkId_t, Link*> cross_thread_links;
329 bool direct_interthread;
331 Component* createComponent(ComponentId_t
id,
const std::string& name,
Params& params);
333 TimeVortex* getTimeVortex()
const {
return timeVortex; }
350 friend class SyncManager;
352 TimeVortex* timeVortex;
353 TimeConverter* threadMinPartTC;
354 Activity* current_activity;
355 static SimTime_t minPart;
356 static TimeConverter* minPartTC;
357 std::vector<SimTime_t> interThreadLatencies;
358 SimTime_t interThreadMinLatency;
359 SyncManager* syncManager;
361 ComponentInfoMap compInfoMap;
365 SimulatorHeartbeat* m_heartbeat;
368 static std::atomic<int> untimed_msg_count;
369 unsigned int untimed_phase;
370 volatile sig_atomic_t lastRecvdSignal;
371 ShutdownMode_t shutdown_mode;
386 std::map<std::string, SST::Profile::ProfileTool*> profile_tools;
388 std::map<std::string, std::vector<std::string>> profiler_map;
390 template <
typename T>
391 std::vector<T*> getProfileTool(std::string point)
395 std::vector<std::string>& profilers = profiler_map.at(point);
397 for (
auto& x : profilers ) {
401 T* tool =
dynamic_cast<T*
>(val);
404 Output::getDefaultObject().fatal(
406 "ERROR: wrong type of profiling tool found (name = %s). Check to make sure the profiling "
407 "points enabled for this tool accept the type specified\n",
412 catch ( std::out_of_range& e ) {
415 Output::getDefaultObject().fatal(
417 "INTERNAL ERROR: ProfileTool refered to in profiler_map not found in profile_tools map\n");
422 catch ( std::out_of_range& e ) {
432 #if SST_PERFORMANCE_INSTRUMENTING
436 #if SST_PERIODIC_PRINT
437 uint64_t periodicCounter = 0;
440 #if SST_RUNTIME_PROFILING
441 uint64_t sumtime = 0;
442 uint64_t runtime = 0;
443 struct timeval start, end, diff;
444 struct timeval sumstart, sumend, sumdiff;
448 #if SST_EVENT_PROFILING
449 uint64_t rankLatency = 0;
450 uint64_t messageXferSize = 0;
452 uint64_t rankExchangeBytes = 0;
453 uint64_t rankExchangeEvents = 0;
454 uint64_t rankExchangeCounter = 0;
458 void incrementSerialCounters(uint64_t count);
459 void incrementExchangeCounters(uint64_t events, uint64_t bytes);
463 #if SST_SYNC_PROFILING
464 uint64_t rankSyncCounter = 0;
465 uint64_t rankSyncTime = 0;
466 uint64_t threadSyncCounter = 0;
467 uint64_t threadSyncTime = 0;
469 void incrementSyncTime(
bool rankSync, uint64_t count);
472 #if SST_HIGH_RESOLUTION_CLOCK
473 uint64_t clockDivisor = 1e9;
474 std::string clockResolution =
"ns";
476 uint64_t clockDivisor = 1e6;
477 std::string clockResolution =
"us";
481 SimulationRunMode runMode;
484 SimTime_t currentSimCycle;
486 SimTime_t endSimCycle;
492 std::string output_directory;
493 static SharedRegionManager* sharedRegionManager;
495 double run_phase_start_time;
496 double run_phase_total_time;
497 double init_phase_start_time;
498 double init_phase_total_time;
499 double complete_phase_start_time;
500 double complete_phase_total_time;
502 static std::unordered_map<std::thread::id, Simulation_impl*> instanceMap;
503 static std::vector<Simulation_impl*> instanceVec;
505 friend void wait_my_turn_start();
506 friend void wait_my_turn_end();
513 SimTime_t getNextActivityTime()
const;
521 void wait_my_turn_start(Core::ThreadSafe::Barrier& barrier,
int thread,
int total_threads);
523 void wait_my_turn_end(Core::ThreadSafe::Barrier& barrier,
int thread,
int total_threads);
An Action is a schedulable Activity which is not an Event.
Definition: action.h:27
Base class for all Activities in the SST Event Queue.
Definition: activity.h:46
Main component object for the simulation.
Definition: baseComponent.h:52
A Clock class.
Definition: clock.h:33
Definition: componentInfo.h:250
Definition: componentInfo.h:40
Main component object for the simulation.
Definition: component.h:31
A Configuration Graph A graph representing Components and Links.
Definition: configGraph.h:390
Class to contain SST Simulation Configuration variables.
Definition: config.h:39
Definition: threadsafe.h:48
Definition: threadsafe.h:122
Exit Event Action.
Definition: exit.h:35
Class for instantiating Components, Links and the like out of element libraries.
Definition: factory.h:44
Link between two components.
Definition: link.h:38
A OneShot Event class.
Definition: oneshot.h:33
SSTHandlerBaseNoArgs< void > HandlerBase
Base handler for OneShot callbacks.
Definition: oneshot.h:38
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file.
Definition: output.h:52
Parameter store.
Definition: params.h:56
Definition: rankInfo.h:22
Handlers with 1 handler defined argument to callback from caller.
Definition: ssthandler.h:171
Main control class for a SST Simulation.
Definition: simulation_impl.h:74
void setOutputDirectory(const std::string &outDir)
Set the output directory for this simulation.
Definition: simulation_impl.h:255
TimeConverter * minPartToTC(SimTime_t cycles) const
Get a handle to a TimeConverter.
Definition: simulation.cc:87
SimTime_t getCurrentSimCycle() const override
Return the current simulation time as a cycle count.
Definition: simulation.cc:55
void setup()
Perform the setup() and run phases of the simulation.
Definition: simulation.cc:599
std::map< std::pair< SimTime_t, int >, Clock * > clockMap_t
Definition: simulation_impl.h:125
static Output sim_output
Output.
Definition: simulation_impl.h:377
int getCurrentPriority() const override
Return the current priority.
Definition: simulation.cc:67
ComponentInfo * getComponentInfo(const ComponentId_t &id) const
returns the ComponentInfo object for the given ID
Definition: simulation_impl.h:240
virtual double getRunPhaseElapsedRealTime() const override
Get the amount of real-time spent executing the run phase of the simulation.
Definition: simulation.cc:845
std::string & getOutputDirectory() override
Returns the output directory of the simulation.
Definition: simulation_impl.h:106
UnitAlgebra getElapsedSimTime() const override
Return the elapsed simulation time as a time.
Definition: simulation.cc:73
void insertActivity(SimTime_t time, Activity *ev)
Insert an activity to fire at a specified time.
Definition: simulation.cc:963
SST::Statistics::StatisticProcessingEngine stat_engine
Statistics Engine.
Definition: simulation_impl.h:380
Exit * getExit() const
Return the exit event.
Definition: simulation_impl.h:160
static Factory * factory
Factory used to generate the simulation components.
Definition: simulation_impl.h:315
void initialize()
Perform the init() phase of simulation.
Definition: simulation.cc:518
Cycle_t getNextClockCycle(TimeConverter *tc, int priority=CLOCKPRIORITY)
Returns the next Cycle that the TImeConverter would fire.
Definition: simulation.cc:915
Statistics::StatisticProcessingEngine * getStatisticsProcessingEngine(void)
Return the Statistic Processing Engine associated with this Simulation.
Definition: simulation.cc:988
void processGraphInfo(ConfigGraph &graph, const RankInfo &myRank, SimTime_t min_part)
Processes the ConfigGraph to pull out any need information about relationships among the threads.
Definition: simulation.cc:243
Cycle_t reregisterClock(TimeConverter *tc, Clock::HandlerBase *handler, int priority)
Reactivate an existing clock and handler.
Definition: simulation.cc:903
virtual double getCompletePhaseElapsedRealTime() const override
Get the amount of real-time spent executing the complete phase of the simulation.
Definition: simulation.cc:865
static TimeLord * getTimeLord(void)
Return the TimeLord associated with this Simulation.
Definition: simulation_impl.h:136
SimulationRunMode getSimulationMode() const override
Get the run mode of the simulation (e.g.
Definition: simulation_impl.h:79
bool isWireUpFinished()
Returns true when the Wireup is finished.
Definition: simulation_impl.h:266
RankInfo getNumRanks() const override
Get the number of parallel ranks in the simulation.
Definition: simulation_impl.h:100
virtual void printStatus(bool fullStatus) override
Causes the current status of the simulation to be printed to stderr.
Definition: simulation.cc:830
void complete()
Perform the complete() phase of simulation.
Definition: simulation.cc:563
void intializeProfileTools(const std::string &config)
Performance Tracking Information.
Definition: simulation.cc:1063
virtual void requireLibrary(const std::string &name) override
Signifies that a library is required for this simulation.
Definition: simulation.cc:220
TimeConverter * registerClock(const std::string &freq, Clock::HandlerBase *handler, int priority)
Register a handler to be called on a set frequency.
Definition: simulation.cc:875
static TimeLord timeLord
TimeLord of the simulation.
Definition: simulation_impl.h:375
static Output & getSimulationOutput()
Return the base simulation Output class instance.
Definition: simulation_impl.h:139
static SimTime_t getLocalMinimumNextActivityTime()
Gets the minimum next activity time across all TimeVortices in the Rank.
Definition: simulation.cc:232
RankInfo getRank() const override
Get this instance's parallel rank.
Definition: simulation_impl.h:97
static void shutdown()
Used to signify the end of simulation.
Definition: simulation.cc:153
void endSimulation(void)
Normal Shutdown.
Definition: simulation.cc:764
static Simulation_impl * createSimulation(Config *config, RankInfo my_rank, RankInfo num_ranks)
Create new simulation.
Definition: simulation.cc:139
TimeConverter * registerOneShot(const std::string &timeDelay, OneShot::HandlerBase *handler, int priority)
Register a OneShot event to be called after a time delay Note: OneShot cannot be canceled,...
Definition: simulation.cc:937
SimTime_t getEndSimCycle() const override
Return the end simulation time as a cycle count.
Definition: simulation.cc:61
void unregisterClock(TimeConverter *tc, Clock::HandlerBase *handler, int priority)
Remove a clock handler from the list of active clock handlers.
Definition: simulation.cc:927
const ComponentInfoMap & getComponentInfoMap(void)
Returns reference to the Component Info Map.
Definition: simulation_impl.h:225
static void setSignal(int signal)
Sets an internal flag for signaling the simulation.
Definition: simulation.cc:823
void setStopAtCycle(Config *cfg)
Set cycle count, which, if reached, will cause the simulation to halt.
Definition: simulation.cc:203
UnitAlgebra getEndSimTime() const override
Return the end simulation time as a time.
Definition: simulation.cc:79
BaseComponent * getComponent(const ComponentId_t &id) const
returns the component with the given ID
Definition: simulation_impl.h:228
static Simulation_impl * getSimulation()
Return a pointer to the singleton instance of the Simulation.
Definition: simulation_impl.h:133
static void emergencyShutdown()
Emergency Shutdown Called when a SIGINT or SIGTERM has been seen.
Definition: simulation.cc:746
virtual double getInitPhaseElapsedRealTime() const override
Get the amount of real-time spent executing the init phase of the simulation.
Definition: simulation.cc:855
void adjustTimeAtSimEnd()
Adjust clocks and time to reflect precise simulation end time which may differ in parallel simulation...
Definition: simulation.cc:786
std::map< std::pair< SimTime_t, int >, OneShot * > oneShotMap_t
Definition: simulation_impl.h:126
Main control class for a SST Simulation.
Definition: simulation.h:39
An SST core component that handles timing and event processing informing all registered Statistics to...
Definition: statengine.h:52
A class to convert between a component's view of time and the core's view of time.
Definition: timeConverter.h:27
Class for creating and managing TimeConverter objects.
Definition: timeLord.h:38
Primary Event Queue.
Definition: timeVortex.h:26
Performs Unit math in full precision.
Definition: unitAlgebra.h:109