void CONSTRUCTOR gotoblas_init(void) { if (gotoblas_initialized) return; #ifdef SMP openblas_fork_handler(); #endif #ifdef PROFILE moncontrol (0); #endif #ifdef DYNAMIC_ARCH gotoblas_dynamic_init(); #endif #if defined(SMP) && defined(OS_LINUX) && !defined(NO_AFFINITY) gotoblas_affinity_init(); #endif #if defined(OS_LINUX) && !defined(NO_WARMUP) gotoblas_memory_init(); #endif #if defined(OS_LINUX) struct rlimit curlimit; if ( getrlimit(RLIMIT_STACK, &curlimit ) == 0 ) { if ( curlimit.rlim_cur != curlimit.rlim_max ) { curlimit.rlim_cur = curlimit.rlim_max; setrlimit(RLIMIT_STACK, &curlimit); } } #endif #ifdef SMP if (blas_cpu_number == 0) blas_get_cpu_number(); #ifdef SMP_SERVER if (blas_server_avail == 0) blas_thread_init(); #endif #endif #ifdef FUNCTION_PROFILE gotoblas_profile_init(); #endif gotoblas_initialized = 1; #ifdef PROFILE moncontrol (1); #endif }
void CONSTRUCTOR gotoblas_init(void) { if (gotoblas_initialized) return; #ifdef PROFILE moncontrol (0); #endif #ifdef DYNAMIC_ARCH gotoblas_dynamic_init(); #endif #if defined(SMP) && defined(OS_LINUX) && !defined(NO_AFFINITY) gotoblas_affinity_init(); #endif #if defined(OS_LINUX) && !defined(NO_WARMUP) gotoblas_memory_init(); #endif #ifdef SMP if (blas_cpu_number == 0) blas_get_cpu_number(); #ifdef SMP_SERVER if (blas_server_avail == 0) blas_thread_init(); #endif #endif #ifdef FUNCTION_PROFILE gotoblas_profile_init(); #endif gotoblas_initialized = 1; #ifdef PROFILE moncontrol (1); #endif }
void *blas_memory_alloc(int procpos){ int position; #if defined(WHEREAMI) && !defined(USE_OPENMP) int mypos; #endif void *map_address; void *(*memoryalloc[])(void *address) = { #ifdef ALLOC_DEVICEDRIVER alloc_devicedirver, #endif #if defined OS_LINUX || defined OS_AIX || defined __sun__ || defined OS_WINDOWS alloc_hugetlb, #endif #ifdef ALLOC_SHM alloc_shm, #endif #ifdef ALLOC_MMAP alloc_mmap, #endif #ifdef ALLOC_QALLOC alloc_qalloc, #endif #ifdef ALLOC_WINDOWS alloc_windows, #endif #ifdef ALLOC_MALLOC alloc_malloc, #endif NULL, }; void *(**func)(void *address); if (!memory_initialized) { LOCK_COMMAND(&alloc_lock); if (!memory_initialized) { #if defined(WHEREAMI) && !defined(USE_OPENMP) for (position = 0; position < NUM_BUFFERS; position ++){ memory[position].addr = (void *)0; memory[position].pos = -1; memory[position].used = 0; memory[position].lock = 0; } #endif #ifdef DYNAMIC_ARCH gotoblas_dynamic_init(); #endif #if defined(SMP) && defined(OS_LINUX) && !defined(NO_AFFINITY) gotoblas_affinity_init(); #endif #ifdef SMP if (!blas_num_threads) blas_cpu_number = blas_get_cpu_number(); #endif #if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64) || defined(ARCH_MIPS64) #ifndef DYNAMIC_ARCH blas_set_parameter(); #endif #endif memory_initialized = 1; } UNLOCK_COMMAND(&alloc_lock); } #ifdef DEBUG printf("Alloc Start ...\n"); #endif #if defined(WHEREAMI) && !defined(USE_OPENMP) mypos = WhereAmI(); position = mypos; while (position > NUM_BUFFERS) position >>= 1; do { if (!memory[position].used && (memory[position].pos == mypos)) { blas_lock(&memory[position].lock); if (!memory[position].used) goto allocation; blas_unlock(&memory[position].lock); } position ++; } while (position < NUM_BUFFERS); #endif position = 0; do { if (!memory[position].used) { blas_lock(&memory[position].lock); if (!memory[position].used) goto allocation; blas_unlock(&memory[position].lock); } position ++; } while (position < NUM_BUFFERS); goto error; allocation : #ifdef DEBUG printf(" Position -> %d\n", position); #endif memory[position].used = 1; blas_unlock(&memory[position].lock); if (!memory[position].addr) { do { #ifdef DEBUG printf("Allocation Start : %lx\n", base_address); #endif map_address = (void *)-1; func = &memoryalloc[0]; while ((func != NULL) && (map_address == (void *) -1)) { map_address = (*func)((void *)base_address); #ifdef ALLOC_DEVICEDRIVER if ((*func == alloc_devicedirver) && (map_address == (void *)-1)) { fprintf(stderr, "OpenBLAS Warning ... Physically contigous allocation was failed.\n"); } #endif #ifdef ALLOC_HUGETLBFILE if ((*func == alloc_hugetlbfile) && (map_address == (void *)-1)) { #ifndef OS_WINDOWS fprintf(stderr, "OpenBLAS Warning ... HugeTLB(File) allocation was failed.\n"); #endif } #endif #if defined OS_LINUX || defined OS_AIX || defined __sun__ || defined OS_WINDOWS if ((*func == alloc_hugetlb) && (map_address != (void *)-1)) hugetlb_allocated = 1; #endif func ++; } #ifdef DEBUG printf(" Success -> %08lx\n", map_address); #endif if (((BLASLONG) map_address) == -1) base_address = 0UL; if (base_address) base_address += BUFFER_SIZE + FIXED_PAGESIZE; } while ((BLASLONG)map_address == -1); memory[position].addr = map_address; #ifdef DEBUG printf(" Mapping Succeeded. %p(%d)\n", (void *)memory[position].addr, position); #endif } #if defined(WHEREAMI) && !defined(USE_OPENMP) if (memory[position].pos == -1) memory[position].pos = mypos; #endif #ifdef DYNAMIC_ARCH if (memory_initialized == 1) { LOCK_COMMAND(&alloc_lock); if (memory_initialized == 1) { if (!gotoblas) gotoblas_dynamic_init(); memory_initialized = 2; } UNLOCK_COMMAND(&alloc_lock); } #endif #ifdef DEBUG printf("Mapped : %p %3d\n\n", (void *)memory[position].addr, position); #endif return (void *)memory[position].addr; error: printf("BLAS : Program is Terminated. Because you tried to allocate too many memory regions.\n"); return NULL; }