18 #if defined(linux) || defined(__linux) || defined(__linux__)
19 #define QUARK_OS_LINUX 1
23 #elif defined( _WIN32 ) || defined( _WIN64 )
24 #define QUARK_OS_WINDOWS 1
26 #elif (defined __APPLE__) || (defined macintosh) || (defined __MACOSX__)
27 #define QUARK_OS_MACOS 1
28 #include <sys/param.h>
29 #include <sys/sysctl.h>
30 #include <mach/mach_init.h>
31 #include <mach/thread_policy.h>
32 kern_return_t thread_policy_set(thread_act_t thread, thread_policy_flavor_t flavor,
33 thread_policy_t policy_info, mach_msg_type_number_t count);
35 #define QUARK_OS_AIX 1
37 #error "Cannot find the runing system or system not supported. Please define try to QUARK_OS_[LINUX|MACOS|AIX|WINDOWS]"
40 #if defined(QUARK_HWLOC) && (defined QUARK_AFFINITY_DISABLE)
48 #if defined( _WIN32 ) || defined( _WIN64 )
56 #define QUARK_SUCCESS 0
58 #define QUARK_ERR_UNEXPECTED -1
61 #define CONTEXT_THREADS_MAX 256
69 static volatile int sys_corenbr = 1;
70 static volatile int topo_initialized = 0;
81 if ( !topo_initialized ) {
82 #if (defined QUARK_OS_LINUX) || (defined QUARK_OS_AIX)
84 sys_corenbr = sysconf(_SC_NPROCESSORS_ONLN);
86 #elif (defined QUARK_OS_MACOS)
90 size_t len =
sizeof(cpu);
97 sysctl(mib, 2, &cpu, &len, NULL, 0);
100 sysctl( mib, 2, &cpu, &len, NULL, 0 );
106 #elif (defined QUARK_OS_WINDOWS)
108 GetSystemInfo(&sysinfo);
109 sys_corenbr = sysinfo.dwNumberOfProcessors;
130 #ifndef QUARK_AFFINITY_DISABLE
131 #if (defined QUARK_OS_LINUX)
135 CPU_SET( rank, &
set );
137 #if (defined HAVE_OLD_SCHED_SETAFFINITY)
138 if( sched_setaffinity( 0, &
set ) < 0 )
140 if( sched_setaffinity( 0,
sizeof(
set), &
set) < 0 )
148 #elif (defined QUARK_OS_MACOS)
150 thread_affinity_policy_data_t ap;
154 ret = thread_policy_set( mach_thread_self(),
155 THREAD_AFFINITY_POLICY,
157 THREAD_AFFINITY_POLICY_COUNT
164 #elif (defined QUARK_OS_WINDOWS)
166 DWORD mask = 1 << rank;
168 if( SetThreadAffinityMask(GetCurrentThread(), mask) == 0)
173 #elif (defined QUARK_OS_AIX)
175 tid_t self_ktid = thread_self ();
176 bindprocessor(BINDTHREAD, self_ktid, rank);
197 #ifndef QUARK_AFFINITY_DISABLE
198 #if (defined QUARK_OS_LINUX)
204 for(i=0; i<sys_corenbr; i++)
207 #if (defined HAVE_OLD_SCHED_SETAFFINITY)
208 if( sched_setaffinity( 0, &
set ) < 0 )
210 if( sched_setaffinity( 0,
sizeof(
set), &
set) < 0 )
213 quark_warning(
"quark_unsetaffinity",
"Could not unbind thread");
219 #elif (defined QUARK_OS_MACOS)
238 #elif (defined QUARK_OS_WINDOWS)
243 for(i=0; i<sys_corenbr; i++)
246 if( SetThreadAffinityMask(GetCurrentThread(), mask) == 0) {
247 quark_warning(
"quark_unsetaffinity",
"Could not unbind thread");
252 #elif (defined QUARK_OS_AIX)
272 #if (defined QUARK_OS_LINUX) || (defined QUARK_OS_MACOS) || (defined QUARK_OS_AIX)
273 return sched_yield();
274 #elif QUARK_OS_WINDOWS
281 #ifdef QUARK_OS_WINDOWS
282 #define QUARK_GETENV(var, str) { \
285 str = (char*)malloc(len * sizeof(char)); \
286 ret = GetEnvironmentVariable(var, str, len); \
293 #define QUARK_CLEANENV(str) if (str != NULL) free(str);
297 #define QUARK_GETENV(var, str) envstr = getenv(var);
298 #define QUARK_CLEANENV(str)
310 long int thrdnbr = -1;
315 if ( envstr == NULL ) {
316 thrdnbr = sys_corenbr;
319 thrdnbr = strtol(envstr, &endptr, 10);
320 if ((errno == ERANGE) || ((thrdnbr==0) && (endptr==envstr))) {
336 if ( envstr == NULL) {
338 coresbind[i] = i % sys_corenbr;
349 val = strtol(envstr, &endptr, 10);
350 if (endptr != envstr) {
351 coresbind[i] = (int)val;
358 fprintf(stderr,
"quark_get_affthreads: QUARK_AFF_THREADS should have at least one entry => everything will be bind on core 0");
368 coresbind[i] = coresbind[0];
372 coresbind[i] = coresbind[i % nbr];
388 long int longval = -1;
392 if ( envstr == NULL ) {
396 longval = strtol(envstr, &endptr, 10);
397 if ((errno == ERANGE) || ((longval==0) && (endptr==envstr))) {