#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
struct blas_queue *next;
-#if defined( __WIN32__) || defined(__CYGWIN32__)
+#if defined( __WIN32__) || defined(__CYGWIN32__) || defined(_WIN32) || defined(__CYGWIN__)
CRITICAL_SECTION lock;
HANDLE finish;
#else
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;
}
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);
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)());