Fixed #14 the SEGFAULT bug on 64 cores. On SMP server, the number of CPUs or cores should be less than or equal to 64.

This commit is contained in:
Xianyi Zhang 2011-03-28 10:58:39 +08:00
parent 5e7f29b19e
commit 85f99d4769
3 changed files with 40 additions and 8 deletions

View File

@ -5,6 +5,9 @@ Version 0.1 alpha2(in development)
common: common:
* Fixed blasint undefined bug in <cblas.h> file. Other software * Fixed blasint undefined bug in <cblas.h> file. Other software
could include this header successfully(Refs issue #13 on github) could include this header successfully(Refs issue #13 on github)
* Fixed the SEGFAULT bug on 64 cores. On SMP server, the number
of CPUs or cores should be less than or equal to 64.(Refs issue #14
on github)
x86/x86_64: x86/x86_64:
* *
MIPS64: MIPS64:

4
README
View File

@ -57,3 +57,7 @@ OpenBLAS users mailing list: http://list.rdcps.ac.cn/mailman/listinfo/openblas
8.ChangeLog 8.ChangeLog
Please see Changelog.txt to obtain the differences between GotoBLAS2 1.13 BSD version. Please see Changelog.txt to obtain the differences between GotoBLAS2 1.13 BSD version.
9.Known Issues
* The number of CPUs/Cores should less than or equal to 8*sizeof(unsigned long). On 64 bits, the limit
is 64. On 32 bits, it is 32.

View File

@ -172,12 +172,19 @@ static inline int rcount(unsigned long number) {
return count; return count;
} }
/***
Known issue: The number of CPUs/cores should less
than sizeof(unsigned long). On 64 bits, the limit
is 64. On 32 bits, it is 32.
***/
static inline unsigned long get_cpumap(int node) { static inline unsigned long get_cpumap(int node) {
int infile; int infile;
unsigned long affinity; unsigned long affinity;
char name[160]; char name[160];
char cpumap[160];
char *p, *dummy; char *p, *dummy;
int i=0;
sprintf(name, CPUMAP_NAME, node); sprintf(name, CPUMAP_NAME, node);
@ -187,13 +194,19 @@ static inline unsigned long get_cpumap(int node) {
if (infile != -1) { if (infile != -1) {
read(infile, name, sizeof(name)); read(infile, cpumap, sizeof(cpumap));
p = cpumap;
while (*p != '\n' && i<160){
if(*p != ',') {
name[i++]=*p;
}
p++;
}
p = name; p = name;
while ((*p == '0') || (*p == ',')) p++; // while ((*p == '0') || (*p == ',')) p++;
affinity = strtol(p, &dummy, 16); affinity = strtoul(p, &dummy, 16);
close(infile); close(infile);
} }
@ -347,6 +360,12 @@ static void disable_hyperthread(void) {
unsigned long share; unsigned long share;
int cpu; int cpu;
if(common->num_procs > 64){
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->num_procs);
exit(1);
}else if(common->num_procs == 64){
common -> avail = 0xFFFFFFFFFFFFFFFFUL;
}else
common -> avail = (1UL << common -> num_procs) - 1; common -> avail = (1UL << common -> num_procs) - 1;
#ifdef DEBUG #ifdef DEBUG
@ -376,6 +395,12 @@ static void disable_affinity(void) {
fprintf(stderr, "CPU mask : %04lx.\n\n", *(unsigned long *)&cpu_orig_mask[0]); fprintf(stderr, "CPU mask : %04lx.\n\n", *(unsigned long *)&cpu_orig_mask[0]);
#endif #endif
if(common->final_num_procs > 64){
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->final_num_procs);
exit(1);
}else if(common->final_num_procs == 64){
lprocmask = 0xFFFFFFFFFFFFFFFFUL;
}else
lprocmask = (1UL << common -> final_num_procs) - 1; lprocmask = (1UL << common -> final_num_procs) - 1;
#ifndef USE_OPENMP #ifndef USE_OPENMP