Merge pull request #1175 from martin-frbg/lapack_143
[platform/upstream/openblas.git] / common_thread.h
index d74af32..bd96444 100644 (file)
 #ifndef COMMON_THREAD
 #define COMMON_THREAD
 
+#ifdef USE_OPENMP
+#include <omp.h>
+extern void goto_set_num_threads(int nthreads);
+#endif
+
 /* Basic Thread Debugging */
 #undef SMP_DEBUG
 
@@ -98,7 +103,7 @@ typedef struct blas_queue {
 
   struct blas_queue *next;
 
-#if defined( __WIN32__) || defined(__CYGWIN32__)
+#if defined( __WIN32__) || defined(__CYGWIN32__) || defined(_WIN32) || defined(__CYGWIN__)
   CRITICAL_SECTION lock;
   HANDLE finish;
 #else
@@ -126,13 +131,24 @@ extern int blas_server_avail;
 
 static __inline int num_cpu_avail(int level) {
 
-  if ((blas_cpu_number == 1) 
+#ifdef USE_OPENMP
+       int openmp_nthreads=0;
+#endif
+
+  if (blas_cpu_number == 1
 
 #ifdef USE_OPENMP
       || omp_in_parallel()
 #endif
       ) return 1;
 
+#ifdef USE_OPENMP
+  openmp_nthreads=omp_get_max_threads();
+  if (blas_cpu_number != openmp_nthreads) {
+         goto_set_num_threads(openmp_nthreads);
+  }
+#endif
+
   return blas_cpu_number;
 
 }
@@ -160,7 +176,7 @@ int exec_blas(BLASLONG num_cpu, blas_param_t *param, void *buffer);
 
 int blas_level1_thread(int mode, BLASLONG m, BLASLONG n, BLASLONG k, void *alpha,
                       void *a, BLASLONG lda,
-                      void *b, BLASLONG ldb, 
+                      void *b, BLASLONG ldb,
                       void *c, BLASLONG ldc, int (*function)(), int threads);
 
 int gemm_thread_m (int mode, blas_arg_t *, BLASLONG *, BLASLONG *, int (*function)(), void *, void *, BLASLONG);
@@ -171,14 +187,14 @@ int gemm_thread_mn(int mode, blas_arg_t *, BLASLONG *, BLASLONG *, int (*functio
 
 int gemm_thread_variable(int mode, blas_arg_t *, BLASLONG *, BLASLONG *, int (*function)(), void *, void *, BLASLONG, BLASLONG);
 
-int trsm_thread(int mode, BLASLONG m, BLASLONG n, 
+int trsm_thread(int mode, BLASLONG m, BLASLONG n,
                double alpha_r, double alpha_i,
                void *a, BLASLONG lda,
                void *c, BLASLONG ldc, int (*function)(), void *buffer);
 
 int syrk_thread(int mode, blas_arg_t *, BLASLONG *, BLASLONG *, int (*function)(), void *, void *, BLASLONG);
 
-int beta_thread(int mode, BLASLONG m, BLASLONG n, 
+int beta_thread(int mode, BLASLONG m, BLASLONG n,
                double alpha_r, double alpha_i,
                void *c, BLASLONG ldc, int (*fuction)());