[Bf-blender-cvs] [20d0dcbe76b] temp-lib-google-benchmark: Migrated lattice deform benchmark.
Jeroen Bakker
noreply at git.blender.org
Wed May 26 14:33:36 CEST 2021
Commit: 20d0dcbe76b464cdf78fb1fe85ba5e56d6195540
Author: Jeroen Bakker
Date: Wed May 26 14:33:10 2021 +0200
Branches: temp-lib-google-benchmark
https://developer.blender.org/rB20d0dcbe76b464cdf78fb1fe85ba5e56d6195540
Migrated lattice deform benchmark.
===================================================================
M build_files/cmake/macros.cmake
M source/blender/blenkernel/CMakeLists.txt
A source/blender/blenkernel/intern/lattice_deform_benchmark.cc
M tests/gbenchmark/CMakeLists.txt
M tests/gbenchmark/gbenchmark_test.cc
===================================================================
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 813ac013cdf..f0f92c74134 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -504,6 +504,30 @@ function(blender_add_test_executable
)
endfunction()
+# Add tests for a Blender library, to be called in tandem with blender_add_lib().
+# The tests will be part of the blender_test executable (see tests/gtests/runner).
+function(blender_add_benchmark_lib
+ name
+ sources
+ includes
+ includes_sys
+ library_deps
+ )
+
+ add_cc_flags_custom_test(${name} PARENT_SCOPE)
+
+ # Otherwise external projects will produce warnings that we cannot fix.
+ remove_strict_flags()
+
+ LIST(APPEND includes_sys
+ ${CMAKE_SOURCE_DIR}/extern/gbenchmark/include
+ )
+
+ blender_add_lib__impl(${name} "${sources}" "${includes}" "${includes_sys}" "${library_deps}")
+
+ set_property(GLOBAL APPEND PROPERTY BLENDER_BENCHMARK_LIBS ${name})
+endfunction()
+
# Ninja only: assign 'heavy pool' to some targets that are especially RAM-consuming to build.
function(setup_heavy_lib_pool)
if(WITH_NINJA_POOL_JOBS AND NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
@@ -525,6 +549,36 @@ function(setup_heavy_lib_pool)
endif()
endfunction()
+# Add benchmarks for a Blender library, to be called in tandem with blender_add_lib().
+# benchmark will be compiled into a ${name}_benchmark executable.
+#
+# To be used for smaller isolated libraries, that do not have many dependencies.
+# For libraries that do drag in many other Blender libraries and would create a
+# very large executable, blender_add_benchmark_lib() should be used instead.
+function(blender_add_benchmark_executable
+ name
+ sources
+ includes
+ includes_sys
+ library_deps
+ )
+
+ add_cc_flags_custom_test(${name} PARENT_SCOPE)
+
+ ## Otherwise external projects will produce warnings that we cannot fix.
+ remove_strict_flags()
+
+ include_directories(${includes})
+ include_directories(${includes_sys})
+ setup_libdirs()
+
+ blender_add_benchmark_suite(
+ TARGET ${name}_benchmark
+ SUITE_NAME ${name}
+ SOURCES "${sources}"
+ )
+endfunction()
+
function(SETUP_LIBDIRS)
# NOTE: For all new libraries, use absolute library paths.
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 021d7e15814..3796cb068bd 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -778,3 +778,13 @@ if(WITH_GTESTS)
include(GTestTesting)
blender_add_test_lib(bf_blenkernel_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}")
endif()
+
+if(WITH_BENCHMARK_TESTS)
+ set(TEST_SRC
+ intern/lattice_deform_benchmark.cc
+ )
+ set(TEST_INC
+ )
+ # include(GBenchmarkTesting)
+ blender_add_benchmark_lib(bf_blenkernel_benchmarks "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}")
+endif()
diff --git a/source/blender/blenkernel/intern/lattice_deform_benchmark.cc b/source/blender/blenkernel/intern/lattice_deform_benchmark.cc
new file mode 100644
index 00000000000..774ec65f137
--- /dev/null
+++ b/source/blender/blenkernel/intern/lattice_deform_benchmark.cc
@@ -0,0 +1,98 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2021 by Blender Foundation.
+ */
+
+#include <benchmark/benchmark.h>
+
+#include "BKE_idtype.h"
+#include "BKE_lattice.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_rand.hh"
+
+namespace blender::bke::benchmarks {
+
+struct LatticeDeformTestContext {
+ Lattice lattice;
+ Object ob_lattice;
+ Mesh mesh;
+ Object ob_mesh;
+ float (*coords)[3];
+ LatticeDeformData *ldd;
+};
+
+static void test_lattice_deform_init(LatticeDeformTestContext *ctx,
+ RandomNumberGenerator *rng,
+ int32_t num_items)
+{
+ /* Generate random input data between -5 and 5. */
+ ctx->coords = (float(*)[3])MEM_malloc_arrayN(sizeof(float[3]), num_items, __func__);
+ for (uint32_t index = 0; index < num_items; index++) {
+ ctx->coords[index][0] = (rng->get_float() - 0.5f) * 10;
+ ctx->coords[index][1] = (rng->get_float() - 0.5f) * 10;
+ ctx->coords[index][2] = (rng->get_float() - 0.5f) * 10;
+ }
+ IDType_ID_LT.init_data(&ctx->lattice.id);
+ strcpy(ctx->lattice.id.name, "LTLattice");
+ IDType_ID_OB.init_data(&ctx->ob_lattice.id);
+ ctx->ob_lattice.type = OB_LATTICE;
+ ctx->ob_lattice.data = &ctx->lattice;
+ IDType_ID_OB.init_data(&ctx->ob_mesh.id);
+ IDType_ID_ME.init_data(&ctx->mesh.id);
+ ctx->ob_mesh.type = OB_MESH;
+ ctx->ob_mesh.data = &ctx->mesh;
+
+ ctx->ldd = BKE_lattice_deform_data_create(&ctx->ob_lattice, &ctx->ob_mesh);
+}
+
+static void test_lattice_deform(LatticeDeformTestContext *ctx, int32_t num_items)
+{
+ for (int i = 0; i < num_items; i++) {
+ float *co = &ctx->coords[i][0];
+ BKE_lattice_deform_data_eval_co(ctx->ldd, co, 1.0f);
+ }
+}
+
+static void test_lattice_deform_free(LatticeDeformTestContext *ctx)
+{
+ BKE_lattice_deform_data_destroy(ctx->ldd);
+ MEM_freeN(ctx->coords);
+ IDType_ID_LT.free_data(&ctx->lattice.id);
+ IDType_ID_OB.free_data(&ctx->ob_lattice.id);
+ IDType_ID_OB.free_data(&ctx->ob_mesh.id);
+ IDType_ID_ME.free_data(&ctx->mesh.id);
+}
+
+static void lattice_deform_benchmark(benchmark::State &state) {
+ for (auto _ : state) {
+ const int32_t num_items = state.range(0);
+ LatticeDeformTestContext ctx = {{{nullptr}}};
+ RandomNumberGenerator rng;
+ test_lattice_deform_init(&ctx, &rng, num_items);
+ test_lattice_deform(&ctx, num_items);
+ test_lattice_deform_free(&ctx);
+ }
+}
+
+BENCHMARK(lattice_deform_benchmark)->RangeMultiplier(10)->Range(1000, 10000000);
+
+}
diff --git a/tests/gbenchmark/CMakeLists.txt b/tests/gbenchmark/CMakeLists.txt
index 1670e9af7e6..78a73cc701f 100644
--- a/tests/gbenchmark/CMakeLists.txt
+++ b/tests/gbenchmark/CMakeLists.txt
@@ -1,4 +1,7 @@
-if(WITH_BENCHMARK_TESTS)
+# Otherwise we get warnings here that we cant fix in external projects
+remove_strict_flags()
+
+if(WITH_BENCHMARK_TESTS AND NOT (WITH_BUILDINFO))
set(INC
.
../../extern/gbenchmark/include/
@@ -16,5 +19,9 @@ if(WITH_BENCHMARK_TESTS)
extern_gbenchmark
)
- blender_add_test_executable(benchmark "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
+ # TODO: check on none linux platforms.
+ get_property(_test_libs GLOBAL PROPERTY BLENDER_BENCHMARK_LIBS)
+ list(APPEND BENCHMARK_LIBS "-Wl,--whole-archive" ${_test_libs} "-Wl,--no-whole-archive")
+
+ blender_add_test_executable(blender_benchmark "${SRC}" "${INC}" "${INC_SYS}" "${LIB};${BENCHMARK_LIBS}")
endif()
diff --git a/tests/gbenchmark/gbenchmark_test.cc b/tests/gbenchmark/gbenchmark_test.cc
index 9884d9611f7..15a9b094c0a 100644
--- a/tests/gbenchmark/gbenchmark_test.cc
+++ b/tests/gbenchmark/gbenchmark_test.cc
@@ -1,18 +1,3 @@
-#include <benchmark/benchmark.h>
-
-static void BM_StringCreation(benchmark::State &state)
-{
- for (auto _ : state)
- std::string empty_string;
-}
-// Register the function as a benchmark
-BENCHMARK(BM_StringCreation);
-
-// Define another benchmark
-static void BM_StringCopy(benchmark::State &state)
-{
- std::string x = "hello";
- for (auto _ : state)
- std::string copy(x);
-}
-BENCHMARK(BM_StringCopy);
+/*
+ * File is left blank intentionally as a single source file is needed to compile a library.
+ */
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list