Refactor the automatic differentiation benchmarks. 1. Merge them into a single binary. 2. All benchmarks now do the Residual and the Residual + Jacobian evaluation. 3. Re-organize and simplify the CMake file in this directory. 4. Fix a bug in the file where the Clang compiler was not being matched. autodiff_benchmarks --------------------------------------------------------------------------- Benchmark Time CPU Iterations --------------------------------------------------------------------------- BM_Linear1CodeGen/0 3.02 ns 3.01 ns 233870456 BM_Linear1CodeGen/1 3.02 ns 3.01 ns 233059100 BM_Linear1AutoDiff/0 3.78 ns 3.77 ns 185791712 BM_Linear1AutoDiff/1 14.0 ns 13.8 ns 53927875 BM_Linear10CodeGen/0 5.10 ns 5.10 ns 126745007 BM_Linear10CodeGen/1 29.1 ns 29.1 ns 23949310 BM_Linear10AutoDiff/0 6.50 ns 6.49 ns 107516972 BM_Linear10AutoDiff/1 169 ns 169 ns 4153218 BM_Rat43AutoDiff/0 52.7 ns 51.2 ns 16444586 BM_Rat43AutoDiff/1 91.8 ns 91.5 ns 7302316 BM_SnavelyReprojectionCodeGen/0 38.0 ns 36.2 ns 21131501 BM_SnavelyReprojectionCodeGen/1 113 ns 112 ns 5627779 BM_SnavelyReprojectionAutoDiff/0 34.4 ns 34.3 ns 20476937 BM_SnavelyReprojectionAutoDiff/1 242 ns 240 ns 2930611 BM_BrdfCodeGen/0 53.9 ns 53.7 ns 11950083 BM_BrdfCodeGen/1 507 ns 505 ns 1396732 BM_BrdfAutoDiff/0 58.3 ns 57.8 ns 12220670 BM_BrdfAutoDiff/1 2034 ns 1999 ns 257003 autodiff_benchmarks_fast_math --------------------------------------------------------------------------- Benchmark Time CPU Iterations --------------------------------------------------------------------------- BM_Linear1CodeGen/0 3.19 ns 3.16 ns 215313065 BM_Linear1CodeGen/1 2.78 ns 2.76 ns 201497994 BM_Linear1AutoDiff/0 3.27 ns 3.26 ns 206154598 BM_Linear1AutoDiff/1 13.2 ns 13.1 ns 57257840 BM_Linear10CodeGen/0 5.70 ns 5.51 ns 121849325 BM_Linear10CodeGen/1 33.9 ns 33.3 ns 21829295 BM_Linear10AutoDiff/0 6.85 ns 6.78 ns 106813153 BM_Linear10AutoDiff/1 173 ns 171 ns 3849877 BM_Rat43AutoDiff/0 44.8 ns 44.2 ns 15577017 BM_Rat43AutoDiff/1 96.2 ns 94.6 ns 7374864 BM_SnavelyReprojectionCodeGen/0 33.9 ns 33.5 ns 20508373 BM_SnavelyReprojectionCodeGen/1 89.7 ns 88.4 ns 7620624 BM_SnavelyReprojectionAutoDiff/0 36.5 ns 35.8 ns 20546176 BM_SnavelyReprojectionAutoDiff/1 257 ns 252 ns 3044325 BM_BrdfCodeGen/0 61.1 ns 58.5 ns 11334013 BM_BrdfCodeGen/1 265 ns 265 ns 2625459 BM_BrdfAutoDiff/0 52.5 ns 52.5 ns 12938763 BM_BrdfAutoDiff/1 1560 ns 1560 ns 440909 Change-Id: I2d1a4293d3245a50f73af6cf5e5138084321ae6f
diff --git a/internal/ceres/autodiff_benchmarks/CMakeLists.txt b/internal/ceres/autodiff_benchmarks/CMakeLists.txt index 29a238c..454e04b 100644 --- a/internal/ceres/autodiff_benchmarks/CMakeLists.txt +++ b/internal/ceres/autodiff_benchmarks/CMakeLists.txt
@@ -1,3 +1,21 @@ +# TODO: Add support for other compilers +if(CODE_GENERATION) + list(APPEND CERES_BENCHMARK_FLAGS "-DWITH_CODE_GENERATION") +endif() + +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + list(APPEND CERES_BENCHMARK_FLAGS "-mllvm" "-inline-threshold=1000000") +endif() + +add_executable(autodiff_benchmarks autodiff_benchmarks.cc) +add_dependencies_to_benchmark(autodiff_benchmarks) +target_compile_options(autodiff_benchmarks PRIVATE ${CERES_BENCHMARK_FLAGS}) + +# All other flags + fast-math +list(APPEND CERES_BENCHMARK_FAST_MATH_FLAGS ${CERES_BENCHMARK_FLAGS} "-ffast-math") +add_executable(autodiff_benchmarks_fast_math autodiff_benchmarks.cc) +add_dependencies_to_benchmark(autodiff_benchmarks_fast_math) +target_compile_options(autodiff_benchmarks_fast_math PRIVATE ${CERES_BENCHMARK_FAST_MATH_FLAGS}) if(CODE_GENERATION) macro (generate_benchmark_functor FUNCTOR_NAME FUNCTOR_FILE) @@ -15,52 +33,6 @@ generate_benchmark_functor(Linear10CostFunction linear_cost_functions.h) generate_benchmark_functor(Brdf brdf_cost_function.h) - list(APPEND CERES_BENCHMARK_FLAGS "-DWITH_CODE_GENERATION") + target_link_libraries(autodiff_benchmarks PUBLIC SnavelyReprojectionError Linear1CostFunction Linear10CostFunction Brdf) + target_link_libraries(autodiff_benchmarks_fast_math PUBLIC SnavelyReprojectionError Linear1CostFunction Linear10CostFunction Brdf) endif() - - -# TODO: Add support for other compilers -if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - list(APPEND CERES_BENCHMARK_FLAGS "-mllvm" "-inline-threshold=1000000") - - # All other flags + fast-math - list(APPEND CERES_BENCHMARK_FAST_MATH_FLAGS ${CERES_BENCHMARK_FLAGS} "-ffast-math") -endif() - -add_executable(rat43_benchmark rat43_benchmark.cc) -add_dependencies_to_benchmark(rat43_benchmark) - - -add_executable(snavely_reprojection_error_benchmark snavely_reprojection_error_benchmark.cc) -add_dependencies_to_benchmark(snavely_reprojection_error_benchmark) -target_compile_options(snavely_reprojection_error_benchmark PRIVATE ${CERES_BENCHMARK_FLAGS}) - -add_executable(snavely_reprojection_error_benchmark_fast_math snavely_reprojection_error_benchmark.cc) -add_dependencies_to_benchmark(snavely_reprojection_error_benchmark_fast_math) -target_compile_options(snavely_reprojection_error_benchmark_fast_math PRIVATE ${CERES_BENCHMARK_FAST_MATH_FLAGS}) - -add_executable(linear_benchmark linear_benchmark.cc) -add_dependencies_to_benchmark(linear_benchmark) -target_compile_options(linear_benchmark PRIVATE ${CERES_BENCHMARK_FLAGS}) - -add_executable(linear_benchmark_fast_math linear_benchmark.cc) -add_dependencies_to_benchmark(linear_benchmark_fast_math) -target_compile_options(linear_benchmark_fast_math PRIVATE ${CERES_BENCHMARK_FAST_MATH_FLAGS}) - -add_executable(brdf_benchmark brdf_benchmark.cc) -add_dependencies_to_benchmark(brdf_benchmark) -target_compile_options(brdf_benchmark PRIVATE ${CERES_BENCHMARK_FLAGS}) - -add_executable(brdf_benchmark_fast_math brdf_benchmark.cc) -add_dependencies_to_benchmark(brdf_benchmark_fast_math) -target_compile_options(brdf_benchmark_fast_math PRIVATE ${CERES_BENCHMARK_FAST_MATH_FLAGS}) - -if(CODE_GENERATION) - target_link_libraries(snavely_reprojection_error_benchmark PUBLIC SnavelyReprojectionError) - target_link_libraries(snavely_reprojection_error_benchmark_fast_math PUBLIC SnavelyReprojectionError) - target_link_libraries(linear_benchmark PUBLIC Linear1CostFunction Linear10CostFunction) - target_link_libraries(linear_benchmark_fast_math PUBLIC Linear1CostFunction Linear10CostFunction) - target_link_libraries(brdf_benchmark PUBLIC Brdf) - target_link_libraries(brdf_benchmark_fast_math PUBLIC Brdf) -endif() -
diff --git a/internal/ceres/autodiff_benchmarks/autodiff_benchmarks.cc b/internal/ceres/autodiff_benchmarks/autodiff_benchmarks.cc new file mode 100644 index 0000000..89f56df --- /dev/null +++ b/internal/ceres/autodiff_benchmarks/autodiff_benchmarks.cc
@@ -0,0 +1,299 @@ +// Ceres Solver - A fast non-linear least squares minimizer +// Copyright 2020 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. +// +// Author: darius.rueckert@fau.de (Darius Rueckert) + +#include <memory> + +#include "benchmark/benchmark.h" +#include "ceres/autodiff_benchmarks/brdf_cost_function.h" +#include "ceres/autodiff_benchmarks/linear_cost_functions.h" +#include "ceres/autodiff_benchmarks/snavely_reprojection_error.h" +#include "ceres/ceres.h" +#include "ceres/codegen/test_utils.h" + +namespace ceres { + +#ifdef WITH_CODE_GENERATION +static void BM_Linear1CodeGen(benchmark::State& state) { + double parameter_block1[] = {1.}; + double* parameters[] = {parameter_block1}; + + double jacobian1[1]; + double residuals[1]; + double* jacobians[] = {jacobian1}; + + std::unique_ptr<ceres::CostFunction> cost_function(new Linear1CostFunction()); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_Linear1CodeGen)->Arg(0)->Arg(1); +#endif + +static void BM_Linear1AutoDiff(benchmark::State& state) { + using FunctorType = + ceres::internal::CostFunctionToFunctor<Linear1CostFunction>; + + double parameter_block1[] = {1.}; + double* parameters[] = {parameter_block1}; + + double jacobian1[1]; + double residuals[1]; + double* jacobians[] = {jacobian1}; + + std::unique_ptr<ceres::CostFunction> cost_function( + new ceres::AutoDiffCostFunction<FunctorType, 1, 1>(new FunctorType())); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_Linear1AutoDiff)->Arg(0)->Arg(1); +; + +#ifdef WITH_CODE_GENERATION +static void BM_Linear10CodeGen(benchmark::State& state) { + double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; + double* parameters[] = {parameter_block1}; + + double jacobian1[10 * 10]; + double residuals[10]; + double* jacobians[] = {jacobian1}; + + std::unique_ptr<ceres::CostFunction> cost_function( + new Linear10CostFunction()); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_Linear10CodeGen)->Arg(0)->Arg(1); +; +#endif + +static void BM_Linear10AutoDiff(benchmark::State& state) { + using FunctorType = + ceres::internal::CostFunctionToFunctor<Linear10CostFunction>; + + double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; + double* parameters[] = {parameter_block1}; + + double jacobian1[10 * 10]; + double residuals[10]; + double* jacobians[] = {jacobian1}; + + std::unique_ptr<ceres::CostFunction> cost_function( + new ceres::AutoDiffCostFunction<FunctorType, 10, 10>(new FunctorType())); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_Linear10AutoDiff)->Arg(0)->Arg(1); +; + +// From the NIST problem collection. +struct Rat43CostFunctor { + Rat43CostFunctor(const double x, const double y) : x_(x), y_(y) {} + + template <typename T> + bool operator()(const T* parameters, T* residuals) const { + const T& b1 = parameters[0]; + const T& b2 = parameters[1]; + const T& b3 = parameters[2]; + const T& b4 = parameters[3]; + residuals[0] = b1 * pow(1.0 + exp(b2 - b3 * x_), -1.0 / b4) - y_; + return true; + } + + private: + const double x_; + const double y_; +}; + +static void BM_Rat43AutoDiff(benchmark::State& state) { + double parameter_block1[] = {1., 2., 3., 4.}; + double* parameters[] = {parameter_block1}; + + double jacobian1[] = {0.0, 0.0, 0.0, 0.0}; + double residuals; + double* jacobians[] = {jacobian1}; + const double x = 0.2; + const double y = 0.3; + std::unique_ptr<ceres::CostFunction> cost_function( + new ceres::AutoDiffCostFunction<Rat43CostFunctor, 1, 4>( + new Rat43CostFunctor(x, y))); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, &residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_Rat43AutoDiff)->Arg(0)->Arg(1); + +#ifdef WITH_CODE_GENERATION +static void BM_SnavelyReprojectionCodeGen(benchmark::State& state) { + double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9.}; + double parameter_block2[] = {1., 2., 3.}; + double* parameters[] = {parameter_block1, parameter_block2}; + + double jacobian1[2 * 9]; + double jacobian2[2 * 3]; + double residuals[2]; + double* jacobians[] = {jacobian1, jacobian2}; + + const double x = 0.2; + const double y = 0.3; + + std::unique_ptr<ceres::CostFunction> cost_function( + new SnavelyReprojectionError(x, y)); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} +BENCHMARK(BM_SnavelyReprojectionCodeGen)->Arg(0)->Arg(1); +; +#endif + +static void BM_SnavelyReprojectionAutoDiff(benchmark::State& state) { + using FunctorType = + ceres::internal::CostFunctionToFunctor<SnavelyReprojectionError>; + + double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9.}; + double parameter_block2[] = {1., 2., 3.}; + double* parameters[] = {parameter_block1, parameter_block2}; + + double jacobian1[2 * 9]; + double jacobian2[2 * 3]; + double residuals[2]; + double* jacobians[] = {jacobian1, jacobian2}; + + const double x = 0.2; + const double y = 0.3; + std::unique_ptr<ceres::CostFunction> cost_function( + new ceres::AutoDiffCostFunction<FunctorType, 2, 9, 3>( + new FunctorType(x, y))); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} + +BENCHMARK(BM_SnavelyReprojectionAutoDiff)->Arg(0)->Arg(1); +; + +#ifdef WITH_CODE_GENERATION +static void BM_BrdfCodeGen(benchmark::State& state) { + using FunctorType = ceres::internal::CostFunctionToFunctor<Brdf>; + + double material[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; + auto c = Eigen::Vector3d(0.1, 0.2, 0.3); + auto n = Eigen::Vector3d(-0.1, 0.5, 0.2).normalized(); + auto v = Eigen::Vector3d(0.5, -0.2, 0.9).normalized(); + auto l = Eigen::Vector3d(-0.3, 0.4, -0.3).normalized(); + auto x = Eigen::Vector3d(0.5, 0.7, -0.1).normalized(); + auto y = Eigen::Vector3d(0.2, -0.2, -0.2).normalized(); + + double* parameters[7] = { + material, c.data(), n.data(), v.data(), l.data(), x.data(), y.data()}; + + double jacobian[(10 + 6 * 3) * 3]; + double residuals[3]; + double* jacobians[7] = { + jacobian + 0, + jacobian + 10 * 3, + jacobian + 13 * 3, + jacobian + 16 * 3, + jacobian + 19 * 3, + jacobian + 22 * 3, + jacobian + 25 * 3, + }; + + std::unique_ptr<ceres::CostFunction> cost_function(new Brdf()); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} + +BENCHMARK(BM_BrdfCodeGen)->Arg(0)->Arg(1); +; +#endif + +static void BM_BrdfAutoDiff(benchmark::State& state) { + using FunctorType = ceres::internal::CostFunctionToFunctor<Brdf>; + + double material[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; + auto c = Eigen::Vector3d(0.1, 0.2, 0.3); + auto n = Eigen::Vector3d(-0.1, 0.5, 0.2).normalized(); + auto v = Eigen::Vector3d(0.5, -0.2, 0.9).normalized(); + auto l = Eigen::Vector3d(-0.3, 0.4, -0.3).normalized(); + auto x = Eigen::Vector3d(0.5, 0.7, -0.1).normalized(); + auto y = Eigen::Vector3d(0.2, -0.2, -0.2).normalized(); + + double* parameters[7] = { + material, c.data(), n.data(), v.data(), l.data(), x.data(), y.data()}; + + double jacobian[(10 + 6 * 3) * 3]; + double residuals[3]; + double* jacobians[7] = { + jacobian + 0, + jacobian + 10 * 3, + jacobian + 13 * 3, + jacobian + 16 * 3, + jacobian + 19 * 3, + jacobian + 22 * 3, + jacobian + 25 * 3, + }; + + std::unique_ptr<ceres::CostFunction> cost_function( + new ceres::AutoDiffCostFunction<FunctorType, 3, 10, 3, 3, 3, 3, 3, 3>( + new FunctorType)); + + for (auto _ : state) { + cost_function->Evaluate( + parameters, residuals, state.range(0) ? jacobians : nullptr); + } +} + +BENCHMARK(BM_BrdfAutoDiff)->Arg(0)->Arg(1); +; + +} // namespace ceres + +BENCHMARK_MAIN();
diff --git a/internal/ceres/autodiff_benchmarks/brdf_benchmark.cc b/internal/ceres/autodiff_benchmarks/brdf_benchmark.cc deleted file mode 100644 index b66ecf3..0000000 --- a/internal/ceres/autodiff_benchmarks/brdf_benchmark.cc +++ /dev/null
@@ -1,116 +0,0 @@ -// Ceres Solver - A fast non-linear least squares minimizer -// Copyright 2020 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. -// -// Author: darius.rueckert@fau.de (Darius Rueckert) - -#include <memory> - -#include "benchmark/benchmark.h" -#include "brdf_cost_function.h" -#include "ceres/ceres.h" -#include "codegen/test_utils.h" - -namespace ceres { - -#ifdef WITH_CODE_GENERATION -static void BM_BrdfCodeGen(benchmark::State& state) { - using FunctorType = ceres::internal::CostFunctionToFunctor<Brdf>; - - double material[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; - auto c = Eigen::Vector3d(0.1, 0.2, 0.3); - auto n = Eigen::Vector3d(-0.1, 0.5, 0.2).normalized(); - auto v = Eigen::Vector3d(0.5, -0.2, 0.9).normalized(); - auto l = Eigen::Vector3d(-0.3, 0.4, -0.3).normalized(); - auto x = Eigen::Vector3d(0.5, 0.7, -0.1).normalized(); - auto y = Eigen::Vector3d(0.2, -0.2, -0.2).normalized(); - - double* parameters[7] = { - material, c.data(), n.data(), v.data(), l.data(), x.data(), y.data()}; - - double jacobian[(10 + 6 * 3) * 3]; - double residuals[3]; - double* jacobians[7] = { - jacobian + 0, - jacobian + 10 * 3, - jacobian + 13 * 3, - jacobian + 16 * 3, - jacobian + 19 * 3, - jacobian + 22 * 3, - jacobian + 25 * 3, - }; - - std::unique_ptr<ceres::CostFunction> cost_function(new Brdf()); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} - -BENCHMARK(BM_BrdfCodeGen); -#endif - -static void BM_BrdfAutoDiff(benchmark::State& state) { - using FunctorType = ceres::internal::CostFunctionToFunctor<Brdf>; - - double material[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; - auto c = Eigen::Vector3d(0.1, 0.2, 0.3); - auto n = Eigen::Vector3d(-0.1, 0.5, 0.2).normalized(); - auto v = Eigen::Vector3d(0.5, -0.2, 0.9).normalized(); - auto l = Eigen::Vector3d(-0.3, 0.4, -0.3).normalized(); - auto x = Eigen::Vector3d(0.5, 0.7, -0.1).normalized(); - auto y = Eigen::Vector3d(0.2, -0.2, -0.2).normalized(); - - double* parameters[7] = { - material, c.data(), n.data(), v.data(), l.data(), x.data(), y.data()}; - - double jacobian[(10 + 6 * 3) * 3]; - double residuals[3]; - double* jacobians[7] = { - jacobian + 0, - jacobian + 10 * 3, - jacobian + 13 * 3, - jacobian + 16 * 3, - jacobian + 19 * 3, - jacobian + 22 * 3, - jacobian + 25 * 3, - }; - - std::unique_ptr<ceres::CostFunction> cost_function( - new ceres::AutoDiffCostFunction<FunctorType, 3, 10, 3, 3, 3, 3, 3, 3>( - new FunctorType)); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} - -BENCHMARK(BM_BrdfAutoDiff); - -} // namespace ceres - -BENCHMARK_MAIN();
diff --git a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h index 287c409..de69cdd 100644 --- a/internal/ceres/autodiff_benchmarks/brdf_cost_function.h +++ b/internal/ceres/autodiff_benchmarks/brdf_cost_function.h
@@ -58,7 +58,6 @@ const T* const y_ptr, T* residual) const { using ceres::Ternary; - using Vec2 = Eigen::Matrix<T, 2, 1>; using Vec3 = Eigen::Matrix<T, 3, 1>; T metallic = material[0];
diff --git a/internal/ceres/autodiff_benchmarks/linear_benchmark.cc b/internal/ceres/autodiff_benchmarks/linear_benchmark.cc deleted file mode 100644 index 25f6bd6..0000000 --- a/internal/ceres/autodiff_benchmarks/linear_benchmark.cc +++ /dev/null
@@ -1,119 +0,0 @@ -// Ceres Solver - A fast non-linear least squares minimizer -// Copyright 2020 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. -// -// Author: darius.rueckert@fau.de (Darius Rueckert) - -#include <memory> - -#include "benchmark/benchmark.h" -#include "ceres/ceres.h" -#include "codegen/test_utils.h" -#include "linear_cost_functions.h" - -namespace ceres { - -#ifdef WITH_CODE_GENERATION -static void BM_Linear1CodeGen(benchmark::State& state) { - double parameter_block1[] = {1.}; - double* parameters[] = {parameter_block1}; - - double jacobian1[1]; - double residuals[1]; - double* jacobians[] = {jacobian1}; - - std::unique_ptr<ceres::CostFunction> cost_function(new Linear1CostFunction()); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} -BENCHMARK(BM_Linear1CodeGen); -#endif - -static void BM_Linear1AutoDiff(benchmark::State& state) { - using FunctorType = - ceres::internal::CostFunctionToFunctor<Linear1CostFunction>; - - double parameter_block1[] = {1.}; - double* parameters[] = {parameter_block1}; - - double jacobian1[1]; - double residuals[1]; - double* jacobians[] = {jacobian1}; - - std::unique_ptr<ceres::CostFunction> cost_function( - new ceres::AutoDiffCostFunction<FunctorType, 1, 1>(new FunctorType())); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} -BENCHMARK(BM_Linear1AutoDiff); - -#ifdef WITH_CODE_GENERATION -static void BM_Linear10CodeGen(benchmark::State& state) { - double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; - double* parameters[] = {parameter_block1}; - - double jacobian1[10 * 10]; - double residuals[10]; - double* jacobians[] = {jacobian1}; - - std::unique_ptr<ceres::CostFunction> cost_function( - new Linear10CostFunction()); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} -BENCHMARK(BM_Linear10CodeGen); -#endif - -static void BM_Linear10AutoDiff(benchmark::State& state) { - using FunctorType = - ceres::internal::CostFunctionToFunctor<Linear10CostFunction>; - - double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}; - double* parameters[] = {parameter_block1}; - - double jacobian1[10 * 10]; - double residuals[10]; - double* jacobians[] = {jacobian1}; - - std::unique_ptr<ceres::CostFunction> cost_function( - new ceres::AutoDiffCostFunction<FunctorType, 10, 10>(new FunctorType())); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} -BENCHMARK(BM_Linear10AutoDiff); - -} // namespace ceres - -BENCHMARK_MAIN();
diff --git a/internal/ceres/autodiff_benchmarks/linear_cost_functions.h b/internal/ceres/autodiff_benchmarks/linear_cost_functions.h index 2a9c06c..e009ee2 100644 --- a/internal/ceres/autodiff_benchmarks/linear_cost_functions.h +++ b/internal/ceres/autodiff_benchmarks/linear_cost_functions.h
@@ -34,6 +34,7 @@ #include "ceres/codegen/codegen_cost_function.h" #include "ceres/rotation.h" + namespace ceres { struct Linear1CostFunction : public ceres::CodegenCostFunction<1, 1> { @@ -71,5 +72,6 @@ } #endif }; -} +} // namespace ceres + #endif // CERES_INTERNAL_AUTODIFF_BENCHMARKS_LINEAR_COST_FUNCTIONS_H_
diff --git a/internal/ceres/autodiff_benchmarks/rat43_benchmark.cc b/internal/ceres/autodiff_benchmarks/rat43_benchmark.cc deleted file mode 100644 index d9a1e57..0000000 --- a/internal/ceres/autodiff_benchmarks/rat43_benchmark.cc +++ /dev/null
@@ -1,116 +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 <memory> - -#include "benchmark/benchmark.h" -#include "ceres/ceres.h" -#include "ceres/jet.h" - -namespace ceres { - -// From the NIST problem collection. -struct Rat43CostFunctor { - Rat43CostFunctor(const double x, const double y) : x_(x), y_(y) {} - - template <typename T> - bool operator()(const T* parameters, T* residuals) const { - const T& b1 = parameters[0]; - const T& b2 = parameters[1]; - const T& b3 = parameters[2]; - const T& b4 = parameters[3]; - residuals[0] = b1 * pow(1.0 + exp(b2 - b3 * x_), -1.0 / b4) - y_; - return true; - } - - private: - const double x_; - const double y_; -}; - -// Simple implementation of autodiff using Jets directly instead of -// going through the machinery of AutoDiffCostFunction, which does -// the same thing, but much more generically. -class Rat43Automatic : public ceres::SizedCostFunction<1, 4> { - public: - Rat43Automatic(const Rat43CostFunctor* functor) : functor_(functor) {} - virtual ~Rat43Automatic() {} - bool Evaluate(double const* const* parameters, - double* residuals, - double** jacobians) const final { - if (!jacobians) { - return (*functor_)(parameters[0], residuals); - } - - typedef ceres::Jet<double, 4> JetT; - JetT jets[4]; - for (int i = 0; i < 4; ++i) { - jets[i].a = parameters[0][i]; - jets[i].v.setZero(); - jets[i].v[i] = 1.0; - } - - JetT result; - (*functor_)(jets, &result); - - residuals[0] = result.a; - for (int i = 0; i < 4; ++i) { - jacobians[0][i] = result.v[i]; - } - return true; - } - - private: - std::unique_ptr<const Rat43CostFunctor> functor_; -}; - -static void BM_Rat43AutoDiff(benchmark::State& state) { - double parameter_block1[] = {1., 2., 3., 4.}; - double* parameters[] = {parameter_block1}; - - double jacobian1[] = {0.0, 0.0, 0.0, 0.0}; - double residuals; - double* jacobians[] = {jacobian1}; - const double x = 0.2; - const double y = 0.3; - std::unique_ptr<ceres::CostFunction> cost_function( - new ceres::AutoDiffCostFunction<Rat43CostFunctor, 1, 4>( - new Rat43CostFunctor(x, y))); - - while (state.KeepRunning()) { - cost_function->Evaluate( - parameters, &residuals, state.range(0) ? jacobians : nullptr); - } -} -BENCHMARK(BM_Rat43AutoDiff)->Arg(0)->Arg(1); - -} // namespace ceres - -BENCHMARK_MAIN();
diff --git a/internal/ceres/autodiff_benchmarks/snavely_reprojection_error_benchmark.cc b/internal/ceres/autodiff_benchmarks/snavely_reprojection_error_benchmark.cc deleted file mode 100644 index 4a58db2..0000000 --- a/internal/ceres/autodiff_benchmarks/snavely_reprojection_error_benchmark.cc +++ /dev/null
@@ -1,92 +0,0 @@ -// Ceres Solver - A fast non-linear least squares minimizer -// Copyright 2020 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. -// -// Author: darius.rueckert@fau.de (Darius Rueckert) - -#include <memory> - -#include "benchmark/benchmark.h" -#include "ceres/ceres.h" -#include "codegen/test_utils.h" -#include "snavely_reprojection_error.h" - -namespace ceres { - -#ifdef WITH_CODE_GENERATION -static void BM_SnavelyReprojectionCodeGen(benchmark::State& state) { - double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9.}; - double parameter_block2[] = {1., 2., 3.}; - double* parameters[] = {parameter_block1, parameter_block2}; - - double jacobian1[2 * 9]; - double jacobian2[2 * 3]; - double residuals[2]; - double* jacobians[] = {jacobian1, jacobian2}; - - const double x = 0.2; - const double y = 0.3; - - std::unique_ptr<ceres::CostFunction> cost_function( - new SnavelyReprojectionError(x, y)); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} -BENCHMARK(BM_SnavelyReprojectionCodeGen); -#endif - -static void BM_SnavelyReprojectionAutoDiff(benchmark::State& state) { - using FunctorType = - ceres::internal::CostFunctionToFunctor<SnavelyReprojectionError>; - - double parameter_block1[] = {1., 2., 3., 4., 5., 6., 7., 8., 9.}; - double parameter_block2[] = {1., 2., 3.}; - double* parameters[] = {parameter_block1, parameter_block2}; - - double jacobian1[2 * 9]; - double jacobian2[2 * 3]; - double residuals[2]; - double* jacobians[] = {jacobian1, jacobian2}; - - const double x = 0.2; - const double y = 0.3; - std::unique_ptr<ceres::CostFunction> cost_function( - new ceres::AutoDiffCostFunction<FunctorType, 2, 9, 3>( - new FunctorType(x, y))); - - while (state.KeepRunning()) { - cost_function->Evaluate(parameters, residuals, jacobians); - } -} - -BENCHMARK(BM_SnavelyReprojectionAutoDiff); - -} // namespace ceres - -BENCHMARK_MAIN();