@@ -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 | |||
@@ -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 <stddef.h> | |||
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) |
@@ -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; |
@@ -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 | |||