Adaptyst
A comprehensive and architecture-agnostic performance analysis tool
Loading...
Searching...
No Matches
system.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 CERN
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#ifndef SYSTEM_HPP_
5#define SYSTEM_HPP_
6
7#include <string>
8#include <memory>
9#include <unordered_set>
10#include <unordered_map>
11#include <vector>
12#include <filesystem>
13#include <future>
14#include "ir.hpp"
15#include "adaptyst/output.hpp"
16#include "adaptyst/process.hpp"
17
18namespace adaptyst {
19 namespace fs = std::filesystem;
20
22 private:
23 std::string name;
24 Identifiable *parent;
25 std::unordered_map<fs::path, fs::path> paths;
26
27 protected:
28 Identifiable(std::string name) {
29 this->name = name;
30 this->parent = nullptr;
31 }
32
33 inline void throw_error(std::string msg) {
34 throw std::runtime_error(name + ": " + msg);
35 }
36
37 public:
38 std::string &get_name() {
39 return this->name;
40 }
41
42 void set_parent(Identifiable *identifiable) {
43 this->parent = identifiable;
44 }
45
46 std::string get_parent_name() {
47 if (this->parent) {
48 return this->parent->get_name();
49 } else {
50 return "(N/A)";
51 }
52 }
53
54 fs::path &get_path(fs::path start) {
55 if (this->paths.find(start) == this->paths.end()) {
56 std::vector<std::string> chain;
57
58 chain.push_back(this->name);
59
60 Identifiable *current = this->parent;
61
62 while (current) {
63 chain.push_back(current->name);
64 current = current->parent;
65 }
66
67 fs::path result = start;
68
69 for (int i = chain.size() - 1; i >= 0; i--) {
70 result /= chain[i];
71 }
72
73 this->paths[start] = result;
74 }
75
76 return this->paths[start];
77 }
78
79 virtual std::vector<std::string> get_log_types() = 0;
80 virtual std::string get_type() = 0;
81 };
82
83 class Node;
84 class Entity;
85 class System;
86
87 typedef struct InjectPath {
88 std::string name;
90 int read_fd[2];
91 int write_fd[2];
92 std::string path;
94
95 class Module : public Identifiable {
96 public:
97 static std::unordered_map<amod_t, Module *> all_modules;
99
108
109 static std::vector<std::unique_ptr<Module> > get_all_modules(std::vector<fs::path> &library_paths);
110
111 Module(std::string backend_name,
112 std::vector<fs::path> &library_paths);
113 Module(std::string backend_name,
114 std::unordered_map<std::string, std::string> &options,
115 std::unordered_map<std::string, std::vector<std::string>> &array_options,
116 std::vector<fs::path> &library_paths,
117 bool never_directing,
118 bool no_inject);
119 ~Module();
120 bool init(unsigned int buf_size);
121 void process(std::shared_ptr<IR> ir_obj);
122 bool wait();
123 void close();
124 void set_will_profile(bool will_profile);
125 bool get_will_profile();
126 void set_error(std::string error);
127 std::unordered_map<std::string, option> &get_options();
128 std::unique_ptr<Path> &get_dir();
129 std::unordered_set<std::string> &get_tags();
130 std::unordered_map<std::string, OptionMetadata> &get_all_options();
131 void set_dir(fs::path dir);
132 void profile_notify();
133 int profile_wait();
134 std::vector<std::string> get_log_types();
135 std::string get_type();
136 std::string &get_node_name();
137 void set_api_error(std::string msg, int code);
138 int get_api_error_code();
139 std::string &get_api_error_msg();
140 bool is_directing_node();
141 void add_src_code_path(fs::path path);
142 void set_node(Node *node);
143 fs::path &get_tmp_dir();
144 fs::path &get_local_config_dir();
145 bool has_in_tag(std::string tag);
146 bool has_out_tag(std::string tag);
149 bool is_initialising();
150 const char *get_cpu_mask();
151 std::unordered_set<fs::path> &get_src_code_paths();
152 std::string get_name();
153 std::string get_version();
154 std::vector<int> get_version_nums();
155 fs::path &get_lib_path();
156 unsigned int get_max_count_per_entity();
158 fs::path get_inject_lib_path();
159 amod_t get_id();
160 std::shared_ptr<FileDescriptor> get_fd();
161 std::string &receive_string_inject(long timeout_seconds = NO_TIMEOUT);
162 bool is_workflow_running();
164 unsigned long long get_workflow_start_time(bool &err);
165 unsigned long long get_workflow_end_time(bool &err);
166 void region_switch(std::string name, std::string part_id,
167 std::string state, std::string timestamp_str);
168
169 private:
170 amod_t id;
171 std::unordered_map<std::string, option> options;
172 std::unordered_map<std::string, OptionMetadata> option_metadata;
173 std::unique_ptr<Path> dir;
174 bool will_profile;
175 std::string error;
176 void *context;
177 void *handle;
178 fs::path inject_lib_path;
179 bool injecting_process;
180 bool injection_available;
181 std::future<bool> process_future;
182 std::vector<std::string> log_types;
183 std::vector<void *> malloced;
184 std::unordered_set<std::string> tags;
185 Node *node;
186 bool initialised;
187 bool never_directing;
188 int api_error_code;
189 std::string api_error_msg;
190 bool initialising;
191 std::unordered_set<fs::path> src_code_paths;
192 fs::path lib_path;
193 unsigned int max_count_per_entity;
194 int read_fd[2];
195 int write_fd[2];
196 std::shared_ptr<FileDescriptor> fd;
197 std::string last_received_message_inject;
198
199 void construct(std::string backend_name,
200 std::unordered_map<std::string, std::string> &options,
201 std::unordered_map<std::string, std::vector<std::string>> &array_options,
202 std::vector<fs::path> &library_paths, bool never_directing, bool no_inject);
203 };
204
205 class Node : public Identifiable {
206 public:
207 Node(std::string name,
208 std::shared_ptr<Entity> &entity);
209 bool init(unsigned int buf_size);
210 void process(std::shared_ptr<IR> ir_obj);
211 bool wait();
212 void close();
213 std::unordered_set<std::string> &get_tags();
214 void add_in_tags(std::unordered_set<std::string> &tags);
215 void add_out_tags(std::unordered_set<std::string> &tags);
216 bool has_in_tag(std::string tag);
217 bool has_out_tag(std::string tag);
218 void add_module(std::unique_ptr<Module> &mod);
219 void profile_notify();
220 int profile_wait();
223 void set_dir(fs::path path);
224 std::vector<std::string> get_log_types();
225 std::string get_type();
226 bool is_directing();
229 const char *get_cpu_mask();
230 fs::path &get_tmp_dir();
231 fs::path &get_local_config_dir();
232 std::unordered_set<fs::path> get_src_code_paths();
233 std::vector<InjectPath> get_module_inject_paths();
234 bool is_workflow_running();
236 unsigned long long get_workflow_start_time(bool &err);
237 unsigned long long get_workflow_end_time(bool &err);
238 void region_switch(std::string name, std::string part_id,
239 std::string state, std::string timestamp_str);
240
241 private:
242 std::unique_ptr<Path> dir;
243 std::vector<std::unique_ptr<Module> > modules;
244 std::shared_ptr<Entity> entity;
245 std::unordered_set<std::string> tags;
246 std::unordered_set<std::string> in_tags;
247 std::unordered_set<std::string> out_tags;
248 int modules_profiling;
249 std::mutex modules_profiling_mutex;
250 };
251
253 private:
254 std::shared_ptr<Node> departure_node;
255 std::shared_ptr<Node> arrival_node;
256
257 public:
258 NodeConnection(std::string id,
259 std::shared_ptr<Node> &departure_node,
260 std::shared_ptr<Node> &arrival_node);
261 std::shared_ptr<Node> &get_departure_node();
262 std::shared_ptr<Node> &get_arrival_node();
263 std::vector<std::string> get_log_types();
264 std::string get_type();
265 };
266
267 class Entity : public Identifiable {
268 public:
275
276 Entity(std::string id, AccessMode access_mode,
277 unsigned int processing_threads,
278 fs::path local_config_path,
279 fs::path tmp_dir, bool no_inject,
280 unsigned int buf_size);
281 void add_node(std::shared_ptr<Node> &node);
282 void add_connection(std::string id,
283 std::string departure_node,
284 std::string arrival_node);
285 std::shared_ptr<Node> &get_node(std::string id);
286 void set_directing_node(std::string node);
287 std::string get_directing_node();
289 void set_profile_info(profile_info &info);
290 void init();
291 void process(bool save_src_code_paths);
292 void close();
293 void set_entity_dir(fs::path &entity_dir);
294 void profile_notify();
295 int profile_wait();
296 const char *get_cpu_mask();
297 fs::path &get_tmp_dir();
298 fs::path &get_local_config_dir();
299 std::vector<std::shared_ptr<Node> > get_all_nodes();
300 std::vector<std::string> get_log_types();
301 std::string get_type();
302 void set_ir(std::shared_ptr<IR> ir_obj);
303 std::unordered_set<fs::path> &get_src_code_paths();
304 bool is_workflow_running();
306 unsigned long long get_workflow_start_time(bool &err);
307 unsigned long long get_workflow_end_time(bool &err);
308
309 private:
310 AccessMode access_mode;
311 std::unordered_map<std::string, std::shared_ptr<Node> > nodes;
312 std::unordered_map<std::string, std::shared_ptr<NodeConnection> > connections;
313 std::string directing_node;
314 profile_info profiling_info;
315 std::unique_ptr<Path> entity_dir;
316 unsigned int processing_threads;
317 fs::path local_config_path;
318 fs::path tmp_dir;
319 std::string cpu_mask;
320 std::shared_ptr<IR> ir_obj;
321 std::unique_ptr<Process> profiled_process;
322 std::unordered_set<fs::path> src_code_paths;
323 bool src_code_paths_collected;
324 bool workflow_finish_printed;
325 unsigned long long workflow_start_time;
326 bool workflow_start_time_set;
327 std::mutex workflow_finish_print_mutex;
328 std::mutex profile_notify_mutex;
329 int modules_notified;
330 int modules_profiling;
331 bool no_inject;
332 unsigned int buf_size;
333 std::future<void> workflow_comm;
334 unsigned long long workflow_timestamp;
335 bool workflow_timestamp_error;
336 unsigned long long workflow_end_timestamp;
337 bool workflow_end_timestamp_error;
338 bool process_notified;
339 fs::path workflow_stdout_path;
340 fs::path workflow_stderr_path;
341 std::mutex profile_wait_mutex;
342 bool process_finished;
343 int process_exit_code;
344 };
345
346 class System {
347 private:
348 std::unordered_map<std::string, std::shared_ptr<Entity> > entities;
349 std::unordered_map<std::string,
350 std::shared_ptr<NodeConnection> > connections;
351 std::unique_ptr<Path> root_dir;
352 std::variant<fs::path, int> codes_dst;
353 bool custom_src_code_paths_save;
354
355 void init(fs::path def_file, fs::path root_dir,
356 std::vector<fs::path> &library_paths, fs::path local_config_path,
357 fs::path tmp_dir, bool no_inject, unsigned int buf_size);
358 public:
359 System(fs::path def_file, fs::path root_dir,
360 std::vector<fs::path> &library_paths, fs::path local_config_path,
361 fs::path tmp_dir, bool no_inject, unsigned int buf_size);
362 System(fs::path def_file, fs::path root_dir,
363 std::vector<fs::path> &library_paths, fs::path local_config_path,
364 fs::path tmp_dir, bool no_inject, unsigned int buf_size,
365 std::variant<fs::path, int> codes_dst);
366 ~System();
367 void set_ir(std::shared_ptr<IR> ir_obj);
368 void process();
370 };
371};
372
373#endif
unsigned int amod_t
Definition amod_t.h:7
Definition system.hpp:267
void init()
Definition system.cpp:1631
void set_directing_node(std::string node)
Definition system.cpp:1615
int profile_wait()
Definition system.cpp:1838
std::string get_directing_node()
Definition system.cpp:1619
bool is_workflow_ever_run()
Definition system.cpp:2064
unsigned long long get_workflow_start_time(bool &err)
Definition system.cpp:2072
void add_node(std::shared_ptr< Node > &node)
Definition system.cpp:1590
void set_ir(std::shared_ptr< IR > ir_obj)
Definition system.cpp:2038
unsigned long long get_workflow_end_time(bool &err)
Definition system.cpp:2077
void set_profile_info(profile_info &info)
Definition system.cpp:1627
Entity(std::string id, AccessMode access_mode, unsigned int processing_threads, fs::path local_config_path, fs::path tmp_dir, bool no_inject, unsigned int buf_size)
Definition system.cpp:1566
std::vector< std::shared_ptr< Node > > get_all_nodes()
Definition system.cpp:2020
fs::path & get_local_config_dir()
Definition system.cpp:2016
bool is_workflow_running()
Definition system.cpp:2056
void profile_notify()
Definition system.cpp:1800
const char * get_cpu_mask()
Definition system.cpp:1933
std::unordered_set< fs::path > & get_src_code_paths()
Definition system.cpp:2042
void process(bool save_src_code_paths)
Definition system.cpp:1639
profile_info & get_profile_info()
Definition system.cpp:1623
std::vector< std::string > get_log_types()
Definition system.cpp:2030
void set_entity_dir(fs::path &entity_dir)
Definition system.cpp:1791
void add_connection(std::string id, std::string departure_node, std::string arrival_node)
Definition system.cpp:1595
fs::path & get_tmp_dir()
Definition system.cpp:2012
AccessMode
Definition system.hpp:269
@ REMOTE
Definition system.hpp:271
@ CUSTOM_REMOTE
Definition system.hpp:273
@ LOCAL
Definition system.hpp:270
@ CUSTOM
Definition system.hpp:272
void close()
Definition system.cpp:1785
std::shared_ptr< Node > & get_node(std::string id)
Definition system.cpp:1607
std::string get_type()
Definition system.cpp:2034
void set_parent(Identifiable *identifiable)
Definition system.hpp:42
Identifiable(std::string name)
Definition system.hpp:28
fs::path & get_path(fs::path start)
Definition system.hpp:54
virtual std::string get_type()=0
std::string & get_name()
Definition system.hpp:38
virtual std::vector< std::string > get_log_types()=0
void throw_error(std::string msg)
Definition system.hpp:33
std::string get_parent_name()
Definition system.hpp:46
void close()
Definition system.cpp:1157
void add_src_code_path(fs::path path)
Definition system.cpp:1252
std::vector< int > get_version_nums()
Definition system.cpp:693
bool is_workflow_ever_run()
Definition system.cpp:1317
std::string get_type()
Definition system.cpp:1226
const char * get_cpu_mask()
Definition system.cpp:1284
std::unordered_map< std::string, option > & get_options()
Definition system.cpp:1189
std::unordered_set< std::string > & get_tags()
Definition system.cpp:1197
bool has_in_tag(std::string tag)
Definition system.cpp:1264
unsigned long long get_workflow_end_time(bool &err)
Definition system.cpp:1325
unsigned int get_max_count_per_entity()
Definition system.cpp:717
std::string & get_node_name()
Definition system.cpp:1218
unsigned long long get_workflow_start_time(bool &err)
Definition system.cpp:1321
bool is_injection_available()
Definition system.cpp:1292
static std::vector< std::unique_ptr< Module > > get_all_modules(std::vector< fs::path > &library_paths)
Definition system.cpp:620
std::unordered_map< std::string, OptionMetadata > & get_all_options()
Definition system.cpp:1201
void set_will_profile(bool will_profile)
Definition system.cpp:1173
void set_profile_info(profile_info info)
Definition system.cpp:1276
std::shared_ptr< FileDescriptor > get_fd()
Definition system.cpp:1304
int profile_wait()
Definition system.cpp:1214
bool is_initialising()
Definition system.cpp:1280
fs::path & get_lib_path()
Definition system.cpp:713
void set_error(std::string error)
Definition system.cpp:1185
void profile_notify()
Definition system.cpp:1210
std::vector< std::string > get_log_types()
Definition system.cpp:1222
std::string & get_api_error_msg()
Definition system.cpp:1239
~Module()
Definition system.cpp:736
bool get_will_profile()
Definition system.cpp:1181
std::string & receive_string_inject(long timeout_seconds=NO_TIMEOUT)
Definition system.cpp:1308
static amod_t next_module_id
Definition system.hpp:98
std::unique_ptr< Path > & get_dir()
Definition system.cpp:1193
std::string get_name()
Definition system.cpp:653
bool wait()
Definition system.cpp:1147
static std::unordered_map< amod_t, Module * > all_modules
Definition system.hpp:97
fs::path & get_local_config_dir()
Definition system.cpp:1260
fs::path get_inject_lib_path()
Definition system.cpp:1296
int get_api_error_code()
Definition system.cpp:1243
void set_api_error(std::string msg, int code)
Definition system.cpp:1234
bool has_out_tag(std::string tag)
Definition system.cpp:1268
void process(std::shared_ptr< IR > ir_obj)
Definition system.cpp:1130
bool init(unsigned int buf_size)
Definition system.cpp:1091
Module(std::string backend_name, std::vector< fs::path > &library_paths)
Definition system.cpp:721
fs::path & get_tmp_dir()
Definition system.cpp:1256
void set_dir(fs::path dir)
Definition system.cpp:1205
void region_switch(std::string name, std::string part_id, std::string state, std::string timestamp_str)
Definition system.cpp:1329
amod_t get_id()
Definition system.cpp:1300
bool is_directing_node()
Definition system.cpp:1247
std::unordered_set< fs::path > & get_src_code_paths()
Definition system.cpp:1288
profile_info & get_profile_info()
Definition system.cpp:1272
std::string get_version()
Definition system.cpp:673
bool is_workflow_running()
Definition system.cpp:1313
void set_node(Node *node)
Definition system.cpp:1230
std::string get_type()
Definition system.cpp:1562
std::shared_ptr< Node > & get_departure_node()
Definition system.cpp:1550
std::vector< std::string > get_log_types()
Definition system.cpp:1558
NodeConnection(std::string id, std::shared_ptr< Node > &departure_node, std::shared_ptr< Node > &arrival_node)
Definition system.cpp:1543
std::shared_ptr< Node > & get_arrival_node()
Definition system.cpp:1554
Definition system.hpp:205
unsigned long long get_workflow_start_time(bool &err)
Definition system.cpp:1528
std::unordered_set< fs::path > get_src_code_paths()
Definition system.cpp:1475
void profile_notify()
Definition system.cpp:1401
std::string get_type()
Definition system.cpp:1491
void process(std::shared_ptr< IR > ir_obj)
Definition system.cpp:1374
void set_dir(fs::path path)
Definition system.cpp:1443
fs::path & get_tmp_dir()
Definition system.cpp:1467
bool is_workflow_ever_run()
Definition system.cpp:1524
int get_modules_profiling()
Definition system.cpp:1435
const char * get_cpu_mask()
Definition system.cpp:1463
int profile_wait()
Definition system.cpp:1405
std::vector< InjectPath > get_module_inject_paths()
Definition system.cpp:1495
void close()
Definition system.cpp:1391
bool wait()
Definition system.cpp:1380
std::unordered_set< std::string > & get_tags()
Definition system.cpp:1397
void add_module(std::unique_ptr< Module > &mod)
Definition system.cpp:1429
bool has_out_tag(std::string tag)
Definition system.cpp:1425
void add_in_tags(std::unordered_set< std::string > &tags)
Definition system.cpp:1409
bool is_directing()
Definition system.cpp:1451
bool is_workflow_running()
Definition system.cpp:1520
unsigned long long get_workflow_end_time(bool &err)
Definition system.cpp:1532
void set_profile_info(profile_info info)
Definition system.cpp:1459
profile_info & get_profile_info()
Definition system.cpp:1455
std::vector< std::string > get_log_types()
Definition system.cpp:1487
void inc_modules_profiling()
Definition system.cpp:1439
fs::path & get_local_config_dir()
Definition system.cpp:1471
bool has_in_tag(std::string tag)
Definition system.cpp:1421
void add_out_tags(std::unordered_set< std::string > &tags)
Definition system.cpp:1415
Node(std::string name, std::shared_ptr< Entity > &entity)
Definition system.cpp:1345
bool init(unsigned int buf_size)
Definition system.cpp:1351
void region_switch(std::string name, std::string part_id, std::string state, std::string timestamp_str)
Definition system.cpp:1536
Definition system.hpp:346
void process()
Definition system.cpp:2467
void set_ir(std::shared_ptr< IR > ir_obj)
Definition system.cpp:2461
bool with_custom_src_code_paths()
~System()
Definition system.cpp:2455
System(fs::path def_file, fs::path root_dir, std::vector< fs::path > &library_paths, fs::path local_config_path, fs::path tmp_dir, bool no_inject, unsigned int buf_size)
Definition system.cpp:2429
option_type
Definition hw.h:123
Definition archive.cpp:7
struct adaptyst::InjectPath InjectPath
#define NO_TIMEOUT
Definition socket.hpp:25
Definition system.hpp:87
int read_fd[2]
Definition system.hpp:90
std::string name
Definition system.hpp:88
amod_t id
Definition system.hpp:89
int write_fd[2]
Definition system.hpp:91
std::string path
Definition system.hpp:92
Definition system.hpp:100
std::string help
Definition system.hpp:101
option_type array_type
Definition system.hpp:103
unsigned int default_array_value_size
Definition system.hpp:106
void * default_value
Definition system.hpp:104
option_type type
Definition system.hpp:102
void * default_array_value
Definition system.hpp:105
Definition hw.h:166