Skip to content

Commit 254373c

Browse files
committed
Use Google Benchmark for performance tables
1 parent c358e80 commit 254373c

26 files changed

Lines changed: 867 additions & 1140 deletions

File tree

.github/workflows/perf.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
tar -xzvf ubuntu-gcc-install-ubuntu-24.04.tar.gz -C install
3131
- name: Run perf tests
3232
run: |
33-
bash -e scripts/generate_perf_results.sh
33+
scripts/run_tests.py --running-type=performance
3434
env:
3535
PPC_NUM_PROC: 2
3636
PPC_NUM_THREADS: 2
@@ -68,7 +68,7 @@ jobs:
6868
tar -xzvf macos-clang-install.tar.gz -C install
6969
- name: Run perf tests
7070
run: |
71-
bash -e scripts/generate_perf_results.sh
71+
scripts/run_tests.py --running-type=performance
7272
env:
7373
PPC_NUM_PROC: 1
7474
PPC_NUM_THREADS: 2

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@
1313
[submodule "3rdparty/libenvpp"]
1414
path = 3rdparty/libenvpp
1515
url = https://github.com/ph3at/libenvpp
16+
[submodule "3rdparty/benchmark"]
17+
path = 3rdparty/benchmark
18+
url = https://github.com/google/benchmark

3rdparty/benchmark

Submodule benchmark added at a846068

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ endforeach()
4444

4545
message( STATUS "PPC step: Setup external projects" )
4646
include(cmake/gtest.cmake)
47+
include(cmake/benchmark.cmake)
4748

4849
############################## Modules ##############################
4950

cmake/benchmark.cmake

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
include_guard()
2+
3+
include(ExternalProject)
4+
5+
ExternalProject_Add(
6+
ppc_benchmark
7+
SOURCE_DIR "${CMAKE_SOURCE_DIR}/3rdparty/benchmark"
8+
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark"
9+
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build"
10+
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/install"
11+
EXCLUDE_FROM_ALL TRUE
12+
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
13+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
14+
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
15+
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
16+
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
17+
-DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}
18+
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
19+
${PPC_EXTERNAL_PROJECT_CMAKE_ARGS}
20+
-DCMAKE_C_FLAGS=-w
21+
-DCMAKE_CXX_FLAGS=-w
22+
-DBENCHMARK_ENABLE_TESTING=OFF
23+
-DBENCHMARK_ENABLE_GTEST_TESTS=OFF
24+
-DBENCHMARK_ENABLE_WERROR=OFF
25+
-DBENCHMARK_ENABLE_INSTALL=ON
26+
-DBENCHMARK_ENABLE_LIBPFM=OFF
27+
BUILD_COMMAND
28+
"${CMAKE_COMMAND}" --build "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build"
29+
--config $<CONFIG> --parallel
30+
INSTALL_COMMAND
31+
"${CMAKE_COMMAND}" --install
32+
"${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/build" --config $<CONFIG>
33+
--prefix "${CMAKE_CURRENT_BINARY_DIR}/ppc_benchmark/install"
34+
${PPC_EXTERNAL_PROJECT_LOG_ARGS})
35+
36+
function(ppc_include_benchmark target_name)
37+
target_include_directories(
38+
${target_name} PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/benchmark/include)
39+
target_compile_definitions(${target_name} PUBLIC BENCHMARK_STATIC_DEFINE)
40+
endfunction()
41+
42+
function(ppc_link_benchmark target_name)
43+
ppc_include_benchmark(${target_name})
44+
add_dependencies(${target_name} ppc_benchmark)
45+
target_link_directories(${target_name} PUBLIC
46+
"${CMAKE_BINARY_DIR}/ppc_benchmark/install/lib")
47+
target_link_libraries(${target_name} PUBLIC benchmark Threads::Threads)
48+
if(WIN32)
49+
target_link_libraries(${target_name} PUBLIC shlwapi)
50+
endif()
51+
endfunction()

modules/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ set_target_properties(${exec_func_lib} PROPERTIES LINKER_LANGUAGE CXX)
2626
target_include_directories(
2727
${exec_func_lib} PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty
2828
${CMAKE_SOURCE_DIR}/modules ${CMAKE_SOURCE_DIR}/tasks)
29+
ppc_include_benchmark(${exec_func_lib})
2930

