| @@ -2871,32 +2871,28 @@ void *blas_memory_alloc(int procpos){ | |||||
| position ++; | position ++; | ||||
| } while (position < NUM_BUFFERS); | } while (position < NUM_BUFFERS); | ||||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||||
| UNLOCK_COMMAND(&alloc_lock); | |||||
| #endif | |||||
| if (memory_overflowed) { | if (memory_overflowed) { | ||||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||||
| LOCK_COMMAND(&alloc_lock); | |||||
| #endif | |||||
| do { | |||||
| RMB; | |||||
| do { | |||||
| RMB; | |||||
| #if defined(USE_OPENMP) | #if defined(USE_OPENMP) | ||||
| if (!newmemory[position-NUM_BUFFERS].used) { | |||||
| blas_lock(&newmemory[position-NUM_BUFFERS].lock); | |||||
| if (!newmemory[position-NUM_BUFFERS].used) { | |||||
| blas_lock(&newmemory[position-NUM_BUFFERS].lock); | |||||
| #endif | #endif | ||||
| if (!newmemory[position-NUM_BUFFERS].used) goto allocation2; | |||||
| if (!newmemory[position-NUM_BUFFERS].used) goto allocation2; | |||||
| #if defined(USE_OPENMP) | #if defined(USE_OPENMP) | ||||
| blas_unlock(&newmemory[position-NUM_BUFFERS].lock); | |||||
| } | |||||
| blas_unlock(&newmemory[position-NUM_BUFFERS].lock); | |||||
| } | |||||
| #endif | #endif | ||||
| position ++; | |||||
| position ++; | |||||
| } while (position < 512+NUM_BUFFERS); | |||||
| } while (position < 512+NUM_BUFFERS); | |||||
| } | |||||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | ||||
| UNLOCK_COMMAND(&alloc_lock); | UNLOCK_COMMAND(&alloc_lock); | ||||
| #endif | #endif | ||||
| } | |||||
| goto error; | goto error; | ||||
| allocation : | allocation : | ||||
| @@ -3001,6 +2997,9 @@ void *blas_memory_alloc(int procpos){ | |||||
| return (void *)memory[position].addr; | return (void *)memory[position].addr; | ||||
| error: | error: | ||||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||||
| LOCK_COMMAND(&alloc_lock); | |||||
| #endif | |||||
| if (memory_overflowed) goto terminate; | if (memory_overflowed) goto terminate; | ||||
| fprintf(stderr,"OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata.\n"); | fprintf(stderr,"OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata.\n"); | ||||
| memory_overflowed=1; | memory_overflowed=1; | ||||
| @@ -3014,7 +3013,6 @@ void *blas_memory_alloc(int procpos){ | |||||
| newmemory[i].used = 0; | newmemory[i].used = 0; | ||||
| newmemory[i].lock = 0; | newmemory[i].lock = 0; | ||||
| } | } | ||||
| newmemory[position-NUM_BUFFERS].used = 1; | |||||
| allocation2: | allocation2: | ||||
| newmemory[position-NUM_BUFFERS].used = 1; | newmemory[position-NUM_BUFFERS].used = 1; | ||||
| @@ -3086,6 +3084,9 @@ allocation2: | |||||
| return (void *)newmemory[position-NUM_BUFFERS].addr; | return (void *)newmemory[position-NUM_BUFFERS].addr; | ||||
| terminate: | terminate: | ||||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||||
| UNLOCK_COMMAND(&alloc_lock); | |||||
| #endif | |||||
| printf("OpenBLAS : Program is Terminated. Because you tried to allocate too many memory regions.\n"); | printf("OpenBLAS : Program is Terminated. Because you tried to allocate too many memory regions.\n"); | ||||
| printf("This library was built to support a maximum of %d threads - either rebuild OpenBLAS\n", NUM_BUFFERS); | printf("This library was built to support a maximum of %d threads - either rebuild OpenBLAS\n", NUM_BUFFERS); | ||||
| printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n"); | printf("with a larger NUM_THREADS value or set the environment variable OPENBLAS_NUM_THREADS to\n"); | ||||