blob: 54847c7b55d5ab080348451bcbd406cf47cdb7ac [file]
// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0
#include <benchmark/benchmark.h>
#include <Eigen/Eigenvalues>
#include <cstdlib>
#ifndef SCALAR
#define SCALAR double
#endif
static void BM_GEEV(benchmark::State& state) {
using Scalar = SCALAR;
using Mat = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
const Eigen::Index n = state.range(0);
const bool vectors = state.range(1) != 0;
std::srand(5489);
const Mat matrix = Mat::Random(n, n);
Eigen::EigenSolver<Mat> solver(matrix);
const Scalar bound = Scalar(64 * n) * Eigen::NumTraits<Scalar>::epsilon();
if (solver.info() != Eigen::Success ||
!((matrix * solver.pseudoEigenvectors() - solver.pseudoEigenvectors() * solver.pseudoEigenvalueMatrix()).norm() <=
bound * matrix.norm() * solver.pseudoEigenvectors().norm())) {
state.SkipWithError("GEEV failed eigenpair residual check");
return;
}
if (!vectors) {
const auto reference = solver.eigenvalues().eval();
solver.compute(matrix, false);
if (solver.info() != Eigen::Success || !((solver.eigenvalues() - reference).norm() <= bound * matrix.norm())) {
state.SkipWithError("GEEV failed eigenvalue check");
return;
}
}
for (auto _ : state) {
solver.compute(matrix, vectors);
benchmark::DoNotOptimize(solver.eigenvalues().data());
benchmark::ClobberMemory();
}
}
BENCHMARK(BM_GEEV)->ArgsProduct({{32, 128, 256, 257, 500, 512, 768, 1000, 1024}, {0, 1}})->UseRealTime();