Browse Source

Fixed a hang bug when shutdown blas threads server on Windows. Added the feature about dynamic changing the number of threads on Windows.

tags/v0.2.3^2
Xianyi Zhang Zhang Xianyi 13 years ago
parent
commit
801383effe
2 changed files with 48 additions and 10 deletions
  1. +39
    -9
      driver/others/blas_server_win32.c
  2. +9
    -1
      driver/others/memory.c

+ 39
- 9
driver/others/blas_server_win32.c View File

@@ -63,13 +63,7 @@ static blas_pool_t pool;
static HANDLE blas_threads [MAX_CPU_NUMBER];
static DWORD blas_threads_id[MAX_CPU_NUMBER];

void goto_set_num_threads(int num)
{
}

void openblas_set_num_threads(int num)
{
}

static void legacy_exec(void *func, int mode, blas_arg_t *args, void *sb){

@@ -187,7 +181,7 @@ static DWORD WINAPI blas_thread_server(void *arg){
do {
action = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
} while ((action != WAIT_OBJECT_0) && (action == WAIT_OBJECT_0 + 1));
} while ((action != WAIT_OBJECT_0) && (action != WAIT_OBJECT_0 + 1));
if (action == WAIT_OBJECT_0 + 1) break;

@@ -271,7 +265,9 @@ static DWORD WINAPI blas_thread_server(void *arg){
} else {
legacy_exec(routine, queue -> mode, queue -> args, sb);
}
}
}else{
continue; //if queue == NULL
}
#ifdef SMP_DEBUG
fprintf(STDERR, "Server[%2ld] Finished!\n", cpu);
@@ -445,7 +441,7 @@ int BLASFUNC(blas_thread_shutdown)(void){

SetEvent(pool.killed);
for(i = 0; i < blas_cpu_number - 1; i++){
for(i = 0; i < blas_num_threads - 1; i++){
WaitForSingleObject(blas_threads[i], INFINITE);
}
@@ -456,3 +452,37 @@ int BLASFUNC(blas_thread_shutdown)(void){
return 0;
}

void goto_set_num_threads(int num_threads)
{
long i;

if (num_threads < 1) num_threads = blas_cpu_number;

if (num_threads > MAX_CPU_NUMBER) num_threads = MAX_CPU_NUMBER;

if (num_threads > blas_num_threads) {

LOCK_COMMAND(&server_lock);
//increased_threads = 1;

for(i = blas_num_threads - 1; i < num_threads - 1; i++){
blas_threads[i] = CreateThread(NULL, 0,
blas_thread_server, (void *)i,
0, &blas_threads_id[i]);
}
blas_num_threads = num_threads;

UNLOCK_COMMAND(&server_lock);
}

blas_cpu_number = num_threads;
}

void openblas_set_num_threads(int num)
{
goto_set_num_threads(num);
}

+ 9
- 1
driver/others/memory.c View File

@@ -1,5 +1,5 @@
/*****************************************************************************
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
All rights reserved.

Redistribution and use in source and binary forms, with or without
@@ -206,7 +206,15 @@ int get_num_procs(void) {

#endif

/*
OpenBLAS uses the numbers of CPU cores in multithreading.
It can be set by openblas_set_num_threads(int num_threads);
*/
int blas_cpu_number = 0;
/*
The numbers of threads in the thread pool.
This value is equal or large than blas_cpu_number. This means some threads are sleep.
*/
int blas_num_threads = 0;

int goto_get_num_procs (void) {


Loading…
Cancel
Save