diff --git a/driver/others/CMakeLists.txt b/driver/others/CMakeLists.txt index b2af55e36..b361f2a97 100644 --- a/driver/others/CMakeLists.txt +++ b/driver/others/CMakeLists.txt @@ -33,6 +33,7 @@ set(COMMON_SOURCES xerbla.c openblas_set_num_threads.c openblas_error_handle.c + openblas_env.c openblas_get_num_procs.c openblas_get_num_threads.c ) diff --git a/driver/others/Makefile b/driver/others/Makefile index ed145cee8..c41b24e1f 100644 --- a/driver/others/Makefile +++ b/driver/others/Makefile @@ -1,7 +1,7 @@ TOPDIR = ../.. include ../../Makefile.system -COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) +COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX) #COMMONOBJS += slamch.$(SUFFIX) slamc3.$(SUFFIX) dlamch.$(SUFFIX) dlamc3.$(SUFFIX) diff --git a/driver/others/blas_server.c b/driver/others/blas_server.c index c3bf80173..42cadf4b5 100644 --- a/driver/others/blas_server.c +++ b/driver/others/blas_server.c @@ -92,6 +92,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #endif +extern unsigned int openblas_thread_timeout(); + #ifdef SMP_SERVER #undef MONITOR @@ -524,6 +526,7 @@ static int blas_monitor(void *arg){ int blas_thread_init(void){ BLASLONG i; int ret; + int thread_timeout_env; #ifdef NEED_STACKATTR pthread_attr_t attr; #endif @@ -540,22 +543,12 @@ int blas_thread_init(void){ if (!blas_server_avail){ - env_var_t p; - - if (readenv(p,"THREAD_TIMEOUT")) { - thread_timeout = atoi(p); - if (thread_timeout < 4) thread_timeout = 4; - if (thread_timeout > 30) thread_timeout = 30; - thread_timeout = (1 << thread_timeout); - }else{ - if (readenv(p,"GOTO_THREAD_TIMEOUT")) { - thread_timeout = atoi(p); - if (thread_timeout < 4) thread_timeout = 4; - if (thread_timeout > 30) thread_timeout = 30; - thread_timeout = (1 << thread_timeout); - } - } - + thread_timeout_env=openblas_thread_timeout(); + if (thread_timeout_env>0) { + if (thread_timeout_env < 4) thread_timeout_env = 4; + if (thread_timeout_env > 30) thread_timeout_env = 30; + thread_timeout = (1 << thread_timeout_env); + } for(i = 0; i < blas_num_threads - 1; i++){ diff --git a/driver/others/memory.c b/driver/others/memory.c index e0761d784..e64781740 100644 --- a/driver/others/memory.c +++ b/driver/others/memory.c @@ -294,8 +294,11 @@ void openblas_fork_handler() #endif } +extern int openblas_num_threads_env(); +extern int openblas_goto_num_threads_env(); +extern int openblas_omp_num_threads_env(); + int blas_get_cpu_number(void){ - env_var_t p; #if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID) int max_num; #endif @@ -310,18 +313,18 @@ int blas_get_cpu_number(void){ blas_goto_num = 0; #ifndef USE_OPENMP - if (readenv(p,"OPENBLAS_NUM_THREADS")) blas_goto_num = atoi(p); + blas_goto_num=openblas_num_threads_env(); if (blas_goto_num < 0) blas_goto_num = 0; if (blas_goto_num == 0) { - if (readenv(p,"GOTO_NUM_THREADS")) blas_goto_num = atoi(p); - if (blas_goto_num < 0) blas_goto_num = 0; + blas_goto_num=openblas_goto_num_threads_env(); + if (blas_goto_num < 0) blas_goto_num = 0; } #endif blas_omp_num = 0; - if (readenv(p,"OMP_NUM_THREADS")) blas_omp_num = atoi(p); + blas_omp_num=openblas_omp_num_threads_env(); if (blas_omp_num < 0) blas_omp_num = 0; if (blas_goto_num > 0) blas_num_threads = blas_goto_num; @@ -1340,6 +1343,7 @@ static void gotoblas_memory_init(void) { /* Initialization for all function; this function should be called before main */ static int gotoblas_initialized = 0; +extern void openblas_read_env(); void CONSTRUCTOR gotoblas_init(void) { @@ -1349,6 +1353,8 @@ void CONSTRUCTOR gotoblas_init(void) { openblas_fork_handler(); #endif + openblas_read_env(); + #ifdef PROFILE moncontrol (0); #endif diff --git a/driver/others/openblas_env.c b/driver/others/openblas_env.c new file mode 100644 index 000000000..64ece9515 --- /dev/null +++ b/driver/others/openblas_env.c @@ -0,0 +1,84 @@ +/*************************************************************************** +Copyright (c) 2011-2016, The OpenBLAS Project +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of the OpenBLAS project 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 OPENBLAS PROJECT 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. + +*****************************************************************************/ + +#include "common.h" + +static int openblas_env_verbose=0; +static unsigned int openblas_env_thread_timeout=0; +static int openblas_env_block_factor=0; +static int openblas_env_openblas_num_threads=0; +static int openblas_env_goto_num_threads=0; +static int openblas_env_omp_num_threads=0; + +int openblas_verbose() { return openblas_env_verbose;} +unsigned int openblas_thread_timeout() { return openblas_env_thread_timeout;} +int openblas_block_factor() { return openblas_env_block_factor;} +int openblas_num_threads_env() { return openblas_env_openblas_num_threads;} +int openblas_goto_num_threads_env() { return openblas_env_goto_num_threads;} +int openblas_omp_num_threads_env() { return openblas_env_omp_num_threads;} + +void openblas_read_env() { + int ret=0; + env_var_t p; + if (readenv(p,"OPENBLAS_VERBOSE")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_verbose=ret; + + ret=0; + if (readenv(p,"OPENBLAS_BLOCK_FACTOR")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_block_factor=ret; + + ret=0; + if (readenv(p,"OPENBLAS_THREAD_TIMEOUT")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_thread_timeout=(unsigned int)ret; + + ret=0; + if (readenv(p,"OPENBLAS_NUM_THREADS")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_openblas_num_threads=ret; + + ret=0; + if (readenv(p,"GOTO_NUM_THREADS")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_goto_num_threads=ret; + + ret=0; + if (readenv(p,"OMP_NUM_THREADS")) ret = atoi(p); + if(ret<0) ret=0; + openblas_env_omp_num_threads=ret; + +} + + diff --git a/driver/others/openblas_error_handle.c b/driver/others/openblas_error_handle.c index f32a54452..9ac72c15d 100644 --- a/driver/others/openblas_error_handle.c +++ b/driver/others/openblas_error_handle.c @@ -33,13 +33,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "common.h" -int openblas_verbose() { - int ret=0; - env_var_t p; - if (readenv(p,"OPENBLAS_VERBOSE")) ret = atoi(p); - if(ret<0) ret=0; - return ret; -} +extern int openblas_verbose(); void openblas_warning(int verbose, const char * msg) { int current_verbose; diff --git a/driver/others/parameter.c b/driver/others/parameter.c index d741f2fb9..f4b1a80ad 100644 --- a/driver/others/parameter.c +++ b/driver/others/parameter.c @@ -40,6 +40,7 @@ #include #include "common.h" +extern int openblas_block_factor(); int get_L2_size(void); #define DEFAULT_GEMM_P 128 @@ -249,7 +250,6 @@ int get_L2_size(void){ void blas_set_parameter(void){ - env_var_t p; int factor; #if defined(BULLDOZER) || defined(PILEDRIVER) || defined(SANDYBRIDGE) || defined(NEHALEM) || defined(HASWELL) || defined(STEAMROLLER) int size = 16; @@ -468,9 +468,8 @@ void blas_set_parameter(void){ #endif #endif - - if (readenv(p,"GOTO_BLOCK_FACTOR")) { - factor = atoi(p); + factor=openblas_block_factor(); + if (factor>0) { if (factor < 10) factor = 10; if (factor > 200) factor = 200;