| // SPDX-FileCopyrightText: The Eigen Authors |
| // SPDX-License-Identifier: MPL-2.0 |
| #include <benchmark/benchmark.h> |
| #include <contrib/Eigen/StructuredMatrices> |
| |
| using namespace Eigen; |
| |
| template <int Options, typename Op> |
| void materialize(benchmark::State& state, const Op& op) { |
| using Scalar = typename Op::Scalar; |
| Matrix<Scalar, Dynamic, Dynamic, Options> dst(op.rows(), op.cols()); |
| dst = op; |
| for (Index j = 0; j < op.cols(); ++j) |
| for (Index i = 0; i < op.rows(); ++i) |
| if (dst(i, j) != op.coeff(i, j)) { |
| state.SkipWithError("incorrect materialization"); |
| return; |
| } |
| if (state.range(2) == 0) { |
| for (auto _ : state) { |
| dst = op; |
| benchmark::DoNotOptimize(dst.data()); |
| benchmark::ClobberMemory(); |
| } |
| } else { |
| for (auto _ : state) { |
| dst += op; |
| dst -= op; |
| benchmark::DoNotOptimize(dst.data()); |
| benchmark::ClobberMemory(); |
| } |
| } |
| } |
| |
| template <typename Scalar, int Options> |
| void BM_CirculantMaterialize(benchmark::State& state) { |
| Matrix<Scalar, Dynamic, 1> c = Matrix<Scalar, Dynamic, 1>::Random(state.range(0)); |
| materialize<Options>(state, makeCirculant(c)); |
| } |
| |
| template <typename Scalar, int Options> |
| void BM_ToeplitzMaterialize(benchmark::State& state) { |
| Matrix<Scalar, Dynamic, 1> c = Matrix<Scalar, Dynamic, 1>::Random(state.range(0)); |
| Matrix<Scalar, Dynamic, 1> r = Matrix<Scalar, Dynamic, 1>::Random(state.range(1)); |
| materialize<Options>(state, makeToeplitz(c, r)); |
| } |
| |
| template <typename Scalar, int Options> |
| void BM_HankelMaterialize(benchmark::State& state) { |
| Matrix<Scalar, Dynamic, 1> c = Matrix<Scalar, Dynamic, 1>::Random(state.range(0)); |
| Matrix<Scalar, Dynamic, 1> r = Matrix<Scalar, Dynamic, 1>::Random(state.range(1)); |
| materialize<Options>(state, makeHankel(c, r)); |
| } |
| |
| #define STRUCTURED_MATERIALIZE_CASES(Name, Scalar, Options, Wide) \ |
| BENCHMARK_TEMPLATE(Name, Scalar, Options) \ |
| ->Args({32, 32, 0}) \ |
| ->Args({256, 256, 0}) \ |
| ->Args({127, Wide, 0}) \ |
| ->Args({256, 256, 1}) |
| #define STRUCTURED_MATERIALIZE_TYPES(Name, Wide) \ |
| STRUCTURED_MATERIALIZE_CASES(Name, double, ColMajor, Wide); \ |
| STRUCTURED_MATERIALIZE_CASES(Name, double, RowMajor, Wide); \ |
| STRUCTURED_MATERIALIZE_CASES(Name, std::complex<double>, ColMajor, Wide); \ |
| STRUCTURED_MATERIALIZE_CASES(Name, std::complex<double>, RowMajor, Wide) |
| |
| STRUCTURED_MATERIALIZE_TYPES(BM_CirculantMaterialize, 127); |
| STRUCTURED_MATERIALIZE_TYPES(BM_ToeplitzMaterialize, 257); |
| STRUCTURED_MATERIALIZE_TYPES(BM_HankelMaterialize, 257); |