KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
Handler.cpp
Go to the documentation of this file.
1#include "Handler.h"
2
3#include <chrono>
4
6#include "kids/ModelFactory.h"
7#include "kids/Param.h"
8#include "kids/RuleSet.h"
10
11//
12#include "mpi_utils.h"
13
14namespace PROJECT_NS {
15
16
17Handler::Handler(const std::string& solver_name, const std::string& model_name) {
18 model = ModelFactory(model_name);
19 solver = SolverFactory(solver_name, model);
20};
21
22
23int Handler::run(std::shared_ptr<Param>& PM) {
24 std::string hdlr_str = PM->get_string("handler", LOC(), "");
25 if (false) {
26 } else if (hdlr_str == "parallel") {
27 run_parallel(PM);
28 } else if (hdlr_str == "single") {
29 run_single(PM);
30 } else if (hdlr_str == "single_mpi") {
32 } else if (hdlr_str == "sampling") {
33 run_sampling(PM);
34 } else if (hdlr_str == "help") {
35 run_help(PM);
36 } else if (hdlr_str == "help_param") {
38 } else if (hdlr_str == "help_dataset") {
40 } else {
41 throw std::runtime_error("unknown handler type!");
42 }
43 return 0;
44}
45
46int Handler::run_single(std::shared_ptr<Param>& PM) {
47 std::shared_ptr<DataSet> DS = std::shared_ptr<DataSet>(new DataSet());
48 auto begin = std::chrono::steady_clock::now();
49 Status stat;
50 {
51 solver->setInputParam(PM);
52 solver->setInputDataSet(DS);
53 solver->initializeKernel(stat);
54 solver->executeKernel(stat);
55 }
56 auto end = std::chrono::steady_clock::now();
57 double total_time = static_cast<std::chrono::duration<double>>(end - begin).count();
58
59 std::cout << solver->generateInformationString(total_time);
60 std::cout << "Using total time " << total_time << " s\n";
61 return 0;
62}
63
64int Handler::run_single_mpi(std::shared_ptr<Param>& PM) {
65 std::shared_ptr<DataSet> DS = std::shared_ptr<DataSet>(new DataSet());
66 Status stat;
67 auto begin = std::chrono::steady_clock::now();
68 {
69 MPI_Guard guard(1);
70 MPI_Barrier(MPI_COMM_WORLD);
71
72 solver->setInputParam(PM);
73 solver->setInputDataSet(DS);
74 solver->initializeKernel(stat);
75 solver->executeKernel(stat);
76 }
77 auto end = std::chrono::steady_clock::now();
78 double total_time = static_cast<std::chrono::duration<double>>(end - begin).count();
79
80 std::cout << solver->generateInformationString(total_time);
81 std::cout << "Using total time " << total_time << " s\n";
82 return 0;
83}
84
85int Handler::run_parallel(std::shared_ptr<Param>& PM) {
86 std::shared_ptr<DataSet> DS = std::shared_ptr<DataSet>(new DataSet());
87 auto begin = std::chrono::steady_clock::now();
88 Status stat;
89 {
90 solver->setInputParam(PM);
91 solver->setInputDataSet(DS);
92 solver->initializeKernel(stat); // @necessary?
93
94 // get Monte Carlo Dimension from Param
95 int M = PM->get_int("M", LOC(), 1);
96 std::string directory = PM->get_string("directory", LOC(), "default");
97
98 MPI_Guard guard(M);
99 MPI_Barrier(MPI_COMM_WORLD);
100
101 if (MPI_Guard::isroot) std::cout << PM->repr() << std::endl;
102
103 for (int icalc = guard.istart; icalc < guard.iend; ++icalc) {
104 auto mid1 = std::chrono::steady_clock::now();
105
106 stat.icalc = icalc;
107 solver->initializeKernel(stat);
108 auto mid2 = std::chrono::steady_clock::now();
109
110 if (icalc == guard.istart && MPI_Guard::rank == 0) {
111 std::cout << "expect time: "
112 << static_cast<std::chrono::duration<double>>(mid2 - mid1).count() *
113 (guard.iend - guard.istart) //
114 << std::endl;
115 }
116
117 solver->executeKernel(stat);
118 mid2 = std::chrono::steady_clock::now();
119
120 if (icalc == guard.istart && MPI_Guard::isroot) {
121 std::cout << "expect time: "
122 << static_cast<std::chrono::duration<double>>(mid2 - mid1).count() *
123 (guard.iend - guard.istart) //
124 << std::endl;
125 }
126
127
128 solver->finalizeKernel(stat);
129 mid2 = std::chrono::steady_clock::now();
130
131 if (icalc == guard.istart && MPI_Guard::isroot) {
132 std::cout << "expect time: "
133 << static_cast<std::chrono::duration<double>>(mid2 - mid1).count() *
134 (guard.iend - guard.istart) //
135 << std::endl;
136 }
137 }
138 MPI_Barrier(MPI_COMM_WORLD);
139
140 auto collect = solver->getRuleSet()->getResult(1).data();
141 auto reduced = solver->getRuleSet()->getResult(2).data();
142 for (int i = 0; i < collect.size(); ++i) {
143 std::cout << std::get<0>(collect[i]) << "\n";
144 std::cout << std::get<0>(reduced[i]) << "\n";
145 auto [key1, from_data, type1, size1, nframe1] = collect[i];
146 auto [key2, to_data, type2, size2, nframe2] = reduced[i];
147 MPI_Guard::reduce(std::make_tuple(type1, from_data, to_data, size1));
148 }
149 // report time cost
150 if (MPI_Guard::isroot) RuleSet::flush_all(directory, 2);
151 }
152 auto end = std::chrono::steady_clock::now();
153 double total_time = static_cast<std::chrono::duration<double>>(end - begin).count();
154
155 // report time cost
156 if (MPI_Guard::isroot) {
157 std::cout << solver->generateInformationString(total_time);
158 std::cout << "Using total time " << total_time << " s\n";
159 }
160 return 0;
161}
162
163int Handler::run_sampling(std::shared_ptr<Param>& PM) {
164 std::shared_ptr<DataSet> DS = std::shared_ptr<DataSet>(new DataSet());
165 auto begin = std::chrono::steady_clock::now();
166 Status stat;
167 {
168 solver->setInputParam(PM);
169 solver->setInputDataSet(DS);
170 solver->initializeKernel(stat);
171
172 int M = PM->get_int("M", LOC(), 1);
173 int istart, iend;
174
175 MPI_Guard guard(M);
176 MPI_Barrier(MPI_COMM_WORLD);
177
178 if (MPI_Guard::rank == 0) std::cout << PM->repr() << std::endl;
179
180 for (int icalc = guard.istart; icalc < guard.iend; ++icalc) {
181 auto mid1 = std::chrono::steady_clock::now();
182 stat.icalc = icalc;
183 solver->initializeKernel(stat);
184 }
185 }
186 auto end = std::chrono::steady_clock::now();
187 double total_time = static_cast<std::chrono::duration<double>>(end - begin).count();
188
189 // report time cost
190 if (MPI_Guard::isroot) {
191 std::cout << solver->generateInformationString(total_time);
192 std::cout << "Using total time " << total_time << " s\n";
193 }
194 return 0;
195}
196
197int Handler::run_help_dataset(std::shared_ptr<Param>& PM) {
198 {
199 for (auto&& i : VARIABLE_BASE::_LIST) { //
200 std::cout << i->name() << ", " << i->doc() << "\n";
201 }
202 }
203 return 0;
204}
205
206
207}; // namespace PROJECT_NS
this file provides Kernel_Recorder class for trace data in dataset during the dynamics.
Provide struct and interfaces for input parameters.
provide RuleSet class
DataSet class is a tree-structured container for storage of Tensor and other DataSet.
Definition DataSet.h:74
int run(std::shared_ptr< Param > &PM)
Definition Handler.cpp:23
int run_help(std::shared_ptr< Param > &PM)
Definition Handler.h:29
int run_help_dataset(std::shared_ptr< Param > &PM)
Definition Handler.cpp:197
int run_sampling(std::shared_ptr< Param > &PM)
Definition Handler.cpp:163
std::shared_ptr< Kernel > solver
Definition Handler.h:37
int run_single(std::shared_ptr< Param > &PM)
Definition Handler.cpp:46
std::shared_ptr< Kernel > model
Definition Handler.h:36
int run_parallel(std::shared_ptr< Param > &PM)
Definition Handler.cpp:85
Handler(const std::string &solver_name, const std::string &model_name)
Definition Handler.cpp:17
int run_help_param(std::shared_ptr< Param > &PM)
Definition Handler.h:31
int run_single_mpi(std::shared_ptr< Param > &PM)
Definition Handler.cpp:64
static int reduce(const std::tuple< kids_dtype, void *, void *, std::size_t > &info)
static void flush_all(const std::string &path, int level)
Flush data to all output files.
Definition RuleSet.cpp:42
static std::vector< VARIABLE_BASE * > _LIST
Definition Variable.h:43
#define LOC()
show the location information for debug
Definition fmt.h:49
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
std::shared_ptr< Kernel > ModelFactory(const std::string &name)
std::shared_ptr< Kernel > SolverFactory(const std::string &name, std::shared_ptr< Kernel > kmodel)