소스 검색

experimental implementation of a light version of _starpu_wake_worker_relax

Olivier Aumage 7 년 전
부모
커밋
58e2fd3f3e
3개의 변경된 파일44개의 추가작업 그리고 1개의 파일을 삭제
  1. 41 0
      src/core/workers.c
  2. 2 0
      src/core/workers.h
  3. 1 1
      src/sched_policies/component_worker.c

+ 41 - 0
src/core/workers.c

@@ -2423,3 +2423,44 @@ hwloc_cpuset_t starpu_worker_get_hwloc_cpuset(int workerid)
 	return hwloc_bitmap_dup(worker->hwloc_cpu_set);
 }
 #endif
+
+/* Light version of _starpu_wake_worker_relax, which, when possible,
+ * speculatively sets keep_awake on the target worker without waiting that
+ * worker to enter the relaxed state.
+ */
+int _starpu_wake_worker_relax_light(int workerid)
+{
+	struct _starpu_worker *worker = _starpu_get_worker_struct(workerid);
+	STARPU_ASSERT(worker != NULL);
+	int cur_workerid = starpu_worker_get_id();
+	if (workerid != cur_workerid)
+	{
+		_starpu_worker_relax_on();
+
+		STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex);
+		while (!worker->state_relax_refcnt)
+		{
+			/* Attempt a fast path if the worker is not really asleep */
+			if (_starpu_config.workers[workerid].status == STATUS_SCHEDULING)
+			{
+				_starpu_config.workers[workerid].state_keep_awake = 1;
+				STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
+				_starpu_worker_relax_off();
+				return 1;
+			}
+
+			STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
+		}
+	}
+	else
+	{
+		STARPU_PTHREAD_MUTEX_LOCK_SCHED(&worker->sched_mutex);
+	}
+	int ret = starpu_wake_worker_locked(workerid);
+	STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
+	if (workerid != cur_workerid)
+	{
+		_starpu_worker_relax_off();
+	}
+	return ret;
+}

+ 2 - 0
src/core/workers.h

@@ -1095,6 +1095,8 @@ static inline int _starpu_wake_worker_relax(int workerid)
 	return ret;
 }
 
+int _starpu_wake_worker_relax_light(int workerid);
+
 /* Allow a worker pulling a task it cannot execute to properly refuse it and
  * send it back to the scheduler.
  */

+ 1 - 1
src/sched_policies/component_worker.c

@@ -400,7 +400,7 @@ static int simple_worker_can_pull(struct starpu_sched_component * worker_compone
 {
 	struct _starpu_worker * worker = _starpu_sched_component_worker_get_worker(worker_component);
 	int workerid = worker->workerid;
-	return _starpu_wake_worker_relax(workerid);
+	return _starpu_wake_worker_relax_light(workerid);
 }
 
 static int simple_worker_push_task(struct starpu_sched_component * component, struct starpu_task *task)