3031
foreach(
3132
link

modules/performance/include/performance.hpp

Lines changed: 0 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,6 @@
22

33
#include <cstdint>
44
#include <functional>
5-
#include <iomanip>
6-
#include <iostream>
7-
#include <memory>
8-
#include <sstream>
9-
#include <stdexcept>
10-
#include <string>
11-
12-
#include "task/include/task.hpp"
13-
#include "util/include/util.hpp"
145

156
namespace ppc::performance {
167

@@ -27,107 +18,4 @@ struct PerfAttr {
2718
/// @endcond
2819
};
2920

30-
struct PerfResults {
31-
/// @brief Measured execution time in seconds.
32-
double time_sec = 0.0;
33-
enum class TypeOfRunning : uint8_t {
34-
kPipeline,
35-
kTaskRun,
36-
kNone,
37-
};
38-
TypeOfRunning type_of_running = TypeOfRunning::kNone;
39-
constexpr static double kMaxTime = 10.0;
40-
};
41-
42-
template <typename InType, typename OutType>
43-
class Perf {
44-
public:
45-
// Init performance analysis with an initialized task and initialized data
46-
explicit Perf(const ppc::task::TaskPtr<InType, OutType> &task_ptr) : task_(task_ptr) {
47-
task_ptr->GetStateOfTesting() = ppc::task::StateOfTesting::kPerf;
48-
}
49-
// Check performance of full task's pipeline: PreProcessing() ->
50-
// Validation() -> Run() -> PostProcessing()
51-
void PipelineRun(const PerfAttr &perf_attr) {
52-
perf_results_.type_of_running = PerfResults::TypeOfRunning::kPipeline;
53-
54-
CommonRun(perf_attr, [&] {
55-
task_->Validation();
56-
task_->PreProcessing();
57-
task_->Run();
58-
task_->PostProcessing();
59-
}, perf_results_);
60-
}
61-
// Check performance of task's Run() function
62-
void TaskRun(const PerfAttr &perf_attr) {
63-
perf_results_.type_of_running = PerfResults::TypeOfRunning::kTaskRun;
64-
65-
task_->Validation();
66-
task_->PreProcessing();
67-
CommonRun(perf_attr, [&] { task_->Run(); }, perf_results_);
68-
task_->PostProcessing();
69-
70-
task_->Validation();
71-
task_->PreProcessing();
72-
task_->Run();
73-
task_->PostProcessing();
74-
}
75-
// Print results for automation checkers
76-
void PrintPerfStatistic(const std::string &test_id) const {
77-
std::string type_test_name;
78-
if (perf_results_.type_of_running == PerfResults::TypeOfRunning::kTaskRun) {
79-
type_test_name = "task_run";
80-
} else if (perf_results_.type_of_running == PerfResults::TypeOfRunning::kPipeline) {
81-
type_test_name = "pipeline";
82-
} else {
83-
std::stringstream err_msg;
84-
err_msg << '\n' << "The type of performance check for the task was not selected.\n";
85-
throw std::runtime_error(err_msg.str().c_str());
86-
}
87-
88-
auto time_secs = perf_results_.time_sec;
89-
const auto max_time = ppc::util::GetPerfMaxTime();
90-
std::stringstream perf_res_str;
91-
if (time_secs < max_time) {
92-
perf_res_str << std::fixed << std::setprecision(10) << time_secs;
93-
std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n';
94-
} else {
95-
std::stringstream err_msg;
96-
err_msg << '\n' << "Task execute time need to be: ";
97-
err_msg << "time < " << max_time << " secs." << '\n';
98-
err_msg << "Original time in secs: " << time_secs << '\n';
99-
perf_res_str << std::fixed << std::setprecision(10) << -1.0;
100-
std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n';
101-
throw std::runtime_error(err_msg.str().c_str());
102-
}
103-
}
104-
/// @brief Retrieves the performance test results.
105-
/// @return The latest PerfResults structure.
106-
[[nodiscard]] PerfResults GetPerfResults() const {
107-
return perf_results_;
108-
}
109-
110-
private:
111-
PerfResults perf_results_;
112-
std::shared_ptr<ppc::task::Task<InType, OutType>> task_;
113-
static void CommonRun(const PerfAttr &perf_attr, const std::function<void()> &pipeline, PerfResults &perf_results) {
114-
auto begin = perf_attr.current_timer();
115-
for (uint64_t i = 0; i < perf_attr.num_running; i++) {
116-
pipeline();
117-
}
118-
auto end = perf_attr.current_timer();
119-
perf_results.time_sec = (end - begin) / static_cast<double>(perf_attr.num_running);
120-
}
121-
};
122-
123-
inline std::string GetStringParamName(PerfResults::TypeOfRunning type_of_running) {
124-
if (type_of_running == PerfResults::TypeOfRunning::kTaskRun) {
125-
return "task_run";
126-
}
127-
if (type_of_running == PerfResults::TypeOfRunning::kPipeline) {
128-
return "pipeline";
129-
}
130-
return "none";
131-
}
132-
13321
} // namespace ppc::performance

0 commit comments

Comments
 (0)