void *param,
void *data);
+//#define CORE_BINDING //Uncomment this to enable binding of threads to physical cores. Only Linux.
+#ifdef CORE_BINDING
+XBT_PUBLIC(int) xbt_os_thread_bind(xbt_os_thread_t thread, int cpu);
+#endif
+
XBT_PUBLIC(void) xbt_os_thread_exit(int *retcode);
XBT_PUBLIC(void) xbt_os_thread_detach(xbt_os_thread_t thread);
XBT_PUBLIC(xbt_os_thread_t) xbt_os_thread_self(void);
// free the MSG process
xbt_free(msg_proc);
- SIMIX_process_cleanup(smx_proc);
}
/* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */
/* Create the pool of worker threads */
xbt_parmap_thread_data_t data;
parmap->workers[0] = NULL;
+#ifdef CORE_BINDING
+ unsigned int core_bind = 0;
+#endif
for (i = 1; i < num_workers; i++) {
data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
data->parmap = parmap;
data->worker_id = i;
parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_worker_main,
data, NULL);
+#ifdef CORE_BINDING
+ xbt_os_thread_bind(parmap->workers[i], core_bind);
+ if(core_bind!=xbt_os_get_numcores()){
+ core_bind++;
+ } else {
+ core_bind = 0;
+ }
+#endif
}
return parmap;
}
#include <limits.h>
#include <semaphore.h>
+#ifdef CORE_BINDING
+#define _GNU_SOURCE
+#include <sched.h>
+#endif
+
#ifdef HAVE_MUTEX_TIMEDLOCK
/* redefine the function header since we fail to get this from system headers on amd (at least) */
int pthread_mutex_timedlock(pthread_mutex_t * mutex,
}
+#ifdef CORE_BINDING
+int xbt_os_thread_bind(xbt_os_thread_t thread, int cpu){
+ pthread_t pthread = thread->t;
+ int errcode = 0;
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ CPU_SET(cpu, &cpuset);
+ errcode = pthread_setaffinity_np(pthread, sizeof(cpu_set_t), &cpuset);
+ return errcode;
+}
+#endif
+
void xbt_os_thread_setstacksize(int stack_size)
{
size_t alignment[] = {