Commit 02379f18 authored by Pedro Gonnet's avatar Pedro Gonnet
Browse files

assign queues according to proximity of the cpuid when affinity is set.


Former-commit-id: 79f6a5f294829fbf0a5f119d89d5ebefa4b8e5f7
parent e031bc48
......@@ -798,13 +798,20 @@ void engine_init ( struct engine *e , struct space *s , float dt , int nr_thread
if ( pthread_create( &e->runners[k].thread , NULL , &runner_main , &e->runners[k] ) != 0 )
error( "Failed to create runner thread." );
#if defined(HAVE_SETAFFINITY)
/* Set a reasonable queue ID. */
e->runners[k].qid = cpuid[ k ] * nr_queues / nr_threads;
/* Set the cpu mask to zero | e->id. */
CPU_ZERO( &cpuset );
CPU_SET( cpuid[ e->runners[k].id ] , &cpuset );
CPU_SET( cpuid[ k ] , &cpuset );
/* Apply this mask to the runner's pthread. */
if ( pthread_setaffinity_np( e->runners[k].thread , sizeof(cpu_set_t) , &cpuset ) != 0 )
error( "Failed to set thread affinity." );
#else
e->runners[k].qid = k % nr_queues;
#endif
}
......
......@@ -768,7 +768,7 @@ void *runner_main ( void *data ) {
struct runner *r = (struct runner *)data;
struct engine *e = r->e;
struct scheduler *sched = &e->sched;
int threadID = r->id;
int qid = r->qid;
struct task *t;
struct cell *ci, *cj;
......@@ -783,7 +783,7 @@ void *runner_main ( void *data ) {
/* Get a task, how and from where depends on the policy. */
TIMER_TIC
t = scheduler_gettask( sched , threadID );
t = scheduler_gettask( sched , qid );
TIMER_TOC(timer_getpair);
/* Did I get anything? */
......
......@@ -62,6 +62,9 @@ struct runner {
/* The thread which it is running. */
pthread_t thread;
/* The queue to use to get tasks. */
int qid;
/* The underlying runner. */
struct engine *e;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment