| @@ -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 | |||
| ) | |||
| @@ -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) | |||
| @@ -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++){ | |||
| @@ -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 | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| @@ -40,6 +40,7 @@ | |||
| #include <string.h> | |||
| #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; | |||