diff --git a/interface/symm.c b/interface/symm.c index 0e29a5f48..3e65e69b1 100644 --- a/interface/symm.c +++ b/interface/symm.c @@ -44,6 +44,7 @@ #endif #ifndef COMPLEX +#define SMP_THRESHOLD_MIN 65536. #ifdef XDOUBLE #define ERROR_NAME "QSYMM " #elif defined(DOUBLE) @@ -52,6 +53,7 @@ #define ERROR_NAME "SSYMM " #endif #else +#define SMP_THRESHOLD_MIN 8192. #ifndef GEMM3M #ifndef HEMM #ifdef XDOUBLE @@ -91,6 +93,10 @@ #endif #endif +#ifndef GEMM_MULTITHREAD_THRESHOLD +#define GEMM_MULTITHREAD_THRESHOLD 4 +#endif + #ifdef SMP #ifndef COMPLEX @@ -159,7 +165,9 @@ void NAME(char *SIDE, char *UPLO, #if defined(SMP) && !defined(NO_AFFINITY) int nodes; #endif - +# if defined(SMP) + int MN; +#endif blasint info; int side; int uplo; @@ -255,6 +263,9 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_SIDE Side, enum CBLAS_UPLO Uplo, #if defined(SMP) && !defined(NO_AFFINITY) int nodes; #endif +#if defined(SMP) + int MN; +#endif PRINT_DEBUG_CNAME; @@ -375,15 +386,18 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_SIDE Side, enum CBLAS_UPLO Uplo, #ifdef SMP args.common = NULL; - args.nthreads = num_cpu_avail(3); - + MN = 2.* (double) args.m * (double)args.m * (double) args.n; + if (MN <= (SMP_THRESHOLD_MIN * (double) GEMM_MULTITHREAD_THRESHOLD) ) { + args.nthreads = 1; + } else { + args.nthreads = num_cpu_avail(3); + } if (args.nthreads == 1) { #endif (symm[(side << 1) | uplo ])(&args, NULL, NULL, sa, sb, 0); #ifdef SMP - } else { #ifndef NO_AFFINITY