Bladeren bron

Protect the queues when initializing the drivers even if the counters are only
meaningful when there is a single worker per queue.

Cédric Augonnet 15 jaren geleden
bovenliggende
commit
6d3925222f
4 gewijzigde bestanden met toevoegingen van 49 en 30 verwijderingen
  1. 4 0
      src/core/workers.c
  2. 15 10
      src/drivers/cpu/driver_cpu.c
  3. 15 10
      src/drivers/cuda/driver_cuda.c
  4. 15 10
      src/drivers/opencl/driver_opencl.c

+ 4 - 0
src/core/workers.c

@@ -82,6 +82,8 @@ static void _starpu_init_worker_queue(struct starpu_worker_s *workerarg)
 {
 	struct starpu_jobq_s *jobq = workerarg->jobq;
 
+	PTHREAD_MUTEX_LOCK(&jobq->activity_mutex);
+
 	/* warning : in case there are multiple workers on the same
 	  queue, we overwrite this value so that it is meaningless */
 	jobq->arch = workerarg->perf_arch;
@@ -105,6 +107,8 @@ static void _starpu_init_worker_queue(struct starpu_worker_s *workerarg)
 			STARPU_ABORT();
 	}
 		
+	PTHREAD_MUTEX_UNLOCK(&jobq->activity_mutex);
+
 	_starpu_memory_node_attach_queue(jobq, workerarg->memory_node);
 }
 

+ 15 - 10
src/drivers/cpu/driver_cpu.c

