From 8f2ad1d853940a3d601f20d4aaa66bc9e9cb1103 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 2 Sep 2020 13:46:16 +0100 Subject: [PATCH] [Feature] Support BLIS blas library --- blas-config.h.in | 1 + cmake/Openblas.cmake | 19 ++++++++++++++++++- src/libserver/cfg_utils.c | 7 +++++++ src/libutil/util.c | 17 +++++++++++------ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/blas-config.h.in b/blas-config.h.in index 8d10ebf2e..4f8379731 100644 --- a/blas-config.h.in +++ b/blas-config.h.in @@ -4,6 +4,7 @@ #cmakedefine HAVE_CBLAS_SGEMM 1 #cmakedefine HAVE_CBLAS_SAXPY 1 #cmakedefine HAVE_OPENBLAS_SET_NUM_THREADS 1 +#cmakedefine HAVE_BLI_THREAD_SET_NUM_THREADS 1 #cmakedefine HAVE_CBLAS_H 1 #cmakedefine HAVE_CBLAS 1 diff --git a/cmake/Openblas.cmake b/cmake/Openblas.cmake index 042d00f8f..da62363ef 100644 --- a/cmake/Openblas.cmake +++ b/cmake/Openblas.cmake @@ -1,14 +1,16 @@ option (ENABLE_BLAS "Enable openblas for fast neural network processing [default: OFF]" OFF) IF(ENABLE_BLAS MATCHES "ON") - ProcessPackage(BLAS OPTIONAL_INCLUDE LIBRARY openblas blas + ProcessPackage(BLAS OPTIONAL_INCLUDE LIBRARY openblas blas blis INCLUDE cblas.h INCLUDE_SUFFIXES include/openblas include/blas + include/blis ROOT ${BLAS_ROOT_DIR} LIB_OUTPUT BLAS_REQUIRED_LIBRARIES) ProcessPackage(BLAS_LAPACK OPTIONAL_INCLUDE LIBRARY lapack INCLUDE cblas.h INCLUDE_SUFFIXES include/openblas include/blas + include/blis ROOT ${BLAS_ROOT_DIR} LIB_OUTPUT BLAS_REQUIRED_LIBRARIES) ENDIF() @@ -84,6 +86,21 @@ int main(int argc, char **argv) LINK_LIBRARIES ${BLAS_REQUIRED_LIBRARIES} OUTPUT_VARIABLE OPENBLAS_SET_NUM_THREADS_ERR) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/bli_thread_set_num_threads.c" " +#include +extern void bli_thread_set_num_threads(int num_threads); +int main(int argc, char **argv) +{ + bli_thread_set_num_threads(1); + return 0; +} +") + try_compile(HAVE_BLI_THREAD_SET_NUM_THREADS + ${CMAKE_CURRENT_BINARY_DIR} + "${CMAKE_CURRENT_BINARY_DIR}/bli_thread_set_num_threads.c" + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + LINK_LIBRARIES ${BLAS_REQUIRED_LIBRARIES} + OUTPUT_VARIABLE BLI_SET_NUM_THREADS_ERR) # Cmake is just brain damaged #CHECK_LIBRARY_EXISTS(${BLAS_REQUIRED_LIBRARIES} cblas_sgemm "" HAVE_CBLAS_SGEMM) if(HAVE_CBLAS_SGEMM) diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 0b87bc985..7ef701aed 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -2787,6 +2787,9 @@ rspamd_free_zstd_dictionary (struct zstd_dictionary *dict) #ifdef HAVE_OPENBLAS_SET_NUM_THREADS extern void openblas_set_num_threads(int num_threads); #endif +#ifdef HAVE_BLI_THREAD_SET_NUM_THREADS +extern void bli_thread_set_num_threads(int num_threads); +#endif gboolean rspamd_config_libs (struct rspamd_external_libs_ctx *ctx, @@ -2893,6 +2896,10 @@ rspamd_config_libs (struct rspamd_external_libs_ctx *ctx, #ifdef HAVE_OPENBLAS_SET_NUM_THREADS openblas_set_num_threads (cfg->max_blas_threads); #endif +#ifdef HAVE_BLI_THREAD_SET_NUM_THREADS + bli_thread_set_num_threads (cfg->max_blas_threads); +#endif + } return ret; diff --git a/src/libutil/util.c b/src/libutil/util.c index 1aed0f8b4..795382622 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1704,19 +1704,24 @@ void rspamd_gerror_free_maybe (gpointer p) } } - - -#ifdef HAVE_OPENBLAS_SET_NUM_THREADS -extern void openblas_set_num_threads(int num_threads); /* * Openblas creates threads that are not supported by * jemalloc allocator (aside of being bloody stupid). So this hack * is intended to set number of threads to one by default. * FIXME: is it legit to do so in ctor? */ -RSPAMD_CONSTRUCTOR (openblas_stupidity_fix_ctor) +#ifdef HAVE_OPENBLAS_SET_NUM_THREADS +extern void openblas_set_num_threads(int num_threads); +RSPAMD_CONSTRUCTOR (openblas_thread_fix_ctor) +{ + bli_thread_set_num_threads (1; +} +#endif +#ifdef HAVE_BLI_THREAD_SET_NUM_THREADS +extern void bli_thread_set_num_threads(int num_threads); +RSPAMD_CONSTRUCTOR (blis_thread_fix_ctor) { - openblas_set_num_threads (1); + bli_thread_set_num_threads (1; } #endif -- 2.39.5