// Benchmarks for matrix power functions: sqrt, pow, cos, sin, cosh, sinh. #include #include #include using namespace Eigen; typedef double Scalar; typedef Matrix Mat; static void BM_MatrixSqrt(benchmark::State& state) { int n = state.range(0); // SPD matrix has well-defined sqrt. Mat tmp = Mat::Random(n, n); Mat A = tmp * tmp.transpose() + Mat::Identity(n, n); Mat result(n, n); for (auto _ : state) { result = A.sqrt(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void BM_MatrixPow(benchmark::State& state) { int n = state.range(0); Mat tmp = Mat::Random(n, n); Mat A = tmp * tmp.transpose() + Mat::Identity(n, n); Mat result(n, n); Scalar p = 2.5; for (auto _ : state) { result = A.pow(p); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void BM_MatrixCos(benchmark::State& state) { int n = state.range(0); Mat A = Mat::Random(n, n) / Scalar(n); Mat result(n, n); for (auto _ : state) { result = A.cos(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void BM_MatrixSin(benchmark::State& state) { int n = state.range(0); Mat A = Mat::Random(n, n) / Scalar(n); Mat result(n, n); for (auto _ : state) { result = A.sin(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void BM_MatrixCosh(benchmark::State& state) { int n = state.range(0); Mat A = Mat::Random(n, n) / Scalar(n); Mat result(n, n); for (auto _ : state) { result = A.cosh(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void BM_MatrixSinh(benchmark::State& state) { int n = state.range(0); Mat A = Mat::Random(n, n) / Scalar(n); Mat result(n, n); for (auto _ : state) { result = A.sinh(); benchmark::DoNotOptimize(result.data()); benchmark::ClobberMemory(); } } static void MatPowerSizes(::benchmark::Benchmark* b) { for (int n : {4, 8, 16, 32, 64}) { b->Arg(n); } } BENCHMARK(BM_MatrixSqrt)->Apply(MatPowerSizes); BENCHMARK(BM_MatrixPow)->Apply(MatPowerSizes); BENCHMARK(BM_MatrixCos)->Apply(MatPowerSizes); BENCHMARK(BM_MatrixSin)->Apply(MatPowerSizes); BENCHMARK(BM_MatrixCosh)->Apply(MatPowerSizes); BENCHMARK(BM_MatrixSinh)->Apply(MatPowerSizes);