HybridADRSolver
Loading...
Searching...
No Matches
utils.h
Go to the documentation of this file.
1
10
11#ifndef BENCHMARK_UTILS_H
12#define BENCHMARK_UTILS_H
13
14#include <fstream>
15#include <iomanip>
16#include <iostream>
17#include <mpi.h>
18#include <sstream>
19#include <string>
20#include <vector>
21
22namespace BenchmarkUtils {
23
28 // Configuration
29 std::string solver_type; // "matrix_based" or "matrix_free"
30 std::string test_type; // "strong_scaling" or "weak_scaling"
31 int n_mpi_processes; // number of processes
32 int n_threads_per_process; // number of threads per process
35
36 // Problem size
37 unsigned int n_dofs;
38 unsigned int n_cells;
39
40 // Timing results (in seconds)
41 double setup_time;
43 double solve_time;
44 double total_time;
45
46 // Solver performance
47 unsigned int n_iterations;
48 double l2_error;
49
50 // Memory usage (in MB)
51 double memory_mb;
52
53 // Derived metrics
54 double dofs_per_second; // Throughput
55 double parallel_efficiency; // For scaling analysis
56
60 static std::string csv_header() {
61 return "solver_type,test_type,n_mpi,n_threads,total_cores,"
62 "n_refinements,poly_degree,n_dofs,n_cells,"
63 "setup_time,assembly_time,solve_time,total_time,"
64 "n_iterations,l2_error,memory_mb,"
65 "dofs_per_second,parallel_efficiency";
66 }
67
71 std::string to_csv() const {
72 std::ostringstream oss;
73 oss << std::fixed << std::setprecision(6);
74 oss << solver_type << "," << test_type << "," << n_mpi_processes << ","
75 << n_threads_per_process << ","
77 << "," << polynomial_degree << "," << n_dofs << "," << n_cells
78 << "," << setup_time << "," << assembly_time << "," << solve_time
79 << "," << total_time << "," << n_iterations << "," << l2_error
80 << "," << memory_mb << "," << dofs_per_second << ","
82 return oss.str();
83 }
84};
85
90public:
91 ResultCollector(const std::string& output_file, MPI_Comm comm)
92 : filename(output_file), communicator(comm) {
93 MPI_Comm_rank(comm, &rank);
94 }
95
96 void add_result(const BenchmarkResult& result) {
97 results.push_back(result);
98 }
99
103 void write_csv() const {
104 if (rank != 0)
105 return;
106
107 std::ofstream ofs(filename);
108 ofs << BenchmarkResult::csv_header() << "\n";
109 for (const auto& r : results) {
110 ofs << r.to_csv() << "\n";
111 }
112 ofs.close();
113 }
114
118 void print_summary() const {
119 if (rank != 0)
120 return;
121
122 std::cout << "\n" << std::string(80, '=') << "\n";
123 std::cout << "BENCHMARK SUMMARY\n";
124 std::cout << std::string(80, '=') << "\n\n";
125
126 std::cout << std::left << std::setw(15) << "Solver" << std::setw(10)
127 << "MPI" << std::setw(10) << "Threads" << std::setw(12)
128 << "DoFs" << std::setw(12) << "Total(s)" << std::setw(12)
129 << "Memory(MB)" << std::setw(15) << "DoFs/s"
130 << "\n";
131 std::cout << std::string(80, '-') << "\n";
132
133 for (const auto& r : results) {
134 std::cout << std::left << std::setw(15) << r.solver_type
135 << std::setw(10) << r.n_mpi_processes << std::setw(10)
136 << r.n_threads_per_process << std::setw(12) << r.n_dofs
137 << std::fixed << std::setprecision(3) << std::setw(12)
138 << r.total_time << std::setw(12) << r.memory_mb
139 << std::scientific << std::setprecision(2)
140 << std::setw(15) << r.dofs_per_second << "\n";
141 }
142 std::cout << std::string(80, '=') << "\n";
143 }
144
145private:
146 std::string filename;
147 MPI_Comm communicator;
148 int rank;
149 std::vector<BenchmarkResult> results;
150};
151
155class Timer {
156public:
157 void start() { start_time = MPI_Wtime(); }
158 void stop() { elapsed = MPI_Wtime() - start_time; }
159 double get_elapsed() const { return elapsed; }
160
161private:
162 double start_time = 0.0;
163 double elapsed = 0.0;
164};
165
173inline double compute_efficiency(const double t1, const double tp, int p) {
174 if (tp <= 0 || p <= 0)
175 return 0.0;
176 return t1 / (p * tp);
177}
178
182inline double compute_speedup(const double t1, const double tp) {
183 if (tp <= 0)
184 return 0.0;
185 return t1 / tp;
186}
187
191inline double get_process_memory_mb() {
192 double vm_rss = 0.0;
193 std::ifstream status("/proc/self/status");
194 std::string line;
195 while (std::getline(status, line)) {
196 if (line.substr(0, 6) == "VmRSS:") {
197 std::istringstream iss(line.substr(6));
198 iss >> vm_rss; // Value in kB
199 vm_rss /= 1024.0; // Convert to MB
200 break;
201 }
202 }
203 return vm_rss;
204}
205
218
219} // namespace BenchmarkUtils
220
221#endif // BENCHMARK_UTILS_H
void print_summary() const
Print summary to stdout (only rank 0)
Definition utils.h:118
ResultCollector(const std::string &output_file, MPI_Comm comm)
Definition utils.h:91
void write_csv() const
Write all results to CSV file (only rank 0)
Definition utils.h:103
void add_result(const BenchmarkResult &result)
Definition utils.h:96
High-resolution timer using MPI_Wtime for consistency.
Definition utils.h:155
void start()
Definition utils.h:157
void stop()
Definition utils.h:158
double get_elapsed() const
Definition utils.h:159
Definition utils.h:22
double compute_speedup(const double t1, const double tp)
Compute speedup.
Definition utils.h:182
double get_process_memory_mb()
Get memory info from /proc/self/status (Linux specific)
Definition utils.h:191
double compute_efficiency(const double t1, const double tp, int p)
Compute parallel efficiency.
Definition utils.h:173
Structure to hold benchmark results for a single run.
Definition utils.h:27
int polynomial_degree
Definition utils.h:34
double solve_time
Definition utils.h:43
unsigned int n_cells
Definition utils.h:38
double parallel_efficiency
Definition utils.h:55
static std::string csv_header()
Get CSV header line.
Definition utils.h:60
double setup_time
Definition utils.h:41
std::string to_csv() const
Convert result to CSV line.
Definition utils.h:71
std::string solver_type
Definition utils.h:29
double assembly_time
Definition utils.h:42
unsigned int n_dofs
Definition utils.h:37
int n_threads_per_process
Definition utils.h:32
double total_time
Definition utils.h:44
unsigned int n_iterations
Definition utils.h:47
double memory_mb
Definition utils.h:51
double dofs_per_second
Definition utils.h:54
std::string test_type
Definition utils.h:30
double l2_error
Definition utils.h:48
int n_refinements
Definition utils.h:33
int n_mpi_processes
Definition utils.h:31
Configuration for scaling tests.
Definition utils.h:209
int n_timed_runs
Definition utils.h:214
int min_refinements
Definition utils.h:210
bool test_matrix_based
Definition utils.h:215
int max_refinements
Definition utils.h:211
bool test_matrix_free
Definition utils.h:216
int polynomial_degree
Definition utils.h:212
int n_warmup_runs
Definition utils.h:213