Browse Source

Fix filling the pipeline

Samuel Thibault 10 years ago
parent
commit
62194c5c86
2 changed files with 9 additions and 5 deletions
  1. 1 0
      src/core/workers.c
  2. 8 5
      src/drivers/cuda/driver_cuda.c

+ 1 - 0
src/core/workers.c

@@ -431,6 +431,7 @@ static void _starpu_worker_init(struct _starpu_worker *workerarg, struct _starpu
 	workerarg->first_task = 0;
 	workerarg->ntasks = 0;
 	workerarg->pipeline_length = 0;
+	workerarg->pipeline_stuck = 0;
 	workerarg->set = NULL;
 
 	/* if some codelet's termination cannot be handled directly :

+ 8 - 5
src/drivers/cuda/driver_cuda.c

@@ -477,9 +477,9 @@ static void execute_job_on_cuda(struct starpu_task *task, struct _starpu_worker
 #ifdef STARPU_USE_FXT
 		int k;
 		for (k = 0; k < (int) worker->set->nworkers; k++)
-			if (worker->set->workers[k].ntasks)
+			if (worker->set->workers[k].ntasks == worker->set->workers[k].pipeline_length)
 				break;
-		if (k < (int) worker->set->nworkers)
+		if (k == (int) worker->set->nworkers)
 			/* Everybody busy */
 			_STARPU_TRACE_START_EXECUTING()
 #endif
@@ -596,6 +596,7 @@ int _starpu_cuda_driver_run_once(struct _starpu_worker_set *worker_set)
 		if (!worker->ntasks)
 		{
 			idle++;
+			/* Even nothing to test */
 			continue;
 		}
 
@@ -623,8 +624,6 @@ int _starpu_cuda_driver_run_once(struct _starpu_worker_set *worker_set)
 					/* An asynchronous task, it was already
 					 * queued, it's now running, record its start time.  */
 					_starpu_driver_start_job(worker, j, &worker->perf_arch, &j->cl_start, 0, starpu_profiling_status_get());
-					/* Skip the idle handling part, we are still busy */
-					continue;
 				}
 				else
 				{
@@ -633,12 +632,13 @@ int _starpu_cuda_driver_run_once(struct _starpu_worker_set *worker_set)
 					 * last execute it.  */
 
 					_STARPU_TRACE_END_PROGRESS(memnode);
+					_STARPU_TRACE_EVENT("sync_task");
 					execute_job_on_cuda(task, worker);
+					_STARPU_TRACE_EVENT("end_sync_task");
 					_STARPU_TRACE_START_PROGRESS(memnode);
 					worker->pipeline_stuck = 0;
 				}
 			}
-			idle++;
 #ifdef STARPU_USE_FXT
 			int k;
 			for (k = 0; k < (int) worker_set->nworkers; k++)
@@ -649,6 +649,9 @@ int _starpu_cuda_driver_run_once(struct _starpu_worker_set *worker_set)
 				_STARPU_TRACE_END_EXECUTING()
 #endif
 		}
+
+		if (worker->ntasks < worker->pipeline_length)
+			idle++;
 	}
 
 	if (!idle)