Honor cgroup/cpuset constraints when enumerating cpus

This commit is contained in:
Martin Kroeker 2017-07-11 18:27:33 +02:00 committed by GitHub
parent 482015f8d6
commit 29fc429d9a
2 changed files with 98 additions and 26 deletions

View File

@ -354,6 +354,24 @@ static int numa_check(void) {
return common -> num_nodes; 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) { static void numa_mapping(void) {
int node, cpu, core; int node, cpu, core;
@ -808,16 +826,51 @@ void gotoblas_affinity_init(void) {
common -> shmid = pshmid; common -> shmid = pshmid;
if (common -> magic != SH_MAGIC) { if (common -> magic != SH_MAGIC) {
cpu_set_t *cpusetp;
int nums;
int ret;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "Shared Memory Initialization.\n"); fprintf(stderr, "Shared Memory Initialization.\n");
#endif #endif
//returns the number of processors which are currently online //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) { 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); exit(1);
} }

View File

@ -175,7 +175,44 @@ int get_num_procs(void);
#else #else
int get_num_procs(void) { int get_num_procs(void) {
static int nums = 0; static int nums = 0;
cpu_set_t *cpusetp;
size_t size;
int ret;
int i,n;
if (!nums) nums = sysconf(_SC_NPROCESSORS_CONF); 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; return nums;
} }
#endif #endif
@ -1015,7 +1052,7 @@ void *blas_memory_alloc(int procpos){
mypos = WhereAmI(); mypos = WhereAmI();
position = mypos; position = mypos;
while (position >= NUM_BUFFERS) position >>= 1; while (position > NUM_BUFFERS) position >>= 1;
do { do {
if (!memory[position].used && (memory[position].pos == mypos)) { if (!memory[position].used && (memory[position].pos == mypos)) {
@ -1164,8 +1201,8 @@ void blas_memory_free(void *free_area){
position = 0; position = 0;
LOCK_COMMAND(&alloc_lock); LOCK_COMMAND(&alloc_lock);
while ((position < NUM_BUFFERS) && (memory[position].addr != free_area)) while ((memory[position].addr != free_area)
position++; && (position < NUM_BUFFERS)) position++;
if (memory[position].addr != free_area) goto error; if (memory[position].addr != free_area) goto error;
@ -1479,30 +1516,12 @@ static int on_process_term(void)
#else #else
#pragma comment(linker, "/INCLUDE:__tls_used") #pragma comment(linker, "/INCLUDE:__tls_used")
#endif #endif
#pragma data_seg(push, old_seg)
#ifdef _WIN64
#pragma const_seg(".CRT$XLB")
#else
#pragma data_seg(".CRT$XLB") #pragma data_seg(".CRT$XLB")
#endif
static void (APIENTRY *dll_callback)(HINSTANCE h, DWORD ul_reason_for_call, PVOID pv) = DllMain; 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") #pragma data_seg(".CRT$XTU")
#endif
static int(*p_process_term)(void) = on_process_term; static int(*p_process_term)(void) = on_process_term;
#ifdef _WIN64 #pragma data_seg(pop, old_seg)
#pragma const_seg()
#else
#pragma data_seg()
#endif
#endif #endif
#if (defined(C_PGI) || (!defined(C_SUN) && defined(F_INTERFACE_SUN))) && (defined(ARCH_X86) || defined(ARCH_X86_64)) #if (defined(C_PGI) || (!defined(C_SUN) && defined(F_INTERFACE_SUN))) && (defined(ARCH_X86) || defined(ARCH_X86_64))