Преглед изворни кода

merge trunk@6588 (src/drivers/opencl/driver_opencl.c was merged by hand i.e by copying the version out of trunk@6588 and applying by hand all patches from the branch sched_ctx)

Nathalie Furmento пре 12 година
родитељ
комит
4e511b6c58
2 измењених фајлова са 133 додато и 52 уклоњено
  1. 17 3
      src/core/workers.c
  2. 116 49
      src/drivers/opencl/driver_opencl.c

+ 17 - 3
src/core/workers.c

@@ -1117,6 +1117,11 @@ extern int _starpu_cuda_driver_init(struct starpu_driver *);
 extern int _starpu_cuda_driver_run_once(struct starpu_driver *);
 extern int _starpu_cuda_driver_run_once(struct starpu_driver *);
 extern int _starpu_cuda_driver_deinit(struct starpu_driver *);
 extern int _starpu_cuda_driver_deinit(struct starpu_driver *);
 #endif
 #endif
+#ifdef STARPU_USE_OPENCL
+extern int _starpu_opencl_driver_init(struct starpu_driver *);
+extern int _starpu_opencl_driver_run_once(struct starpu_driver *);
+extern int _starpu_opencl_driver_deinit(struct starpu_driver *);
+#endif
 
 
 int
 int
 starpu_driver_init(struct starpu_driver *d)
 starpu_driver_init(struct starpu_driver *d)
@@ -1129,8 +1134,11 @@ starpu_driver_init(struct starpu_driver *d)
 	case STARPU_CUDA_WORKER:
 	case STARPU_CUDA_WORKER:
 		return _starpu_cuda_driver_init(d);
 		return _starpu_cuda_driver_init(d);
 #endif
 #endif
+#ifdef STARPU_USE_OPENCL
+	case STARPU_OPENCL_WORKER:
+		return _starpu_opencl_driver_deinit(d);
+#endif
 	case STARPU_CPU_WORKER:    /* Not supported yet */
 	case STARPU_CPU_WORKER:    /* Not supported yet */
-	case STARPU_OPENCL_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	default:
 	default:
 		return -EINVAL;
 		return -EINVAL;
@@ -1148,8 +1156,11 @@ starpu_driver_run_once(struct starpu_driver *d)
 	case STARPU_CUDA_WORKER:
 	case STARPU_CUDA_WORKER:
 		return _starpu_cuda_driver_run_once(d);
 		return _starpu_cuda_driver_run_once(d);
 #endif
 #endif
+#ifdef STARPU_USE_OPENCL
+	case STARPU_OPENCL_WORKER:
+		return _starpu_opencl_driver_run_once(d);
+#endif
 	case STARPU_CPU_WORKER:    /* Not supported yet */
 	case STARPU_CPU_WORKER:    /* Not supported yet */
-	case STARPU_OPENCL_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	default:
 	default:
 		return -EINVAL;
 		return -EINVAL;
@@ -1167,8 +1178,11 @@ starpu_driver_deinit(struct starpu_driver *d)
 	case STARPU_CUDA_WORKER:
 	case STARPU_CUDA_WORKER:
 		return _starpu_cuda_driver_deinit(d);
 		return _starpu_cuda_driver_deinit(d);
 #endif
 #endif
+#ifdef STARPU_USE_OPENCL
+	case STARPU_OPENCL_WORKER:
+		return _starpu_opencl_driver_deinit(d);
+#endif
 	case STARPU_CPU_WORKER:    /* Not supported yet */
 	case STARPU_CPU_WORKER:    /* Not supported yet */
-	case STARPU_OPENCL_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	case STARPU_GORDON_WORKER: /* Not supported yet */
 	default:
 	default:
 		return -EINVAL;
 		return -EINVAL;

+ 116 - 49
src/drivers/opencl/driver_opencl.c

