From 02379f181b307988b7f991819afa621796e229af Mon Sep 17 00:00:00 2001 From: Pedro Gonnet <pedro.gonnet@durham.ac.uk> Date: Wed, 26 Jun 2013 09:07:27 +0000 Subject: [PATCH] assign queues according to proximity of the cpuid when affinity is set. Former-commit-id: 79f6a5f294829fbf0a5f119d89d5ebefa4b8e5f7 --- src/engine.c | 9 ++++++++- src/runner.c | 4 ++-- src/runner.h | 3 +++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/engine.c b/src/engine.c index 71ce1f316f..9677b151b9 100644 --- a/src/engine.c +++ b/src/engine.c @@ -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 } diff --git a/src/runner.c b/src/runner.c index 2ba35a5e86..000e2abcf7 100644 --- a/src/runner.c +++ b/src/runner.c @@ -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? */ diff --git a/src/runner.h b/src/runner.h index 5ee1ee3a95..c6d2e656ab 100644 --- a/src/runner.h +++ b/src/runner.h @@ -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; -- GitLab