diff --git a/benchmarks/macbook-pro-2014-small_blas_gemv_benchmark.json b/benchmarks/macbook-pro-2014-small_blas_gemv_benchmark.json new file mode 100644 index 000000000..3e483a239 --- /dev/null +++ b/benchmarks/macbook-pro-2014-small_blas_gemv_benchmark.json @@ -0,0 +1,515 @@ +{ + "context": { + "date": "2018-02-25 13:20:04", + "num_cpus": 8, + "mhz_per_cpu": 2200, + "cpu_scaling_enabled": false, + "library_build_type": "release" + }, + "benchmarks": [ + { + "name": "BM_MatrixVectorMultiply/1/1", + "iterations": 69298697, + "real_time": 1.0097105894512250e+01, + "cpu_time": 1.0040275360444367e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/2", + "iterations": 65913992, + "real_time": 1.0302522610563768e+01, + "cpu_time": 1.0245351244998181e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/3", + "iterations": 73595895, + "real_time": 9.6440729347083387e+00, + "cpu_time": 9.5853172245544389e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/4", + "iterations": 69574897, + "real_time": 1.0073530211782117e+01, + "cpu_time": 9.9997560901886722e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/6", + "iterations": 58273603, + "real_time": 1.1879482448448192e+01, + "cpu_time": 1.1746073089045133e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/7", + "iterations": 54426846, + "real_time": 1.2970374490544540e+01, + "cpu_time": 1.2881400476522181e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/12", + "iterations": 40754541, + "real_time": 1.7086407941937370e+01, + "cpu_time": 1.6969201051730625e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/16", + "iterations": 36813042, + "real_time": 2.0977509004292560e+01, + "cpu_time": 2.0338009556504460e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/1/20", + "iterations": 32061264, + "real_time": 2.1783493596539344e+01, + "cpu_time": 2.1625753744456222e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/1", + "iterations": 71987577, + "real_time": 9.9393425620120528e+00, + "cpu_time": 9.8528944792793975e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/2", + "iterations": 63771443, + "real_time": 1.1381383373240160e+01, + "cpu_time": 1.1294600939169571e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/3", + "iterations": 52469043, + "real_time": 1.5624869525055580e+01, + "cpu_time": 1.5158995752981452e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/4", + "iterations": 45512470, + "real_time": 1.5249180278513519e+01, + "cpu_time": 1.4811259419671170e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/6", + "iterations": 40479275, + "real_time": 1.7419527499445600e+01, + "cpu_time": 1.7267799386229168e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/7", + "iterations": 35497677, + "real_time": 1.9656466957520109e+01, + "cpu_time": 1.9009525609239173e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/12", + "iterations": 27042793, + "real_time": 2.4197042293219681e+01, + "cpu_time": 2.3855672008434897e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/16", + "iterations": 24077820, + "real_time": 2.8851556123593411e+01, + "cpu_time": 2.8603793865059156e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/2/20", + "iterations": 20977240, + "real_time": 3.2981163630488950e+01, + "cpu_time": 3.2740865814568508e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/1", + "iterations": 61687596, + "real_time": 1.1764908379779497e+01, + "cpu_time": 1.1687698123298562e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/2", + "iterations": 43755469, + "real_time": 1.6423369476207299e+01, + "cpu_time": 1.6309206970218952e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/3", + "iterations": 37693381, + "real_time": 1.8031485450223030e+01, + "cpu_time": 1.7915983710774054e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/4", + "iterations": 36812849, + "real_time": 1.9044860858008274e+01, + "cpu_time": 1.8915433575923469e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/6", + "iterations": 31380003, + "real_time": 2.2716422938798129e+01, + "cpu_time": 2.2573452271499175e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/7", + "iterations": 29979614, + "real_time": 2.5305456738143899e+01, + "cpu_time": 2.4368525892294780e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/12", + "iterations": 22574601, + "real_time": 3.2935694633936649e+01, + "cpu_time": 3.1806276443158403e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/16", + "iterations": 18534847, + "real_time": 3.7167092181413921e+01, + "cpu_time": 3.6952179858835549e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/3/20", + "iterations": 14379061, + "real_time": 4.9144608746192276e+01, + "cpu_time": 4.8366649254773812e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/1", + "iterations": 48585469, + "real_time": 1.4383808851738836e+01, + "cpu_time": 1.4028535980582999e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/2", + "iterations": 36885397, + "real_time": 1.9225010159014570e+01, + "cpu_time": 1.9118216349955460e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/3", + "iterations": 31222959, + "real_time": 2.2854289371385235e+01, + "cpu_time": 2.2695991113462323e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/4", + "iterations": 31518186, + "real_time": 2.2779098836662452e+01, + "cpu_time": 2.2609264378349625e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/6", + "iterations": 27870791, + "real_time": 2.6312030431589900e+01, + "cpu_time": 2.6164704116219813e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/7", + "iterations": 26635110, + "real_time": 2.8015773282089135e+01, + "cpu_time": 2.7610248277555474e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/12", + "iterations": 17797575, + "real_time": 3.9333237811242320e+01, + "cpu_time": 3.8665042849938892e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/16", + "iterations": 14592636, + "real_time": 4.8254791185539325e+01, + "cpu_time": 4.7936644208764051e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixVectorMultiply/4/20", + "iterations": 11582884, + "real_time": 6.1053182527591900e+01, + "cpu_time": 6.0339031280982766e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/1", + "iterations": 76783011, + "real_time": 9.3956197029191628e+00, + "cpu_time": 9.3391232078669315e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/2", + "iterations": 70815082, + "real_time": 9.6104494527203634e+00, + "cpu_time": 9.5503808072974952e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/3", + "iterations": 66582329, + "real_time": 1.0727912012247707e+01, + "cpu_time": 1.0640345728969692e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/4", + "iterations": 53793602, + "real_time": 1.3614292048217301e+01, + "cpu_time": 1.3500583210620450e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/6", + "iterations": 40321652, + "real_time": 1.7766203749914158e+01, + "cpu_time": 1.7570882264446855e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/7", + "iterations": 37201986, + "real_time": 1.9978757341790001e+01, + "cpu_time": 1.8992776353391505e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/12", + "iterations": 27434090, + "real_time": 2.6018652924849363e+01, + "cpu_time": 2.5589622254647360e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/16", + "iterations": 18985007, + "real_time": 3.8675490929263397e+01, + "cpu_time": 3.8356793863705086e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/1/20", + "iterations": 16250235, + "real_time": 4.2684055338167965e+01, + "cpu_time": 4.2342464585896622e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/1", + "iterations": 72217809, + "real_time": 9.8704761588567429e+00, + "cpu_time": 9.7949108370208933e+00, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/2", + "iterations": 58405854, + "real_time": 1.2449916972022011e+01, + "cpu_time": 1.2345851496324279e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/3", + "iterations": 44559025, + "real_time": 1.6004563317294398e+01, + "cpu_time": 1.5868367855894519e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/4", + "iterations": 35586284, + "real_time": 1.8873825462252668e+01, + "cpu_time": 1.8742417724761761e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/6", + "iterations": 30603233, + "real_time": 2.3746124174457755e+01, + "cpu_time": 2.3614759917685756e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/7", + "iterations": 25503512, + "real_time": 2.7041517616016900e+01, + "cpu_time": 2.6823050880208051e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/12", + "iterations": 17142745, + "real_time": 4.0841419326141207e+01, + "cpu_time": 4.0593790551046581e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/16", + "iterations": 13289037, + "real_time": 5.3266691859451711e+01, + "cpu_time": 5.2837914440301496e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/2/20", + "iterations": 10179301, + "real_time": 7.1242744951979475e+01, + "cpu_time": 6.9943702421217523e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/1", + "iterations": 69897251, + "real_time": 1.0455159873353184e+01, + "cpu_time": 1.0183404780826111e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/2", + "iterations": 48687523, + "real_time": 1.4473279406174216e+01, + "cpu_time": 1.4368362917127623e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/3", + "iterations": 36199282, + "real_time": 1.8768082416320095e+01, + "cpu_time": 1.8594457204980039e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/4", + "iterations": 32392711, + "real_time": 2.1793111421538484e+01, + "cpu_time": 2.1554787433506387e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/6", + "iterations": 25449918, + "real_time": 2.7307808579096385e+01, + "cpu_time": 2.7092071573668875e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/7", + "iterations": 22970703, + "real_time": 3.0684889528257191e+01, + "cpu_time": 3.0455576392242047e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/12", + "iterations": 15189357, + "real_time": 4.8938380408733977e+01, + "cpu_time": 4.7137676729830986e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/16", + "iterations": 12187690, + "real_time": 6.4202213625161093e+01, + "cpu_time": 6.1960141749584857e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/3/20", + "iterations": 8626958, + "real_time": 7.7660120865570065e+01, + "cpu_time": 7.6987740058547374e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/1", + "iterations": 68685362, + "real_time": 1.0764260905433320e+01, + "cpu_time": 1.0544197175520464e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/2", + "iterations": 41396113, + "real_time": 1.6881927031100783e+01, + "cpu_time": 1.6629145833088174e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/3", + "iterations": 35592798, + "real_time": 2.0520861720163161e+01, + "cpu_time": 2.0318998242284707e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/4", + "iterations": 29245508, + "real_time": 2.4356611964112989e+01, + "cpu_time": 2.4129585986333215e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/6", + "iterations": 20036065, + "real_time": 3.4106466514085753e+01, + "cpu_time": 3.3619725230478345e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/7", + "iterations": 18768417, + "real_time": 3.6661212077921938e+01, + "cpu_time": 3.6314090847405801e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/12", + "iterations": 11789871, + "real_time": 6.1986798330774114e+01, + "cpu_time": 6.1171322400389727e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/16", + "iterations": 7869236, + "real_time": 8.5527959635890710e+01, + "cpu_time": 8.2749964545479799e+01, + "time_unit": "ns" + }, + { + "name": "BM_MatrixTransposeVectorMultiply/4/20", + "iterations": 7417847, + "real_time": 9.9073482499474821e+01, + "cpu_time": 9.7701125407411183e+01, + "time_unit": "ns" + } + ] +} diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index 4080ea75d..618bd72ac 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt @@ -383,7 +383,6 @@ if (BUILD_BENCHMARKS) add_executable(autodiff_cost_function_benchmark autodiff_cost_function_benchmark.cc) target_link_libraries(autodiff_cost_function_benchmark ceres benchmark::benchmark) - add_executable(small_blas_benchmark small_blas_benchmark.cc) - target_link_libraries(small_blas_benchmark ceres benchmark::benchmark) - + add_executable(small_blas_gemv_benchmark small_blas_gemv_benchmark.cc) + target_link_libraries(small_blas_gemv_benchmark ceres benchmark::benchmark) endif (BUILD_BENCHMARKS) diff --git a/internal/ceres/small_blas_benchmark.cc b/internal/ceres/small_blas_benchmark.cc deleted file mode 100644 index c78a69d6f..000000000 --- a/internal/ceres/small_blas_benchmark.cc +++ /dev/null @@ -1,296 +0,0 @@ -// Ceres Solver - A fast non-linear least squares minimizer -// Copyright 2018 Google Inc. All rights reserved. -// http://ceres-solver.org/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// * Neither the name of Google Inc. nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -// Authors: sameeragarwal@google.com (Sameer Agarwal) - -#include -#include "Eigen/Dense" -#include "benchmark/benchmark.h" -#include "ceres/small_blas.h" - -namespace ceres { - -// Benchmarking matrix-vector multiply routines and optimizing memory -// access requires that we make sure that they are not just sitting in -// the cache. So, as the benchmarking routine iterates, we need to -// multiply new/different matrice and vectors. Allocating/creating -// these objects in the benchmarking loop is too heavy duty, so we -// create them before hand and cycle through them in the -// benchmark. This class, given the size of the matrix creates such -// matrix and vector objects for use in the benchmark. -class MatrixVectorMultiplyData { - public: - MatrixVectorMultiplyData(int rows, int cols) { - num_elements_ = 1000; - // A single memory buffer for all the matrices & vectors. - - size_t buffer_size = num_elements_ * (200); - data_.resize(buffer_size, 1.00000000000001); - - // Each element is three points, corresponding to the three - // elements of the expression c = A * b. - ptrs_.resize(3 * num_elements_, NULL); - double* p = &data_[0]; - for (int i = 0; i < num_elements_; ++i) { - // Matrix X. - ptrs_[3 * i] = p; - p += rows * cols; - // Vector b. - ptrs_[3 * i + 1] = p; - p += cols; - // Vector c. - ptrs_[3 * i + 2] = p; - p += rows; - } - } - - int num_elements() const { return num_elements_; } - double* data() { return &data_[0]; } - const std::vector& ptrs() const { return ptrs_; } - - private: - int num_elements_; - std::vector data_; - std::vector ptrs_; -}; - -// Run on (8 X 2200 MHz CPU s) -// 2018-02-06 21:23:59 -// --------------------------------------------------------------------------- -// Benchmark Time CPU Iterations -// --------------------------------------------------------------------------- -// BM_MatrixVectorMultiplyDynamic/1/1 4 ns 4 ns 165611093 -// BM_MatrixVectorMultiplyDynamic/1/2 5 ns 5 ns 140648672 -// BM_MatrixVectorMultiplyDynamic/1/3 5 ns 5 ns 139414459 -// BM_MatrixVectorMultiplyDynamic/1/4 5 ns 5 ns 144247512 -// BM_MatrixVectorMultiplyDynamic/1/6 6 ns 6 ns 106639042 -// BM_MatrixVectorMultiplyDynamic/1/8 7 ns 7 ns 102367617 -// BM_MatrixVectorMultiplyDynamic/1/10 9 ns 9 ns 82419847 -// BM_MatrixVectorMultiplyDynamic/1/12 10 ns 10 ns 65129002 -// BM_MatrixVectorMultiplyDynamic/1/16 12 ns 12 ns 53500867 -// BM_MatrixVectorMultiplyDynamic/1/20 16 ns 16 ns 46067179 -// BM_MatrixVectorMultiplyDynamic/2/1 5 ns 5 ns 128880215 -// BM_MatrixVectorMultiplyDynamic/2/2 8 ns 8 ns 81938429 -// BM_MatrixVectorMultiplyDynamic/2/3 10 ns 10 ns 68807565 -// BM_MatrixVectorMultiplyDynamic/2/4 8 ns 8 ns 91833388 -// BM_MatrixVectorMultiplyDynamic/2/6 10 ns 10 ns 64031028 -// BM_MatrixVectorMultiplyDynamic/2/8 12 ns 12 ns 59788179 -// BM_MatrixVectorMultiplyDynamic/2/10 15 ns 15 ns 44737868 -// BM_MatrixVectorMultiplyDynamic/2/12 17 ns 17 ns 37423949 -// BM_MatrixVectorMultiplyDynamic/2/16 22 ns 22 ns 33470723 -// BM_MatrixVectorMultiplyDynamic/2/20 26 ns 26 ns 27076057 -// BM_MatrixVectorMultiplyDynamic/3/1 6 ns 6 ns 100932908 -// BM_MatrixVectorMultiplyDynamic/3/2 12 ns 12 ns 65591589 -// BM_MatrixVectorMultiplyDynamic/3/3 14 ns 14 ns 48182819 -// BM_MatrixVectorMultiplyDynamic/3/4 11 ns 11 ns 61770338 -// BM_MatrixVectorMultiplyDynamic/3/6 15 ns 15 ns 44712435 -// BM_MatrixVectorMultiplyDynamic/3/8 18 ns 18 ns 35177294 -// BM_MatrixVectorMultiplyDynamic/3/10 21 ns 21 ns 32164683 -// BM_MatrixVectorMultiplyDynamic/3/12 24 ns 24 ns 28222279 -// BM_MatrixVectorMultiplyDynamic/3/16 30 ns 30 ns 23050731 -// BM_MatrixVectorMultiplyDynamic/3/20 38 ns 38 ns 17832714 -// BM_MatrixVectorMultiplyDynamic/4/1 8 ns 8 ns 85763293 -// BM_MatrixVectorMultiplyDynamic/4/2 16 ns 16 ns 41959886 -// BM_MatrixVectorMultiplyDynamic/4/3 19 ns 19 ns 36674176 -// BM_MatrixVectorMultiplyDynamic/4/4 15 ns 15 ns 43561867 -// BM_MatrixVectorMultiplyDynamic/4/6 21 ns 21 ns 34278607 -// BM_MatrixVectorMultiplyDynamic/4/8 22 ns 22 ns 31484163 -// BM_MatrixVectorMultiplyDynamic/4/10 26 ns 26 ns 25605197 -// BM_MatrixVectorMultiplyDynamic/4/12 31 ns 31 ns 23380172 -// BM_MatrixVectorMultiplyDynamic/4/16 38 ns 38 ns 18054638 -// BM_MatrixVectorMultiplyDynamic/4/20 49 ns 49 ns 14771703 -void BM_MatrixVectorMultiplyDynamic(benchmark::State& state) { - const int rows = state.range(0); - const int cols = state.range(1); - MatrixVectorMultiplyData data(rows, cols); - const std::vector ptrs = data.ptrs(); - const int num_elements = data.num_elements(); - - int i = 0; - for (auto _ : state) { - double* a_ptr = ptrs[3 * i]; - double* b_ptr = ptrs[3 * i + 1]; - double* c_ptr = ptrs[3 * i + 2]; - internal::MatrixVectorMultiply( - a_ptr, rows, cols, b_ptr, c_ptr); - i = (i + 1) % num_elements; - } -} - -// Each ArgPair specifies a row and column size of the matrix. -BENCHMARK(BM_MatrixVectorMultiplyDynamic) -->ArgPair(1, 1) -->ArgPair(1, 2) -->ArgPair(1, 3) -->ArgPair(1, 4) -->ArgPair(1, 6) -->ArgPair(1, 8) -->ArgPair(1, 10) -->ArgPair(1, 12) -->ArgPair(1, 16) -->ArgPair(1, 20) -->ArgPair(2, 1) -->ArgPair(2, 2) -->ArgPair(2, 3) -->ArgPair(2, 4) -->ArgPair(2, 6) -->ArgPair(2, 8) -->ArgPair(2, 10) -->ArgPair(2, 12) -->ArgPair(2, 16) -->ArgPair(2, 20) -->ArgPair(3, 1) -->ArgPair(3, 2) -->ArgPair(3, 3) -->ArgPair(3, 4) -->ArgPair(3, 6) -->ArgPair(3, 8) -->ArgPair(3, 10) -->ArgPair(3, 12) -->ArgPair(3, 16) -->ArgPair(3, 20) -->ArgPair(4, 1) -->ArgPair(4, 2) -->ArgPair(4, 3) -->ArgPair(4, 4) -->ArgPair(4, 6) -->ArgPair(4, 8) -->ArgPair(4, 10) -->ArgPair(4, 12) -->ArgPair(4, 16) -->ArgPair(4, 20); - -// Run on (8 X 2200 MHz CPU s) -// 2018-02-06 21:18:17 -// ------------------------------------------------------------------------------------ -// Benchmark Time CPU Iterations -// ------------------------------------------------------------------------------------ -// BM_MatrixTransposeVectorMultiplyDynamic/1/1 5 ns 5 ns 139356174 -// BM_MatrixTransposeVectorMultiplyDynamic/1/2 6 ns 6 ns 120800041 -// BM_MatrixTransposeVectorMultiplyDynamic/1/3 7 ns 7 ns 100267858 -// BM_MatrixTransposeVectorMultiplyDynamic/1/4 9 ns 9 ns 70778564 -// BM_MatrixTransposeVectorMultiplyDynamic/1/6 14 ns 14 ns 47748651 -// BM_MatrixTransposeVectorMultiplyDynamic/1/8 16 ns 16 ns 43903663 -// BM_MatrixTransposeVectorMultiplyDynamic/1/10 18 ns 18 ns 34838177 -// BM_MatrixTransposeVectorMultiplyDynamic/1/12 20 ns 20 ns 36138731 -// BM_MatrixTransposeVectorMultiplyDynamic/1/16 23 ns 23 ns 27063704 -// BM_MatrixTransposeVectorMultiplyDynamic/1/20 29 ns 29 ns 23400336 -// BM_MatrixTransposeVectorMultiplyDynamic/2/1 6 ns 6 ns 121572101 -// BM_MatrixTransposeVectorMultiplyDynamic/2/2 8 ns 8 ns 82896155 -// BM_MatrixTransposeVectorMultiplyDynamic/2/3 12 ns 12 ns 56705415 -// BM_MatrixTransposeVectorMultiplyDynamic/2/4 14 ns 14 ns 51241509 -// BM_MatrixTransposeVectorMultiplyDynamic/2/6 18 ns 18 ns 38377403 -// BM_MatrixTransposeVectorMultiplyDynamic/2/8 25 ns 25 ns 28560121 -// BM_MatrixTransposeVectorMultiplyDynamic/2/10 29 ns 29 ns 23608052 -// BM_MatrixTransposeVectorMultiplyDynamic/2/12 33 ns 33 ns 20668478 -// BM_MatrixTransposeVectorMultiplyDynamic/2/16 44 ns 44 ns 16335446 -// BM_MatrixTransposeVectorMultiplyDynamic/2/20 53 ns 53 ns 13462315 -// BM_MatrixTransposeVectorMultiplyDynamic/3/1 6 ns 6 ns 117031415 -// BM_MatrixTransposeVectorMultiplyDynamic/3/2 10 ns 10 ns 71040747 -// BM_MatrixTransposeVectorMultiplyDynamic/3/3 14 ns 14 ns 49453538 -// BM_MatrixTransposeVectorMultiplyDynamic/3/4 17 ns 17 ns 39161935 -// BM_MatrixTransposeVectorMultiplyDynamic/3/6 22 ns 22 ns 32118490 -// BM_MatrixTransposeVectorMultiplyDynamic/3/8 28 ns 28 ns 25295689 -// BM_MatrixTransposeVectorMultiplyDynamic/3/10 34 ns 34 ns 20900389 -// BM_MatrixTransposeVectorMultiplyDynamic/3/12 39 ns 39 ns 17934922 -// BM_MatrixTransposeVectorMultiplyDynamic/3/16 51 ns 51 ns 10000000 -// BM_MatrixTransposeVectorMultiplyDynamic/3/20 64 ns 64 ns 10594824 -// BM_MatrixTransposeVectorMultiplyDynamic/4/1 7 ns 7 ns 98903583 -// BM_MatrixTransposeVectorMultiplyDynamic/4/2 13 ns 13 ns 57301899 -// BM_MatrixTransposeVectorMultiplyDynamic/4/3 16 ns 16 ns 44622083 -// BM_MatrixTransposeVectorMultiplyDynamic/4/4 18 ns 18 ns 39645007 -// BM_MatrixTransposeVectorMultiplyDynamic/4/6 26 ns 26 ns 27239262 -// BM_MatrixTransposeVectorMultiplyDynamic/4/8 33 ns 33 ns 20869171 -// BM_MatrixTransposeVectorMultiplyDynamic/4/10 39 ns 39 ns 17169614 -// BM_MatrixTransposeVectorMultiplyDynamic/4/12 47 ns 47 ns 15045286 -// BM_MatrixTransposeVectorMultiplyDynamic/4/16 62 ns 62 ns 11437535 -// BM_MatrixTransposeVectorMultiplyDynamic/4/20 77 ns 77 ns 8351428 -void BM_MatrixTransposeVectorMultiplyDynamic(benchmark::State& state) { - const int rows = state.range(0); - const int cols = state.range(1); - MatrixVectorMultiplyData data(rows, cols); - const std::vector ptrs = data.ptrs(); - const int num_elements = data.num_elements(); - - int i = 0; - for (auto _ : state) { - double* a_ptr = ptrs[3 * i]; - double* b_ptr = ptrs[3 * i + 1]; - double* c_ptr = ptrs[3 * i + 2]; - internal::MatrixTransposeVectorMultiply( - a_ptr, rows, cols, c_ptr, b_ptr); - i = (i + 1) % num_elements; - } -} - -// Each ArgPair specifies a row and column size of the matrix. -BENCHMARK(BM_MatrixTransposeVectorMultiplyDynamic) -->ArgPair(1, 1) -->ArgPair(1, 2) -->ArgPair(1, 3) -->ArgPair(1, 4) -->ArgPair(1, 6) -->ArgPair(1, 8) -->ArgPair(1, 10) -->ArgPair(1, 12) -->ArgPair(1, 16) -->ArgPair(1, 20) -->ArgPair(2, 1) -->ArgPair(2, 2) -->ArgPair(2, 3) -->ArgPair(2, 4) -->ArgPair(2, 6) -->ArgPair(2, 8) -->ArgPair(2, 10) -->ArgPair(2, 12) -->ArgPair(2, 16) -->ArgPair(2, 20) -->ArgPair(3, 1) -->ArgPair(3, 2) -->ArgPair(3, 3) -->ArgPair(3, 4) -->ArgPair(3, 6) -->ArgPair(3, 8) -->ArgPair(3, 10) -->ArgPair(3, 12) -->ArgPair(3, 16) -->ArgPair(3, 20) -->ArgPair(4, 1) -->ArgPair(4, 2) -->ArgPair(4, 3) -->ArgPair(4, 4) -->ArgPair(4, 6) -->ArgPair(4, 8) -->ArgPair(4, 10) -->ArgPair(4, 12) -->ArgPair(4, 16) -->ArgPair(4, 20); - -} // namespace ceres - -BENCHMARK_MAIN(); diff --git a/internal/ceres/small_blas_gemv_benchmark.cc b/internal/ceres/small_blas_gemv_benchmark.cc new file mode 100644 index 000000000..513ff12b7 --- /dev/null +++ b/internal/ceres/small_blas_gemv_benchmark.cc @@ -0,0 +1,116 @@ +// Ceres Solver - A fast non-linear least squares minimizer +// Copyright 2018 Google Inc. All rights reserved. +// http://ceres-solver.org/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of Google Inc. nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// Authors: sameeragarwal@google.com (Sameer Agarwal) + +#include "Eigen/Dense" +#include "benchmark/benchmark.h" +#include "ceres/small_blas.h" + +namespace ceres { + +// Benchmarking matrix-vector multiply routines and optimizing memory +// access requires that we make sure that they are not just sitting in +// the cache. So, as the benchmarking routine iterates, we need to +// multiply new/different matrice and vectors. Allocating/creating +// these objects in the benchmarking loop is too heavy duty, so we +// create them before hand and cycle through them in the +// benchmark. This class, given the size of the matrix creates such +// matrix and vector objects for use in the benchmark. +class MatrixVectorMultiplyData { + public: + MatrixVectorMultiplyData(int rows, int cols) { + rows_ = rows; + cols_ = cols; + + num_elements_ = 1000; + a_.resize(num_elements_ * rows, 1.00001); + b_.resize(num_elements_ * rows * cols, 1.00002); + c_.resize(num_elements_ * cols, 1.00003); + } + + int num_elements() const { return num_elements_; } + double* GetA(int i) { return &a_[i * rows_]; }; + double* GetB(int i) { return &b_[i * rows_ * cols_]; }; + double* GetC(int i) { return &c_[i * cols_]; }; + + private: + int num_elements_; + int rows_; + int cols_; + std::vector a_; + std::vector b_; + std::vector c_; +}; + +// Helper function to generate the various matrix sizes for which we +// run the benchmark. +static void MatrixSizeArguments(benchmark::internal::Benchmark* benchmark) { + std::vector rows = {1, 2, 3, 4}; + std::vector cols = {1, 2, 3, 4, 6, 7, 12, 16, 20}; + for (int r : rows) { + for (int c : cols) { + benchmark->Args({r, c}); + } + } +} + +void BM_MatrixVectorMultiply(benchmark::State& state) { + const int rows = state.range(0); + const int cols = state.range(1); + MatrixVectorMultiplyData data(rows, cols); + const int num_elements = data.num_elements(); + int i = 0; + for (auto _ : state) { + // A += B * C; + internal::MatrixVectorMultiply( + data.GetB(i), rows, cols, data.GetC(i), data.GetA(i)); + i = (i + 1) % num_elements; + } +} + +BENCHMARK(BM_MatrixVectorMultiply)->Apply(MatrixSizeArguments); + +void BM_MatrixTransposeVectorMultiply(benchmark::State& state) { + const int rows = state.range(0); + const int cols = state.range(1); + MatrixVectorMultiplyData data(cols, rows); + const int num_elements = data.num_elements(); + int i = 0; + for (auto _ : state) { + internal::MatrixTransposeVectorMultiply( + data.GetB(i), rows, cols, data.GetC(i), data.GetA(i)); + i = (i + 1) % num_elements; + } +} + +BENCHMARK(BM_MatrixTransposeVectorMultiply)->Apply(MatrixSizeArguments); + +} // namespace ceres + +BENCHMARK_MAIN();