#if defined(OS_FREEBSD) || defined(OS_DARWIN)
#include <sys/sysctl.h>
+#include <sys/resource.h>
#endif
#if defined(OS_WINDOWS) && (defined(__MINGW32__) || defined(__MINGW64__))
}
return nums;
}
+
+void set_stack_limit(int limitMB){
+ int result=0;
+ struct rlimit rl;
+ rlim_t StackSize;
+
+ StackSize=limitMB*1024*1024;
+ result=getrlimit(RLIMIT_STACK, &rl);
+ if(result==0){
+ if(rl.rlim_cur < StackSize){
+ rl.rlim_cur=StackSize;
+ result=setrlimit(RLIMIT_STACK, &rl);
+ if(result !=0){
+ fprintf(stderr, "OpenBLAS: set stack limit error =%d\n", result);
+ }
+ }
+ }
+}
#endif
/*
if (gotoblas_initialized) return;
+
#ifdef PROFILE
moncontrol (0);
#endif
#ifdef DYNAMIC_ARCH
+#if defined(SMP) && defined(OS_DARWIN) && MAX_CPU_NUMBER > 128
+ //Set stack limit to 16MB on Mac OS X
+ //when NUM_THREADS>128 and DYNAMIC_ARCH=1.
+ //Prevent the SEGFAULT bug.
+ set_stack_limit(16);
+#endif
gotoblas_dynamic_init();
#endif