@@ -98,6 +98,7 @@ static int execute_job_on_cpu(starpu_job_t j, struct starpu_worker_s *cpu_args)
 void *_starpu_cpu_worker(void *arg)
 {
 	struct starpu_worker_s *cpu_arg = arg;
+	struct starpu_jobq_s *jobq = cpu_arg->jobq;
 
 #ifdef STARPU_USE_FXT
 	_starpu_fxt_register_thread(cpu_arg->bindid);
@@ -112,22 +113,26 @@ void *_starpu_cpu_worker(void *arg)
 
 	_starpu_set_local_memory_node_key(&cpu_arg->memory_node);
 
-	_starpu_set_local_queue(cpu_arg->jobq);
+	_starpu_set_local_queue(jobq);
 
 	_starpu_set_local_worker_key(cpu_arg);
 
 	snprintf(cpu_arg->name, 32, "CPU %d", cpu_arg->devid);
 
+	PTHREAD_MUTEX_LOCK(&jobq->activity_mutex);
+
 	/* this is only useful (and meaningful) is there is a single
 	   memory node "related" to that queue */
-	cpu_arg->jobq->memory_node = cpu_arg->memory_node;
+	jobq->memory_node = cpu_arg->memory_node;
 
-	cpu_arg->jobq->total_computation_time = 0.0;
-	cpu_arg->jobq->total_communication_time = 0.0;
-	cpu_arg->jobq->total_computation_time_error = 0.0;
-	cpu_arg->jobq->total_job_performed = 0;
+	jobq->total_computation_time = 0.0;
+	jobq->total_communication_time = 0.0;
+	jobq->total_computation_time_error = 0.0;
+	jobq->total_job_performed = 0;
 
 	cpu_arg->status = STATUS_UNKNOWN;
+
+	PTHREAD_MUTEX_UNLOCK(&jobq->activity_mutex);
 	
 	STARPU_TRACE_WORKER_INIT_END
 
@@ -205,17 +210,17 @@ void *_starpu_cpu_worker(void *arg)
 	_starpu_free_all_automatically_allocated_buffers(memnode);
 
 #ifdef STARPU_DATA_STATS
-	fprintf(stderr, "CPU #%d computation %le comm %le (%lf \%%)\n", cpu_arg->devid, cpu_arg->jobq->total_computation_time, cpu_arg->jobq->total_communication_time,  cpu_arg->jobq->total_communication_time*100.0/cpu_arg->jobq->total_computation_time);
+	fprintf(stderr, "CPU #%d computation %le comm %le (%lf \%%)\n", cpu_arg->devid, jobq->total_computation_time, jobq->total_communication_time,  jobq->total_communication_time*100.0/jobq->total_computation_time);
 #endif
 
 #ifdef STARPU_VERBOSE
 	double ratio = 0;
-	if (cpu_arg->jobq->total_job_performed != 0)
+	if (jobq->total_job_performed != 0)
 	{
-		ratio = cpu_arg->jobq->total_computation_time_error/cpu_arg->jobq->total_computation_time;
+		ratio = jobq->total_computation_time_error/jobq->total_computation_time;
 	}
 
-	_starpu_print_to_logfile("MODEL ERROR: CPU %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", cpu_arg->devid, cpu_arg->jobq->total_computation_time_error, cpu_arg->jobq->total_computation_time, ratio, cpu_arg->jobq->total_job_performed);
+	_starpu_print_to_logfile("MODEL ERROR: CPU %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", cpu_arg->devid, jobq->total_computation_time_error, jobq->total_computation_time, ratio, jobq->total_job_performed);
 #endif
 
 	STARPU_TRACE_WORKER_DEINIT_END(STARPU_FUT_CPU_KEY);

+ 15 - 10
src/drivers/cuda/driver_cuda.c

@@ -167,6 +167,7 @@ static int execute_job_on_cuda(starpu_job_t j, struct starpu_worker_s *args)
 void *_starpu_cuda_worker(void *arg)
 {
 	struct starpu_worker_s* args = arg;
+	struct starpu_jobq_s *jobq = args->jobq;
 
 	int devid = args->devid;
 	unsigned memory_node = args->memory_node;
@@ -180,18 +181,22 @@ void *_starpu_cuda_worker(void *arg)
 
 	_starpu_set_local_memory_node_key(&(args->memory_node));
 
-	_starpu_set_local_queue(args->jobq);
+	_starpu_set_local_queue(jobq);
 
 	_starpu_set_local_worker_key(args);
 
+	PTHREAD_MUTEX_LOCK(&jobq->activity_mutex);
+
 	/* this is only useful (and meaningful) is there is a single
 	   memory node "related" to that queue */
-	args->jobq->memory_node = memory_node;
+	jobq->memory_node = memory_node;
+
+	jobq->total_computation_time = 0.0;
+	jobq->total_communication_time = 0.0;
+	jobq->total_computation_time_error = 0.0;
+	jobq->total_job_performed = 0;
 
-	args->jobq->total_computation_time = 0.0;
-	args->jobq->total_communication_time = 0.0;
-	args->jobq->total_computation_time_error = 0.0;
-	args->jobq->total_job_performed = 0;
+	PTHREAD_MUTEX_UNLOCK(&jobq->activity_mutex);
 
 	init_context(devid);
 
@@ -291,18 +296,18 @@ void *_starpu_cuda_worker(void *arg)
 	deinit_context(args->workerid);
 
 #ifdef STARPU_DATA_STATS
-	fprintf(stderr, "CUDA #%d computation %le comm %le (%lf \%%)\n", args->id, args->jobq->total_computation_time, args->jobq->total_communication_time, args->jobq->total_communication_time*100.0/args->jobq->total_computation_time);
+	fprintf(stderr, "CUDA #%d computation %le comm %le (%lf \%%)\n", args->id, jobq->total_computation_time, jobq->total_communication_time, jobq->total_communication_time*100.0/jobq->total_computation_time);
 #endif
 
 #ifdef STARPU_VERBOSE
 	double ratio = 0;
-	if (args->jobq->total_job_performed != 0)
+	if (jobq->total_job_performed != 0)
 	{
-		ratio = args->jobq->total_computation_time_error/args->jobq->total_computation_time;
+		ratio = jobq->total_computation_time_error/jobq->total_computation_time;
 	}
 
 
-	_starpu_print_to_logfile("MODEL ERROR: CUDA %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", args->devid, args->jobq->total_computation_time_error, args->jobq->total_computation_time, ratio, args->jobq->total_job_performed);
+	_starpu_print_to_logfile("MODEL ERROR: CUDA %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", args->devid, jobq->total_computation_time_error, jobq->total_computation_time, ratio, jobq->total_job_performed);
 #endif
 
 	STARPU_TRACE_WORKER_DEINIT_END(STARPU_FUT_CUDA_KEY);

+ 15 - 10
src/drivers/opencl/driver_opencl.c

@@ -183,6 +183,7 @@ static int _starpu_opencl_execute_job(starpu_job_t j, struct starpu_worker_s *ar
 void *_starpu_opencl_worker(void *arg)
 {
 	struct starpu_worker_s* args = arg;
+	struct starpu_jobq_s *jobq = args->jobq;
 
 	int devid = args->devid;
 	unsigned memory_node = args->memory_node;
@@ -195,18 +196,22 @@ void *_starpu_opencl_worker(void *arg)
 
 	_starpu_set_local_memory_node_key(&(args->memory_node));
 
-	_starpu_set_local_queue(args->jobq);
+	_starpu_set_local_queue(jobq);
 
 	_starpu_set_local_worker_key(args);
 
+	PTHREAD_MUTEX_LOCK(&jobq->activity_mutex);
+
 	/* this is only useful (and meaningful) is there is a single
 	   memory node "related" to that queue */
-	args->jobq->memory_node = memory_node;
+	jobq->memory_node = memory_node;
+
+	jobq->total_computation_time = 0.0;
+	jobq->total_communication_time = 0.0;
+	jobq->total_computation_time_error = 0.0;
+	jobq->total_job_performed = 0;
 
-	args->jobq->total_computation_time = 0.0;
-	args->jobq->total_communication_time = 0.0;
-	args->jobq->total_computation_time_error = 0.0;
-	args->jobq->total_job_performed = 0;
+	PTHREAD_MUTEX_UNLOCK(&jobq->activity_mutex);
 
 	_starpu_opencl_init_context(devid);
 
@@ -297,18 +302,18 @@ void *_starpu_opencl_worker(void *arg)
           _starpu_opencl_deinit_context(devid);
 
 #ifdef DATA_STATS
-	fprintf(stderr, "OpenCL #%d computation %le comm %le (%lf \%%)\n", args->id, args->jobq->total_computation_time, args->jobq->total_communication_time, args->jobq->total_communication_time*100.0/args->jobq->total_computation_time);
+	fprintf(stderr, "OpenCL #%d computation %le comm %le (%lf \%%)\n", args->id, jobq->total_computation_time, jobq->total_communication_time, jobq->total_communication_time*100.0/jobq->total_computation_time);
 #endif
 
 #ifdef STARPU_VERBOSE
 	double ratio = 0;
-	if (args->jobq->total_job_performed != 0)
+	if (jobq->total_job_performed != 0)
 	{
-		ratio = args->jobq->total_computation_time_error/args->jobq->total_computation_time;
+		ratio = jobq->total_computation_time_error/jobq->total_computation_time;
 	}
 
 
-	_starpu_print_to_logfile("MODEL ERROR: OpenCL %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", args->devid, args->jobq->total_computation_time_error, args->jobq->total_computation_time, ratio, args->jobq->total_job_performed);
+	_starpu_print_to_logfile("MODEL ERROR: OpenCL %d ERROR %lf EXEC %lf RATIO %lf NTASKS %d\n", args->devid, jobq->total_computation_time_error, jobq->total_computation_time, ratio, jobq->total_job_performed);
 #endif
 
 	pthread_exit(NULL);