Browse Source

factorize the code to bind a worker on a specific CPU.

Cédric Augonnet 16 years ago
parent
commit
2bcc73252e

+ 11 - 0
src/core/workers.c

@@ -183,6 +183,17 @@ static void init_machine_config(struct machine_config_s *config,
 	}
 }
 
+void bind_thread_on_cpu(unsigned coreid)
+{
+#ifndef DONTBIND
+	/* fix the thread on the correct cpu */
+	cpu_set_t aff_mask;
+	CPU_ZERO(&aff_mask);
+	CPU_SET(coreid, &aff_mask);
+	sched_setaffinity(0, sizeof(aff_mask), &aff_mask);
+#endif
+}
+
 static void init_workers_binding(struct machine_config_s *config)
 {
 	/* launch one thread per CPU */

+ 1 - 0
src/core/workers.h

@@ -108,6 +108,7 @@ inline uint32_t worker_exists(uint32_t task_mask);
 inline uint32_t may_submit_cuda_task(void);
 inline uint32_t may_submit_core_task(void);
 
+void bind_thread_on_cpu(unsigned coreid);
 
 inline void lock_all_queues_attached_to_node(unsigned node);
 inline void unlock_all_queues_attached_to_node(unsigned node);

+ 1 - 7
src/drivers/core/driver_core.c

@@ -89,13 +89,7 @@ void *core_worker(void *arg)
 #endif
 	TRACE_NEW_WORKER(FUT_CORE_KEY, core_arg->memory_node);
 
-#ifndef DONTBIND
-	/* fix the thread on the correct cpu */
-	cpu_set_t aff_mask; 
-	CPU_ZERO(&aff_mask);
-	CPU_SET(core_arg->bindid, &aff_mask);
-	sched_setaffinity(0, sizeof(aff_mask), &aff_mask);
-#endif
+	bind_thread_on_cpu(core_arg->bindid);
 
 #ifdef VERBOSE
         fprintf(stderr, "core worker %d is ready on logical core %d\n", core_arg->id, core_arg->bindid);

+ 1 - 7
src/drivers/cuda/driver_cuda.c

@@ -329,13 +329,7 @@ void *cuda_worker(void *arg)
 #endif
 	TRACE_NEW_WORKER(FUT_CUDA_KEY, memory_node);
 
-#ifndef DONTBIND
-        /* fix the thread on the correct cpu */
-        cpu_set_t aff_mask;
-        CPU_ZERO(&aff_mask);
-        CPU_SET(args->bindid, &aff_mask);
-        sched_setaffinity(0, sizeof(aff_mask), &aff_mask);
-#endif
+	bind_thread_on_cpu(args->bindid);
 
 	set_local_memory_node_key(&(args->memory_node));
 

+ 2 - 12
src/drivers/gordon/driver_gordon.c

@@ -55,10 +55,7 @@ void *gordon_worker_progress(void *arg)
 	struct worker_set_s *gordon_set_arg = arg;
 	unsigned prog_thread_bind_id = 
 		(gordon_set_arg->workers[0].bindid + 1)%(sysconf(_SC_NPROCESSORS_ONLN));
-	cpu_set_t aff_mask; 
-	CPU_ZERO(&aff_mask);
-	CPU_SET(prog_thread_bind_id, &aff_mask);
-	sched_setaffinity(0, sizeof(aff_mask), &aff_mask);
+	bind_thread_on_cpu(prog_thread_bind_id);
 #endif
 
 	pthread_mutex_lock(&progress_mutex);
@@ -442,14 +439,7 @@ void *gordon_worker(void *arg)
 {
 	struct worker_set_s *gordon_set_arg = arg;
 
-#ifndef DONTBIND
-	/* fix the thread on the correct cpu */
-	cpu_set_t aff_mask; 
-	CPU_ZERO(&aff_mask);
-	CPU_SET(gordon_set_arg->workers[0].bindid, &aff_mask);
-	sched_setaffinity(0, sizeof(aff_mask), &aff_mask);
-#endif
-
+	bind_thread_on_cpu(gordon_set_arg->workers[0].bindid);
 
 	/* TODO set_local_memory_node per SPU */
 	gordon_init(gordon_set_arg->nworkers);