Honor cgroup/cpuset constraints when enumerating cpus
This commit is contained in:
parent
482015f8d6
commit
29fc429d9a
|
@ -354,6 +354,24 @@ static int numa_check(void) {
|
|||
return common -> num_nodes;
|
||||
}
|
||||
|
||||
#if defined(__GLIBC_PREREQ)
|
||||
#if !__GLIBC_PREREQ(2, 6)
|
||||
int sched_getcpu(void)
|
||||
{
|
||||
int cpu;
|
||||
FILE *fp = NULL;
|
||||
if ( (fp = fopen("/proc/self/stat", "r")) == NULL)
|
||||
return -1;
|
||||
if ( fscanf( fp, "%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%*s%d", &cpu) != 1) {
|
||||
fclose (fp);
|
||||
return -1;
|
||||
}
|
||||
fclose (fp);
|
||||
return(cpu);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void numa_mapping(void) {
|
||||
|
||||
int node, cpu, core;
|
||||
|
@ -808,16 +826,51 @@ void gotoblas_affinity_init(void) {
|
|||
common -> shmid = pshmid;
|
||||
|
||||
if (common -> magic != SH_MAGIC) {
|
||||
|
||||
cpu_set_t *cpusetp;
|
||||
int nums;
|
||||
int ret;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Shared Memory Initialization.\n");
|
||||
#endif
|
||||
|
||||
//returns the number of processors which are currently online
|
||||
common -> num_procs = sysconf(_SC_NPROCESSORS_CONF);;
|
||||
nums = sysconf(_SC_NPROCESSORS_CONF);
|
||||
|
||||
#if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 3)
|
||||
common->num_procs = nums;
|
||||
#elif __GLIBC_PREREQ(2, 7)
|
||||
cpusetp = CPU_ALLOC(nums);
|
||||
if (cpusetp == NULL) {
|
||||
common->num_procs = nums;
|
||||
} else {
|
||||
size_t size;
|
||||
size = CPU_ALLOC_SIZE(nums);
|
||||
ret = sched_getaffinity(0,size,cpusetp);
|
||||
if (ret!=0)
|
||||
common->num_procs = nums;
|
||||
else
|
||||
common->num_procs = CPU_COUNT_S(size,cpusetp);
|
||||
}
|
||||
CPU_FREE(cpusetp);
|
||||
#else
|
||||
ret = sched_getaffinity(0,sizeof(cpu_set_t), cpusetp);
|
||||
if (ret!=0) {
|
||||
common->num_procs = nums;
|
||||
} else {
|
||||
#if !__GLIBC_PREREQ(2, 6)
|
||||
int i;
|
||||
int n = 0;
|
||||
for (i=0;i<nums;i++)
|
||||
if (CPU_ISSET(i,cpusetp)) n++;
|
||||
common->num_procs = n;
|
||||
#else
|
||||
common->num_procs = CPU_COUNT(sizeof(cpu_set_t),cpusetp);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
if(common -> num_procs > MAX_CPUS) {
|
||||
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(%d). Terminated.\n", common->num_procs, MAX_CPUS);
|
||||
fprintf(stderr, "\nOpenBLAS Warning : The number of CPU/Cores(%d) is beyond the limit(%d). Terminated.\n", common->num_procs, MAX_CPUS);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -175,7 +175,44 @@ int get_num_procs(void);
|
|||
#else
|
||||
int get_num_procs(void) {
|
||||
static int nums = 0;
|
||||
cpu_set_t *cpusetp;
|
||||
size_t size;
|
||||
int ret;
|
||||
int i,n;
|
||||
|
||||
if (!nums) nums = sysconf(_SC_NPROCESSORS_CONF);
|
||||
#if !defined(OS_LINUX)
|
||||
return nums;
|
||||
#endif
|
||||
|
||||
#if !defined(__GLIBC_PREREQ)
|
||||
return nums;
|
||||
#endif
|
||||
#if !__GLIBC_PREREQ(2, 3)
|
||||
return nums;
|
||||
#endif
|
||||
|
||||
#if !__GLIBC_PREREQ(2, 7)
|
||||
ret = sched_getaffinity(0,sizeof(cpu_set_t), cpusetp);
|
||||
if (ret!=0) return nums;
|
||||
n=0;
|
||||
#if !__GLIBC_PREREQ(2, 6)
|
||||
for (i=0;i<nums;i++)
|
||||
if (CPU_ISSET(i,cpusetp)) n++;
|
||||
nums=n;
|
||||
#else
|
||||
nums = CPU_COUNT(sizeof(cpu_set_t),cpusetp);
|
||||
#endif
|
||||
return nums;
|
||||
#endif
|
||||
|
||||
cpusetp = CPU_ALLOC(nums);
|
||||
if (cpusetp == NULL) return nums;
|
||||
size = CPU_ALLOC_SIZE(nums);
|
||||
ret = sched_getaffinity(0,size,cpusetp);
|
||||
if (ret!=0) return nums;
|
||||
nums = CPU_COUNT_S(size,cpusetp);
|
||||
CPU_FREE(cpusetp);
|
||||
return nums;
|
||||
}
|
||||
#endif
|
||||
|
@ -1015,7 +1052,7 @@ void *blas_memory_alloc(int procpos){
|
|||
mypos = WhereAmI();
|
||||
|
||||
position = mypos;
|
||||
while (position >= NUM_BUFFERS) position >>= 1;
|
||||
while (position > NUM_BUFFERS) position >>= 1;
|
||||
|
||||
do {
|
||||
if (!memory[position].used && (memory[position].pos == mypos)) {
|
||||
|
@ -1164,8 +1201,8 @@ void blas_memory_free(void *free_area){
|
|||
position = 0;
|
||||
LOCK_COMMAND(&alloc_lock);
|
||||
|
||||
while ((position < NUM_BUFFERS) && (memory[position].addr != free_area))
|
||||
position++;
|
||||
while ((memory[position].addr != free_area)
|
||||
&& (position < NUM_BUFFERS)) position++;
|
||||
|
||||
if (memory[position].addr != free_area) goto error;
|
||||
|
||||
|
@ -1479,30 +1516,12 @@ static int on_process_term(void)
|
|||
#else
|
||||
#pragma comment(linker, "/INCLUDE:__tls_used")
|
||||
#endif
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma const_seg(".CRT$XLB")
|
||||
#else
|
||||
#pragma data_seg(push, old_seg)
|
||||
#pragma data_seg(".CRT$XLB")
|
||||
#endif
|
||||
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain;
|
||||
#ifdef _WIN64
|
||||
#pragma const_seg()
|
||||
#else
|
||||
#pragma data_seg()
|
||||
#endif
|
||||
|
||||
#ifdef _WIN64
|
||||
#pragma const_seg(".CRT$XTU")
|
||||
#else
|
||||
#pragma data_seg(".CRT$XTU")
|
||||
#endif
|
||||
static int(*p_process_term)(void) = on_process_term;
|
||||
#ifdef _WIN64
|
||||
#pragma const_seg()
|
||||
#else
|
||||
#pragma data_seg()
|
||||
#endif
|
||||
#pragma data_seg(pop, old_seg)
|
||||
#endif
|
||||
|
||||
#if (defined(C_PGI) || (!defined(C_SUN) && defined(F_INTERFACE_SUN))) && (defined(ARCH_X86) || defined(ARCH_X86_64))
|
||||
|
|
Loading…
Reference in New Issue