瀏覽代碼

Do not block in drivers run by the application

Samuel Thibault 10 年之前
父節點
當前提交
5017e4ef01
共有 3 個文件被更改,包括 24 次插入3 次删除
  1. 22 1
      src/core/workers.c
  2. 1 1
      src/core/workers.h
  3. 1 1
      src/drivers/driver_common/driver_common.c

+ 22 - 1
src/core/workers.c

@@ -1341,13 +1341,34 @@ void starpu_resume()
 	STARPU_PTHREAD_MUTEX_UNLOCK(&pause_mutex);
 }
 
-unsigned _starpu_worker_can_block(unsigned memnode STARPU_ATTRIBUTE_UNUSED)
+unsigned _starpu_worker_can_block(unsigned memnode STARPU_ATTRIBUTE_UNUSED, struct _starpu_worker *worker STARPU_ATTRIBUTE_UNUSED)
 {
 #ifdef STARPU_NON_BLOCKING_DRIVERS
 	return 0;
 #else
 	unsigned can_block = 1;
 
+	struct starpu_driver driver;
+	switch (driver.type)
+	{
+	case STARPU_CPU_WORKER:
+		driver.id.cpu_id = worker->devid;
+		break;
+	case STARPU_CUDA_WORKER:
+		driver.id.cuda_id = worker->devid;
+		break;
+	case STARPU_OPENCL_WORKER:
+		starpu_opencl_get_device(worker->devid, &driver.id.opencl_id);
+		break;
+	default:
+		goto always_launch;
+	}
+	driver.type = worker->arch;
+	if (!_starpu_may_launch_driver(config.conf, &driver))
+		return 0;
+
+always_launch:
+
 #ifndef STARPU_SIMGRID
 	if (!_starpu_check_that_no_data_request_exists(memnode))
 		can_block = 0;

+ 1 - 1
src/core/workers.h

@@ -377,7 +377,7 @@ uint32_t _starpu_can_submit_scc_task(void);
 
 /* Check whether there is anything that the worker should do instead of
  * sleeping (waiting on something to happen). */
-unsigned _starpu_worker_can_block(unsigned memnode);
+unsigned _starpu_worker_can_block(unsigned memnode, struct _starpu_worker *worker);
 
 /* This function must be called to block a worker. It puts the worker in a
  * sleeping state until there is some event that forces the worker to wake up.

+ 1 - 1
src/drivers/driver_common/driver_common.c

@@ -338,7 +338,7 @@ struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *worker, int w
 
 		_starpu_worker_set_status_sleeping(workerid);
 
-		if (_starpu_worker_can_block(memnode)
+		if (_starpu_worker_can_block(memnode, worker)
 #ifndef STARPU_SIMGRID
 				&& !_starpu_sched_ctx_last_worker_awake(worker)
 #endif