Преглед на файлове

src/core/workers.c: simplify the waiting for worker initialisation by using the field run_by_starpu instead of re-calling starpu_may_launch_driver()

Nathalie Furmento преди 8 години
родител
ревизия
7c1cf3c779
променени са 1 файла, в които са добавени 25 реда и са изтрити 65 реда
  1. 25 65
      src/core/workers.c

+ 25 - 65
src/core/workers.c

@@ -639,8 +639,6 @@ static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig)
 	STARPU_HG_DISABLE_CHECKING(pconfig->watchdog_ok);
 
 	unsigned nworkers = pconfig->topology.nworkers;
-
-	/* Launch workers asynchronously */
 	unsigned worker;
 
 #if defined(STARPU_PERF_DEBUG) && !defined(STARPU_SIMGRID)
@@ -649,6 +647,7 @@ static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig)
 #endif
 	STARPU_AYU_INIT();
 
+	/* Launch workers asynchronously */
 	for (worker = 0; worker < nworkers; worker++)
 	{
 		struct _starpu_worker *workerarg = &pconfig->workers[worker];
@@ -819,8 +818,8 @@ static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig)
 
 #ifdef STARPU_MPI_MASTER_SLAVE_MULTIPLE_THREAD
                 /* if MPI has multiple threads supports
-                 * we launch 1 thread per device 
-                 * else 
+                 * we launch 1 thread per device
+                 * else
                  * we launch one thread for all devices
                  */
 				STARPU_PTHREAD_CREATE_ON(
@@ -892,70 +891,31 @@ static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig)
 	for (worker = 0; worker < nworkers; worker++)
 	{
 		struct _starpu_worker *workerarg = &pconfig->workers[worker];
-		struct starpu_driver driver;
-		unsigned devid = workerarg->devid;
-		driver.type = workerarg->arch;
-#if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID)
-		struct _starpu_worker_set *worker_set = workerarg->set;
-#endif
 
-		switch (workerarg->arch)
-		{
-			case STARPU_CPU_WORKER:
-				driver.id.cpu_id = devid;
-				if (!_starpu_may_launch_driver(&pconfig->conf, &driver))
-					break;
-				_STARPU_DEBUG("waiting for worker %u initialization\n", worker);
-				STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex);
-				while (!workerarg->worker_is_initialized)
-					STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex);
-				STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex);
-				break;
-#if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID)
-			case STARPU_CUDA_WORKER:
-#ifndef STARPU_SIMGRID
-				driver.id.cuda_id = devid;
-				if (!_starpu_may_launch_driver(&pconfig->conf, &driver))
-					break;
-#endif
-				_STARPU_DEBUG("waiting for worker %u initialization\n", worker);
-				STARPU_PTHREAD_MUTEX_LOCK(&worker_set->mutex);
-				while (!worker_set->set_is_initialized)
-					STARPU_PTHREAD_COND_WAIT(&worker_set->ready_cond,
-								 &worker_set->mutex);
-				STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set->mutex);
-				worker_set->started = 1;
-
-				break;
-#endif
-#if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID)
-			case STARPU_OPENCL_WORKER:
-#ifndef STARPU_SIMGRID
-				starpu_opencl_get_device(devid, &driver.id.opencl_id);
-				if (!_starpu_may_launch_driver(&pconfig->conf, &driver))
-					break;
+		_STARPU_DEBUG("waiting for worker %u initialization\n", worker);
+#if defined(STARPU_USE_CPU) || !defined(STARPU_SIMGRID)
+		if (!workerarg->run_by_starpu)
+			break;
 #endif
-				_STARPU_DEBUG("waiting for worker %u initialization\n", worker);
-				STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex);
-				while (!workerarg->worker_is_initialized)
-					STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex);
-				STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex);
-				break;
+#if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID)
+		if (workerarg->arch == STARPU_CUDA_WORKER)
+		{
+			struct _starpu_worker_set *worker_set = workerarg->set;
+			STARPU_PTHREAD_MUTEX_LOCK(&worker_set->mutex);
+			while (!worker_set->set_is_initialized)
+				STARPU_PTHREAD_COND_WAIT(&worker_set->ready_cond,
+							 &worker_set->mutex);
+			STARPU_PTHREAD_MUTEX_UNLOCK(&worker_set->mutex);
+			worker_set->started = 1;
+		}
+		else
 #endif
-			case STARPU_MIC_WORKER:
-                        case STARPU_MPI_MS_WORKER:
-				/* Already waited above */
-				break;
-			case STARPU_SCC_WORKER:
-				/* TODO: implement may_launch? */
-				_STARPU_DEBUG("waiting for worker %u initialization\n", worker);
-				STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex);
-				while (!workerarg->worker_is_initialized)
-					STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex);
-				STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex);
-				break;
-			default:
-				STARPU_ABORT();
+		if (workerarg->arch != STARPU_CUDA_WORKER)
+		{
+			STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex);
+			while (!workerarg->worker_is_initialized)
+				STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex);
+			STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex);
 		}
 	}