Skip to content

Commit 77263ce

Browse files
[eigen] isolate eigen backend linear algebra support
1 parent 6dd4e1f commit 77263ce

30 files changed

+1622
-360
lines changed

.github/workflows/cppcheck.yml

+1
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,5 @@ jobs:
5050
--verbose \
5151
-I benchmark/include \
5252
-I include \
53+
-I linalg/eigen \
5354
.

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ include(GNUInstallDirs)
5858
add_subdirectory(benchmark)
5959
add_subdirectory(cmake)
6060
add_subdirectory(include)
61+
add_subdirectory(linalg)
6162
add_subdirectory(pkgconfig)
6263
add_subdirectory(sample)
6364
add_subdirectory(source)

benchmark/CMakeLists.txt

+44-46
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,6 @@ For more information, please refer to <https://unlicense.org> ]]
3838

3939
include(FetchContent)
4040

41-
FetchContent_Declare(
42-
eigen
43-
GIT_REPOSITORY "https://gitlab.com/libeigen/eigen"
44-
FIND_PACKAGE_ARGS NAMES Eigen3)
45-
FetchContent_MakeAvailable(eigen)
46-
4741
FetchContent_Declare(
4842
google_test
4943
GIT_REPOSITORY "https://github.com/google/googletest"
@@ -76,45 +70,49 @@ foreach(BENCHMARK "baseline.cpp" "predict_1x1x0.cpp" "predict_1x1x1.cpp"
7670
"--benchmark_out=${NAME}.json")
7771
endforeach()
7872

79-
foreach(STATE_SIZE RANGE 1 2)
80-
foreach(OUTPUT_SIZE RANGE 1 2)
81-
configure_file(eigen_update_xx0.cpp
82-
eigen_update_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp)
83-
get_filename_component(NAME eigen_update_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp
84-
NAME_WE)
85-
add_executable(kalman_benchmark_${NAME}_driver
86-
eigen_update_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp)
87-
target_include_directories(kalman_benchmark_${NAME}_driver
88-
PRIVATE "include")
89-
set_target_properties(kalman_benchmark_${NAME}_driver
90-
PROPERTIES CXX_STANDARD 23)
91-
set_target_properties(kalman_benchmark_${NAME}_driver
92-
PROPERTIES CXX_EXTENSIONS OFF)
93-
target_link_libraries(
94-
kalman_benchmark_${NAME}_driver
95-
PRIVATE benchmark::benchmark benchmark::benchmark_main Eigen3::Eigen
96-
kalman)
97-
add_test(kalman_benchmark_${NAME} kalman_benchmark_${NAME}_driver
98-
"--benchmark_out=${NAME}.json")
99-
endforeach()
100-
foreach(INPUT_SIZE RANGE 1 2)
101-
configure_file(eigen_predict_x1x.cpp
102-
eigen_predict_${STATE_SIZE}x1x${INPUT_SIZE}.cpp)
103-
get_filename_component(NAME eigen_predict_${STATE_SIZE}x1x${INPUT_SIZE}.cpp
104-
NAME_WE)
105-
add_executable(kalman_benchmark_${NAME}_driver
106-
eigen_predict_${STATE_SIZE}x1x${INPUT_SIZE}.cpp)
107-
target_include_directories(kalman_benchmark_${NAME}_driver
108-
PRIVATE "include")
109-
set_target_properties(kalman_benchmark_${NAME}_driver
110-
PROPERTIES CXX_STANDARD 23)
111-
set_target_properties(kalman_benchmark_${NAME}_driver
112-
PROPERTIES CXX_EXTENSIONS OFF)
113-
target_link_libraries(
114-
kalman_benchmark_${NAME}_driver
115-
PRIVATE benchmark::benchmark benchmark::benchmark_main Eigen3::Eigen
116-
kalman)
117-
add_test(kalman_benchmark_${NAME} kalman_benchmark_${NAME}_driver
118-
"--benchmark_out=${NAME}.json")
73+
foreach(BACKEND IN ITEMS "eigen")
74+
foreach(STATE_SIZE RANGE 1 2)
75+
foreach(OUTPUT_SIZE RANGE 1 2)
76+
configure_file(update_linalg_xx0.cpp
77+
update_linalg_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp)
78+
get_filename_component(
79+
NAME update_linalg_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp NAME_WE)
80+
add_executable(kalman_${BACKEND}_benchmark_${NAME}_driver
81+
update_linalg_${STATE_SIZE}x${OUTPUT_SIZE}x0.cpp)
82+
target_include_directories(kalman_${BACKEND}_benchmark_${NAME}_driver
83+
PRIVATE "include")
84+
set_target_properties(kalman_${BACKEND}_benchmark_${NAME}_driver
85+
PROPERTIES CXX_STANDARD 23)
86+
set_target_properties(kalman_${BACKEND}_benchmark_${NAME}_driver
87+
PROPERTIES CXX_EXTENSIONS OFF)
88+
target_link_libraries(
89+
kalman_${BACKEND}_benchmark_${NAME}_driver
90+
PRIVATE benchmark::benchmark benchmark::benchmark_main kalman
91+
kalman_linalg_${BACKEND})
92+
add_test(kalman_${BACKEND}_benchmark_${NAME}
93+
kalman_${BACKEND}_benchmark_${NAME}_driver
94+
"--benchmark_out=${NAME}.json")
95+
endforeach()
96+
foreach(INPUT_SIZE RANGE 1 2)
97+
configure_file(predict_linalg_x1x.cpp
98+
predict_linalg_${STATE_SIZE}x1x${INPUT_SIZE}.cpp)
99+
get_filename_component(
100+
NAME predict_linalg_${STATE_SIZE}x1x${INPUT_SIZE}.cpp NAME_WE)
101+
add_executable(kalman_${BACKEND}_benchmark_${NAME}_driver
102+
predict_linalg_${STATE_SIZE}x1x${INPUT_SIZE}.cpp)
103+
target_include_directories(kalman_${BACKEND}_benchmark_${NAME}_driver
104+
PRIVATE "include")
105+
set_target_properties(kalman_${BACKEND}_benchmark_${NAME}_driver
106+
PROPERTIES CXX_STANDARD 23)
107+
set_target_properties(kalman_${BACKEND}_benchmark_${NAME}_driver
108+
PROPERTIES CXX_EXTENSIONS OFF)
109+
target_link_libraries(
110+
kalman_${BACKEND}_benchmark_${NAME}_driver
111+
PRIVATE benchmark::benchmark benchmark::benchmark_main kalman
112+
kalman_linalg_${BACKEND})
113+
add_test(kalman_${BACKEND}_benchmark_${NAME}
114+
kalman_${BACKEND}_benchmark_${NAME}_driver
115+
"--benchmark_out=${NAME}.json")
116+
endforeach()
119117
endforeach()
120118
endforeach()

benchmark/eigen_predict_x1x.cpp benchmark/predict_linalg_x1x.cpp

+11-9
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ For more information, please refer to <https://unlicense.org> */
3939
#include "benchmark.hpp"
4040
#include "fcarouge/internal/utility.hpp"
4141
#include "fcarouge/kalman.hpp"
42+
#include "fcarouge/linalg.hpp"
4243

43-
#include <Eigen/Eigen>
4444
#include <benchmark/benchmark.h>
4545

4646
#include <algorithm>
@@ -53,27 +53,29 @@ For more information, please refer to <https://unlicense.org> */
5353

5454
namespace fcarouge::benchmark {
5555
namespace {
56-
template <auto Size> using vector = Eigen::Vector<float, Size>;
56+
template <auto Size> using vector = column_vector<float, Size>;
5757

5858
//! @benchmark Measure the prediction of the filter for different dimensions of
5959
//! states and inputs with the Eigen linear algebra backend.
60-
template <std::size_t StateSize, std::size_t InputSize>
60+
template <auto StateSize, auto InputSize>
6161
void bench(::benchmark::State &state) {
62-
using kalman = kalman<vector<StateSize>, float, vector<InputSize>>;
62+
using kalman = kalman<vector<StateSize>, vector<1>, vector<InputSize>>;
6363

6464
kalman filter;
6565
std::random_device random_device;
6666
std::mt19937 random_generator{random_device()};
6767
std::uniform_real_distribution<float> uniformly_distributed;
6868

6969
for (auto _ : state) {
70-
typename kalman::input u;
70+
float uv[InputSize];
7171

72-
internal::for_constexpr<std::size_t{0}, InputSize, 1>(
73-
[&u, &uniformly_distributed, &random_generator](auto position) {
74-
u[position] = uniformly_distributed(random_generator);
72+
internal::for_constexpr<0, InputSize, 1>(
73+
[&uv, &uniformly_distributed, &random_generator](auto position) {
74+
uv[position] = uniformly_distributed(random_generator);
7575
});
7676

77+
typename kalman::input u{uv};
78+
7779
::benchmark::ClobberMemory();
7880
const auto start{clock::now()};
7981

@@ -89,7 +91,7 @@ void bench(::benchmark::State &state) {
8991
//! @todo Find a way to remove macros or find a different benchmark library that
9092
//! doesn't use macros.
9193
BENCHMARK(bench<${STATE_SIZE}, ${INPUT_SIZE}>)
92-
->Name("eigen_predict_${STATE_SIZE}x1x${INPUT_SIZE}")
94+
->Name("predict_linalg_${STATE_SIZE}x1x${INPUT_SIZE}")
9395
->Unit(::benchmark::kNanosecond)
9496
->ComputeStatistics("min",
9597
[](const auto &results) {

0 commit comments

Comments
 (0)