@@ -399,12 +399,38 @@ void _starpu_opencl_init(void)
 static unsigned _starpu_opencl_get_device_name(int dev, char *name, int lname);
 static unsigned _starpu_opencl_get_device_name(int dev, char *name, int lname);
 static int _starpu_opencl_execute_job(struct _starpu_job *j, struct _starpu_worker *args);
 static int _starpu_opencl_execute_job(struct _starpu_job *j, struct _starpu_worker *args);
 
 
-void *_starpu_opencl_worker(void *arg)
+static struct _starpu_worker*
+_starpu_opencl_get_worker_from_driver(struct starpu_driver *d)
 {
 {
-	struct _starpu_worker* args = arg;
+	int nworkers;
+	int workers[STARPU_MAXOPENCLDEVS];
+	nworkers = starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, workers, STARPU_MAXOPENCLDEVS);
+	if (nworkers == 0)
+		return NULL;
+
+	int i;
+	for (i = 0; i < nworkers; i++)
+	{
+		cl_device_id device;
+		int devid = starpu_worker_get_devid(workers[i]);
+		starpu_opencl_get_device(devid, &device);
+		if (device == d->id.opencl_id)
+			break;
+	}
+
+	if (i == nworkers)
+		return NULL;
+
+	return _starpu_get_worker_struct(workers[i]);
+}
+
+int _starpu_opencl_driver_init(struct starpu_driver *d)
+{
+	struct _starpu_worker* args;
+	args = _starpu_opencl_get_worker_from_driver(d);
+	STARPU_ASSERT(args);
 
 
 	int devid = args->devid;
 	int devid = args->devid;
-	int workerid = args->workerid;
 
 
 #ifdef USE_FXT
 #ifdef USE_FXT
 	fxt_register_thread(args->bindid);
 	fxt_register_thread(args->bindid);
@@ -415,7 +441,7 @@ void *_starpu_opencl_worker(void *arg)
 
 
 	_starpu_bind_thread_on_cpu(args->config, args->bindid);
 	_starpu_bind_thread_on_cpu(args->config, args->bindid);
 
 
-	_starpu_set_local_memory_node_key(&memnode);
+	_starpu_set_local_memory_node_key(&args->memory_node);
 
 
 	_starpu_set_local_worker_key(args);
 	_starpu_set_local_worker_key(args);
 
 
@@ -442,74 +468,115 @@ void *_starpu_opencl_worker(void *arg)
 	_STARPU_PTHREAD_COND_SIGNAL(&args->ready_cond);
 	_STARPU_PTHREAD_COND_SIGNAL(&args->ready_cond);
 	_STARPU_PTHREAD_MUTEX_UNLOCK(&args->mutex);
 	_STARPU_PTHREAD_MUTEX_UNLOCK(&args->mutex);
 
 
-	struct _starpu_job * j;
+	return 0;
+}
+
+int _starpu_opencl_driver_run_once(struct starpu_driver *d)
+{
+	struct _starpu_worker* args;
+	args = _starpu_opencl_get_worker_from_driver(d);
+	STARPU_ASSERT(args);
+
+	int workerid = args->workerid;
+	unsigned memnode = args->memory_node;
+
+	pthread_cond_t *sched_cond = &args->sched_cond;
+	pthread_mutex_t *sched_mutex = &args->sched_mutex;
+
+	struct _starpu_job *j;
 	struct starpu_task *task;
 	struct starpu_task *task;
 	int res;
 	int res;
 
 
-	pthread_cond_t *sched_cond = &args->sched_cond;
-    pthread_mutex_t *sched_mutex = &args->sched_mutex;
+	_STARPU_TRACE_START_PROGRESS(memnode);
+	_starpu_datawizard_progress(memnode, 1);
+	_STARPU_TRACE_END_PROGRESS(memnode);
 
 
-	while (_starpu_machine_is_running())
+	task = _starpu_pop_task(args);
+
+	if (task == NULL)
 	{
 	{
-		_STARPU_TRACE_START_PROGRESS(memnode);
-		_starpu_datawizard_progress(memnode, 1);
-		_STARPU_TRACE_END_PROGRESS(memnode);
+		_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
+		if (_starpu_worker_can_block(memnode))
+			_starpu_block_worker(workerid, sched_cond, sched_mutex);
 
 
-		task = _starpu_pop_task(args);
-		
-		if (task == NULL) 
-		{
-			_STARPU_PTHREAD_MUTEX_LOCK(sched_mutex);
-			if (_starpu_worker_can_block(memnode))
-				_starpu_block_worker(workerid, sched_cond, sched_mutex);
+		_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
 
 
-			_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
+		return 0;
+	};
 
 
-			continue;
-		};
+	_STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex);
 
 
-		STARPU_ASSERT(task);
-		j = _starpu_get_job_associated_to_task(task);
+	STARPU_ASSERT(task);
+	j = _starpu_get_job_associated_to_task(task);
 
 
-		/* can OpenCL do that task ? */
-		if (!_STARPU_OPENCL_MAY_PERFORM(j))
-		{
-			/* this is not a OpenCL task */
-			_starpu_push_task(j);
-			continue;
-		}
+	/* can OpenCL do that task ? */
+	if (!_STARPU_OPENCL_MAY_PERFORM(j))
+	{
+		/* this is not a OpenCL task */
+		_starpu_push_task(j);
+		return 0;
+	}
 
 
-		_starpu_set_current_task(j->task);
-		args->current_task = j->task;
+	_starpu_set_current_task(j->task);
+	args->current_task = j->task;
 
 
-		res = _starpu_opencl_execute_job(j, args);
+	res = _starpu_opencl_execute_job(j, args);
 
 
-		_starpu_set_current_task(NULL);
-		args->current_task = NULL;
+	_starpu_set_current_task(NULL);
+	args->current_task = NULL;
 
 
-                if (res)
+	if (res)
+	{
+		switch (res)
 		{
 		{
-			switch (res)
-			{
-				case -EAGAIN:
-					_STARPU_DISP("ouch, put the codelet %p back ... \n", j);
-					_starpu_push_task(j);
-					STARPU_ABORT();
-					continue;
-				default:
-					STARPU_ASSERT(0);
-			}
+			case -EAGAIN:
+				_STARPU_DISP("ouch, put the codelet %p back ... \n", j);
+				_starpu_push_task(j);
+				STARPU_ABORT();
+				return 0;
+			default:
+				STARPU_ASSERT(0);
 		}
 		}
-
-		_starpu_handle_job_termination(j, workerid);
 	}
 	}
 
 
