Dynamic locking in Pthread Backend to allow multiple BLAS calls to be executed parallelly
This commit is contained in:
parent
f955616f98
commit
9e22d70957
|
@ -570,6 +570,8 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
|
||||||
InitializeCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
InitializeCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
||||||
#else
|
#else
|
||||||
static pthread_mutex_t level3_lock = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t level3_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static pthread_cond_t level3_wakeup = PTHREAD_COND_INITIALIZER;
|
||||||
|
volatile static BLASLONG CPU_AVAILABLE = MAX_CPU_NUMBER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
blas_arg_t newarg;
|
blas_arg_t newarg;
|
||||||
|
@ -639,6 +641,12 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
|
||||||
EnterCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
EnterCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
||||||
#else
|
#else
|
||||||
pthread_mutex_lock(&level3_lock);
|
pthread_mutex_lock(&level3_lock);
|
||||||
|
while(CPU_AVAILABLE < nthreads) {
|
||||||
|
pthread_cond_wait(&level3_wakeup, &level3_lock);
|
||||||
|
}
|
||||||
|
CPU_AVAILABLE -= nthreads;
|
||||||
|
WMB;
|
||||||
|
pthread_mutex_unlock(&level3_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_ALLOC_HEAP
|
#ifdef USE_ALLOC_HEAP
|
||||||
|
@ -783,6 +791,10 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG
|
||||||
#elif defined(OS_WINDOWS)
|
#elif defined(OS_WINDOWS)
|
||||||
LeaveCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
LeaveCriticalSection((PCRITICAL_SECTION)&level3_lock);
|
||||||
#else
|
#else
|
||||||
|
pthread_mutex_lock(&level3_lock);
|
||||||
|
CPU_AVAILABLE += nthreads;
|
||||||
|
WMB;
|
||||||
|
pthread_cond_signal(&level3_wakeup);
|
||||||
pthread_mutex_unlock(&level3_lock);
|
pthread_mutex_unlock(&level3_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue