Description
Description
As initially discussed in this PR, there is some code duplication in having the same functions implemented for std::vector
and Eigen
separately. This could be avoided by using a wrapper which compiles to a no-op for Eigen
types and returns an Eigen::Map
for std::vector
types prior to calling the mat
definition:
template <typename Derived>
const auto& as_eigen(const Eigen::MatrixBase<Derived>& v) {
return v;
}
template <typename T>
const auto as_eigen(const std::vector<T>& v) {
return Eigen::Map<const Eigen::Matrix<T, Eigen::Dynamic, 1>>(v.data(),
v.size());
}
This also means that the templating for the mat
definitions needs to be changed from Eigen::Matrix<double, R, C>
to Eigen::MatrixBase<Derived>
so that it works with Eigen::Map
inputs.
After some initial testing, the speed gains are minor:
2019-10-28 20:40:26
Running ./log_sum_exp_arr
Run on (8 X 4000 MHz CPU s)
CPU Caches:
L1 Data 32K (x4)
L1 Instruction 32K (x4)
L2 Unified 256K (x4)
L3 Unified 8192K (x1)
-----------------------------------------------------
Benchmark Time CPU Iterations
-----------------------------------------------------
LogSumExp_Old 8175394 ns 8175190 ns 92
LogSumExp_New 5511970 ns 5511907 ns 124
DotSelf_Old 5136511 ns 5136391 ns 132
DotSelf_New 4497041 ns 4496989 ns 157
Sum_Old 4868005 ns 4867939 ns 139
Sum_New 4608184 ns 4608127 ns 149
Benchmarking code here
The main benefits would be in code reduction for functions with existing arr
definitions, as well as making it easier to extend other functions to take std::vector
inputs (without requiring additional definitions).
Does this seem like a worthwhile change?
Current Version:
v3.0.0