Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Abrahamsson <erik85>2021-06-10 03:34:17 +0300
committerRay Molenkamp <github@lazydodo.com>2021-06-10 03:34:17 +0300
commit4f81b4b4ce2993d583a093f7e278c1274c1ca1cb (patch)
treed0cecef9f2803e29c6d83f5fd9b1ac68d7eadf9d /source/creator
parenta3226bdf3e98dc536edb77a675f1673d0cb284fa (diff)
Windows: Use TBBMalloc for GMP
TBBmalloc_proxy already takes care of any allocations being done from MSVC compiled code, some of the dependencies like GMP cannot be build with MSVC and we have to use mingw to build them. mingw however links against the older msvcrt.dll for its allocation needs, which TBBMallocProxy does not hook. GMP has an option to supply your own allocation functions so we can still manually redirect them to TBBMalloc. In a test-file with a boolean geometry node, this patch uses 32s effective CPU time compared to 52s before. Differential Revision: https://developer.blender.org/D11435 Reviewed by Campbell Barton, Ray Molenkamp
Diffstat (limited to 'source/creator')
-rw-r--r--source/creator/CMakeLists.txt2
-rw-r--r--source/creator/creator.c39
2 files changed, 41 insertions, 0 deletions
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 519b3781103..39bf2f1e32d 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -116,6 +116,7 @@ if(WITH_XR_OPENXR)
endif()
if(WITH_GMP)
+ blender_include_dirs(${GMP_INCLUDE_DIRS})
add_definitions(-DWITH_GMP)
endif()
@@ -909,6 +910,7 @@ elseif(WIN32)
DESTINATION "."
CONFIGURATIONS Debug
)
+ list(APPEND LIB ${TBB_MALLOC_LIBRARIES})
endif()
if(WITH_CODEC_SNDFILE)
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 51efadf5e56..8fbbdb685d3 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -210,6 +210,41 @@ char **environ = NULL;
/** \} */
/* -------------------------------------------------------------------- */
+/** \name GMP Allocator Workaround
+ * \{ */
+
+#if (defined(WITH_TBB_MALLOC) && defined(_MSC_VER) && defined(NDEBUG) && defined(WITH_GMP)) || \
+ defined(DOXYGEN)
+# include "gmp.h"
+# include "tbb/scalable_allocator.h"
+
+void *gmp_alloc(size_t size)
+{
+ return scalable_malloc(size);
+}
+void *gmp_realloc(void *ptr, size_t old_size, size_t new_size)
+{
+ return scalable_realloc(ptr, new_size);
+}
+
+void gmp_free(void *ptr, size_t size)
+{
+ scalable_free(ptr);
+}
+/**
+ * Use TBB's scalable_allocator on Windows.
+ * TBBmalloc correctly captures all allocations already,
+ * however, GMP is built with mingw since it doesn't build with msvc,
+ * which TBB has issues hooking into automatically.
+ */
+void gmp_blender_init_allocator()
+{
+ mp_set_memory_functions(gmp_alloc, gmp_realloc, gmp_free);
+}
+#endif
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Main Function
* \{ */
@@ -342,6 +377,10 @@ int main(int argc,
CCL_init_logging(argv[0]);
#endif
+#if defined(WITH_TBB_MALLOC) && defined(_MSC_VER) && defined(NDEBUG) && defined(WITH_GMP)
+ gmp_blender_init_allocator();
+#endif
+
main_callback_setup();
#if defined(__APPLE__) && !defined(WITH_PYTHON_MODULE) && !defined(WITH_HEADLESS)