SST 12.1.0
Structural Simulation Toolkit
syncManager.h
1// Copyright 2009-2022 NTESS. Under the terms
2// of Contract DE-NA0003525 with NTESS, the U.S.
3// Government retains certain rights in this software.
4//
5// Copyright (c) 2009-2022, NTESS
6// All rights reserved.
7//
8// This file is part of the SST software package. For license
9// information, see the LICENSE file in the top level directory of the
10// distribution.
11
12#ifndef SST_CORE_SYNC_SYNCMANAGER_H
13#define SST_CORE_SYNC_SYNCMANAGER_H
14
15#include "sst/core/action.h"
16#include "sst/core/link.h"
17#include "sst/core/rankInfo.h"
18#include "sst/core/sst_types.h"
19#include "sst/core/threadsafe.h"
20
21#include <unordered_map>
22#include <vector>
23
24namespace SST {
25
26class Exit;
27class Simulation_impl;
28// class SyncBase;
29class ThreadSyncQueue;
30class TimeConverter;
31
32class SyncProfileToolList;
33namespace Profile {
34class SyncProfileTool;
35}
36
38{
39public:
40 RankSync(RankInfo num_ranks) : num_ranks(num_ranks) { link_maps.resize(num_ranks.rank); }
41 virtual ~RankSync() {}
42
43 /** Register a Link which this Sync Object is responsible for */
44 virtual ActivityQueue*
45 registerLink(const RankInfo& to_rank, const RankInfo& from_rank, const std::string& name, Link* link) = 0;
46 void exchangeLinkInfo(uint32_t my_rank);
47
48 virtual void execute(int thread) = 0;
49 virtual void exchangeLinkUntimedData(int thread, std::atomic<int>& msg_count) = 0;
50 virtual void finalizeLinkConfigurations() = 0;
51 virtual void prepareForComplete() = 0;
52
53 virtual SimTime_t getNextSyncTime() { return nextSyncTime; }
54
55 // void setMaxPeriod(TimeConverter* period) {max_period = period;}
56 TimeConverter* getMaxPeriod() { return max_period; }
57
58 virtual uint64_t getDataSize() const = 0;
59
60protected:
61 SimTime_t nextSyncTime;
62 TimeConverter* max_period;
63 const RankInfo num_ranks;
64
65 std::vector<std::map<std::string, uintptr_t>> link_maps;
66
67 void finalizeConfiguration(Link* link) { link->finalizeConfiguration(); }
68
69 void prepareForCompleteInt(Link* link) { link->prepareForComplete(); }
70
71 void sendUntimedData_sync(Link* link, Event* data) { link->sendUntimedData_sync(data); }
72
73 inline void setLinkDeliveryInfo(Link* link, uintptr_t info) { link->pair_link->setDeliveryInfo(info); }
74
75 inline Link* getDeliveryLink(Event* ev) { return ev->getDeliveryLink(); }
76
77private:
78};
79
81{
82public:
83 ThreadSync() {}
84 virtual ~ThreadSync() {}
85
86 virtual void before() = 0;
87 virtual void after() = 0;
88 virtual void execute() = 0;
89 virtual void processLinkUntimedData() = 0;
90 virtual void finalizeLinkConfigurations() = 0;
91 virtual void prepareForComplete() = 0;
92
93 virtual SimTime_t getNextSyncTime() { return nextSyncTime; }
94
95 void setMaxPeriod(TimeConverter* period) { max_period = period; }
96 TimeConverter* getMaxPeriod() { return max_period; }
97
98 /** Register a Link which this Sync Object is responsible for */
99 virtual void registerLink(const std::string& name, Link* link) = 0;
100 virtual ActivityQueue* registerRemoteLink(int tid, const std::string& name, Link* link) = 0;
101
102protected:
103 SimTime_t nextSyncTime;
104 TimeConverter* max_period;
105
106 void finalizeConfiguration(Link* link) { link->finalizeConfiguration(); }
107
108 void prepareForCompleteInt(Link* link) { link->prepareForComplete(); }
109
110 void sendUntimedData_sync(Link* link, Event* data) { link->sendUntimedData_sync(data); }
111
112 inline void setLinkDeliveryInfo(Link* link, uintptr_t info) { link->pair_link->setDeliveryInfo(info); }
113
114 inline Link* getDeliveryLink(Event* ev) { return ev->getDeliveryLink(); }
115
116private:
117};
118
119class SyncManager : public Action
120{
121public:
123 const RankInfo& rank, const RankInfo& num_ranks, TimeConverter* minPartTC, SimTime_t min_part,
124 const std::vector<SimTime_t>& interThreadLatencies);
125 virtual ~SyncManager();
126
127 /** Register a Link which this Sync Object is responsible for */
129 registerLink(const RankInfo& to_rank, const RankInfo& from_rank, const std::string& name, Link* link);
130 void exchangeLinkInfo();
131 void execute(void) override;
132
133 /** Cause an exchange of Initialization Data to occur */
134 void exchangeLinkUntimedData(std::atomic<int>& msg_count);
135 /** Finish link configuration */
137 void prepareForComplete();
138
139 void print(const std::string& header, Output& out) const override;
140
141 uint64_t getDataSize() const;
142
143 void addProfileTool(Profile::SyncProfileTool* tool);
144
145private:
146 enum sync_type_t { RANK, THREAD };
147
148 RankInfo rank;
149 RankInfo num_ranks;
150 static Core::ThreadSafe::Barrier RankExecBarrier[6];
151 static Core::ThreadSafe::Barrier LinkUntimedBarrier[3];
152 // static SimTime_t min_next_time;
153 // static int min_count;
154
155 static RankSync* rankSync;
156 static SimTime_t next_rankSync;
157 ThreadSync* threadSync;
158 Exit* exit;
159 Simulation_impl* sim;
160
161 sync_type_t next_sync_type;
162 SimTime_t min_part;
163
164 SyncProfileToolList* profile_tools = nullptr;
165
166 void computeNextInsert();
167
168 NotSerializable(SST::SyncManager)
169};
170
171} // namespace SST
172
173#endif // SST_CORE_SYNC_SYNCMANAGER_H
An Action is a schedulable Activity which is not an Event.
Definition: action.h:27
Base Class for a queue of Activities.
Definition: activityQueue.h:22
Definition: threadsafe.h:48
Exit Event Action.
Definition: exit.h:35
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file.
Definition: output.h:52
Definition: syncProfileTool.h:29
Definition: rankInfo.h:22
Definition: syncManager.h:38
virtual ActivityQueue * registerLink(const RankInfo &to_rank, const RankInfo &from_rank, const std::string &name, Link *link)=0
Register a Link which this Sync Object is responsible for.
Main control class for a SST Simulation.
Definition: simulation_impl.h:77
Definition: syncManager.h:120
ActivityQueue * registerLink(const RankInfo &to_rank, const RankInfo &from_rank, const std::string &name, Link *link)
Register a Link which this Sync Object is responsible for.
Definition: syncManager.cc:293
void finalizeLinkConfigurations()
Finish link configuration.
Definition: syncManager.cc:398
void exchangeLinkUntimedData(std::atomic< int > &msg_count)
Cause an exchange of Initialization Data to occur.
Definition: syncManager.cc:387
void execute(void) override
Function which will be called when the time for this Activity comes to pass.
Definition: syncManager.cc:324
void prepareForComplete()
Prepare for complete() phase.
Definition: syncManager.cc:411
Definition: syncManager.cc:212
Definition: syncManager.h:81
virtual void registerLink(const std::string &name, Link *link)=0
Register a Link which this Sync Object is responsible for.
A class to convert between a component's view of time and the core's view of time.
Definition: timeConverter.h:27