+	_starpu_handle_job_termination(j, workerid);
+
+	return 0;
+}
+
+int _starpu_opencl_driver_deinit(struct starpu_driver *d)
+{
 	_STARPU_TRACE_WORKER_DEINIT_START
 	_STARPU_TRACE_WORKER_DEINIT_START
 
 
-	_starpu_handle_all_pending_node_data_requests(memnode);
+	struct _starpu_worker* args;
+	args = _starpu_opencl_get_worker_from_driver(d);
+	STARPU_ASSERT(args);
+
+	unsigned devid   = args->devid;
+	unsigned memnode = args->memory_node;
 
 
+	_starpu_handle_all_pending_node_data_requests(memnode);
         _starpu_opencl_deinit_context(devid);
         _starpu_opencl_deinit_context(devid);
 
 
+	return 0;
+}
+
+void *_starpu_opencl_worker(void *arg)
+{
+	cl_device_id id;
+	struct _starpu_worker* args = arg;
+
+	starpu_opencl_get_device(args->devid, &id);
+	struct starpu_driver d = {
+		.type         = STARPU_CUDA_WORKER,
+		.id.opencl_id = id
+	};
+
+	_starpu_opencl_driver_init(&d);
+	while (_starpu_machine_is_running())
+		_starpu_opencl_driver_run_once(&d);
+	_starpu_opencl_driver_deinit(&d);
+
 	return NULL;
 	return NULL;
 }
 }