libeigen/eigen!2580 Closes #3084 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
// 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}});
|