| // SPDX-FileCopyrightText: The Eigen Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| #include <benchmark/benchmark.h> | |
| #include <Eigen/Sparse> | |
| #include <cstdint> | |
| #include <random> | |
| using namespace Eigen; | |
| typedef double Scalar; | |
| typedef Matrix<Scalar, Dynamic, Dynamic> DenseMat; | |
| typedef SparseMatrix<Scalar> SpMat; | |
| static DenseMat makeDense(int rows, int cols, double density, std::uint64_t seed) { | |
| DenseMat dense = DenseMat::Zero(rows, cols); | |
| std::mt19937_64 rng(seed); | |
| std::uniform_real_distribution<Scalar> coin(0.0, 1.0); | |
| std::uniform_real_distribution<Scalar> value(-1.0, 1.0); | |
| for (int j = 0; j < cols; ++j) { | |
| for (int i = 0; i < rows; ++i) { | |
| if (coin(rng) < density) dense(i, j) = value(rng); | |
| } | |
| } | |
| return dense; | |
| } | |
| static void BM_SparseViewAssign(benchmark::State& state) { | |
| const int rows = static_cast<int>(state.range(0)); | |
| const int cols = static_cast<int>(state.range(1)); | |
| const double density = static_cast<double>(state.range(2)) / 10000.0; | |
| const DenseMat dense = makeDense(rows, cols, density, 0xC0FFEEu); | |
| SpMat result; | |
| for (auto _ : state) { | |
| result = dense.sparseView(); | |
| benchmark::DoNotOptimize(result.valuePtr()); | |
| benchmark::ClobberMemory(); | |
| } | |
| state.counters["density%"] = density * 100.0; | |
| state.counters["nnz"] = result.nonZeros(); | |
| } | |
| // Args: {rows, cols, density*10000}: 0%, 1%, 10%, 50%, 100%. | |
| BENCHMARK(BM_SparseViewAssign)->ArgsProduct({{500}, {1, 8, 500}, {0, 100, 1000, 5000, 10000}}); |