| @@ -2871,32 +2871,28 @@ void *blas_memory_alloc(int procpos){ | |||
| position ++; | |||
| } while (position < NUM_BUFFERS); | |||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||
| UNLOCK_COMMAND(&alloc_lock); | |||
| #endif | |||
| 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 (!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 | |||
| if (!newmemory[position-NUM_BUFFERS].used) goto allocation2; | |||
| if (!newmemory[position-NUM_BUFFERS].used) goto allocation2; | |||
| #if defined(USE_OPENMP) | |||
| blas_unlock(&newmemory[position-NUM_BUFFERS].lock); | |||
| } | |||
| blas_unlock(&newmemory[position-NUM_BUFFERS].lock); | |||
| } | |||
| #endif | |||
| position ++; | |||
| position ++; | |||
| } while (position < 512+NUM_BUFFERS); | |||
| } while (position < 512+NUM_BUFFERS); | |||
| } | |||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||
| UNLOCK_COMMAND(&alloc_lock); | |||
| #endif | |||
| } | |||
| goto error; | |||
| allocation : | |||
| @@ -3001,6 +2997,9 @@ void *blas_memory_alloc(int procpos){ | |||
| return (void *)memory[position].addr; | |||
| error: | |||
| #if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||
| LOCK_COMMAND(&alloc_lock); | |||
| #endif | |||
| if (memory_overflowed) goto terminate; | |||
| fprintf(stderr,"OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata.\n"); | |||
| memory_overflowed=1; | |||
| @@ -3014,7 +3013,6 @@ void *blas_memory_alloc(int procpos){ | |||
| newmemory[i].used = 0; | |||
| newmemory[i].lock = 0; | |||
| } | |||
| newmemory[position-NUM_BUFFERS].used = 1; | |||
| allocation2: | |||
| newmemory[position-NUM_BUFFERS].used = 1; | |||
| @@ -3086,6 +3084,9 @@ allocation2: | |||
| return (void *)newmemory[position-NUM_BUFFERS].addr; | |||
| 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("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"); | |||