Quellcode durchsuchen

enter relaxed section when acquiring the fifo component lock on push also

Olivier Aumage vor 8 Jahren
Ursprung
Commit
7bcdfb8ec5
2 geänderte Dateien mit 24 neuen und 1 gelöschten Zeilen
  1. 10 0
      src/core/workers.h
  2. 14 1
      src/sched_policies/component_fifo.c

+ 10 - 0
src/core/workers.h

@@ -922,6 +922,16 @@ static inline void _starpu_worker_leave_section_safe_for_observation(void)
 	STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
 }
 
+static inline int _starpu_worker_get_observation_safe_state(void)
+{
+	int workerid = starpu_worker_get_id();
+	if (workerid < 0)
+		return 1;
+	struct _starpu_worker *worker = _starpu_get_worker_struct(workerid);
+	STARPU_ASSERT(worker != NULL);
+	return worker->state_safe_for_observation;
+}
+
 static inline void _starpu_worker_lock_self(void)
 {
 	int workerid = starpu_worker_get_id_check();

+ 14 - 1
src/sched_policies/component_fifo.c

@@ -61,11 +61,16 @@ static double fifo_estimated_load(struct starpu_sched_component * component)
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	double relative_speedup = 0.0;
 	double load = starpu_sched_component_estimated_load(component);
+	const int relaxed_state = _starpu_worker_get_observation_safe_state();
 	if(STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component))
 	{
 		int first_worker = starpu_bitmap_first(component->workers_in_ctx);
 		relative_speedup = starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(first_worker, component->tree->sched_ctx_id));
+		if (!relaxed_state)
+			_starpu_worker_enter_section_safe_for_observation();
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
+		if (!relaxed_state)
+			_starpu_worker_leave_section_safe_for_observation();
 		load += fifo->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 		return load;
@@ -79,7 +84,11 @@ static double fifo_estimated_load(struct starpu_sched_component * component)
 			relative_speedup += starpu_worker_get_relative_speedup(starpu_worker_get_perf_archtype(i, component->tree->sched_ctx_id));
 		relative_speedup /= starpu_bitmap_cardinal(component->workers_in_ctx);
 		STARPU_ASSERT(!_STARPU_IS_ZERO(relative_speedup));
+		if (!relaxed_state)
+			_starpu_worker_enter_section_safe_for_observation();
 		STARPU_PTHREAD_MUTEX_LOCK(mutex);
+		if (!relaxed_state)
+			_starpu_worker_leave_section_safe_for_observation();
 		load += fifo->ntasks / relative_speedup;
 		STARPU_PTHREAD_MUTEX_UNLOCK(mutex);
 	}
@@ -94,8 +103,12 @@ static int fifo_push_local_task(struct starpu_sched_component * component, struc
 	struct _starpu_fifo_taskq * fifo = data->fifo;
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	int ret = 0;
-
+	const int relaxed_state = _starpu_worker_get_observation_safe_state();
+	if (!relaxed_state)
+		_starpu_worker_enter_section_safe_for_observation();
 	STARPU_PTHREAD_MUTEX_LOCK(mutex);
+	if (!relaxed_state)
+		_starpu_worker_leave_section_safe_for_observation();
 	double exp_len;
 	if(!isnan(task->predicted))
 		exp_len = fifo->exp_len + task->predicted;