Переглянути джерело

port r15384 from 1.1: Fix waking up barrier counter when it reaches n

Samuel Thibault 10 роки тому
батько
коміт
b19e3f0146
3 змінених файлів з 40 додано та 3 видалено
  1. 35 1
      src/common/barrier_counter.c
  2. 4 1
      src/common/barrier_counter.h
  3. 1 1
      src/core/sched_ctx.c

+ 35 - 1
src/common/barrier_counter.c

@@ -19,6 +19,8 @@
 int _starpu_barrier_counter_init(struct _starpu_barrier_counter *barrier_c, unsigned count)
 {
 	_starpu_barrier_init(&barrier_c->barrier, count);
+	barrier_c->min_threshold = 0;
+	barrier_c->max_threshold = 0;
 	STARPU_PTHREAD_COND_INIT(&barrier_c->cond2, NULL);
 	return 0;
 }
@@ -43,13 +45,33 @@ int _starpu_barrier_counter_wait_for_empty_counter(struct _starpu_barrier_counte
 	return 0;
 }
 
-int _starpu_barrier_counter_wait_until_counter_reaches_n(struct _starpu_barrier_counter *barrier_c, unsigned n)
+int _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n)
 {
 	struct _starpu_barrier *barrier = &barrier_c->barrier;
 	STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex);
 
 	while (barrier->reached_start > n)
+	{
+		if (barrier_c->max_threshold < n)
+			barrier_c->max_threshold = n;
 		STARPU_PTHREAD_COND_WAIT(&barrier->cond, &barrier->mutex);
+	}
+
+	STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex);
+	return 0;
+}
+
+int _starpu_barrier_counter_wait_until_counter_reaches_up_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n)
+{
+	struct _starpu_barrier *barrier = &barrier_c->barrier;
+	STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex);
+
+	while (barrier->reached_start < n)
+	{
+		if (barrier_c->min_threshold > n)
+			barrier_c->min_threshold = n;
+		STARPU_PTHREAD_COND_WAIT(&barrier_c->cond2, &barrier->mutex);
+	}
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex);
 	return 0;
@@ -79,6 +101,12 @@ int _starpu_barrier_counter_decrement_until_empty_counter(struct _starpu_barrier
 		ret = 1;
 		STARPU_PTHREAD_COND_BROADCAST(&barrier->cond);
 	}
+	if (barrier_c->max_threshold && barrier->reached_start == barrier_c->max_threshold)
+	{
+		/* have those not happy enough tell us how much again */
+		barrier_c->max_threshold = 0;
+		STARPU_PTHREAD_COND_BROADCAST(&barrier->cond);
+	}
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex);
 	return ret;
@@ -96,6 +124,12 @@ int _starpu_barrier_counter_increment_until_full_counter(struct _starpu_barrier_
 		ret = 1;
 		STARPU_PTHREAD_COND_BROADCAST(&barrier_c->cond2);
 	}
+	if (barrier_c->min_threshold && barrier->reached_start == barrier_c->min_threshold)
+	{
+		/* have those not happy enough tell us how much again */
+		barrier_c->min_threshold = 0;
+		STARPU_PTHREAD_COND_BROADCAST(&barrier->cond);
+	}
 
 	STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex);
 	return ret;

+ 4 - 1
src/common/barrier_counter.h

@@ -23,6 +23,8 @@
 struct _starpu_barrier_counter
 {
 	struct _starpu_barrier barrier;
+	unsigned min_threshold;
+	unsigned max_threshold;
 	starpu_pthread_cond_t cond2;
 };
 
@@ -32,7 +34,8 @@ int _starpu_barrier_counter_destroy(struct _starpu_barrier_counter *barrier_c);
 
 int _starpu_barrier_counter_wait_for_empty_counter(struct _starpu_barrier_counter *barrier_c);
 
-int _starpu_barrier_counter_wait_until_counter_reaches_n(struct _starpu_barrier_counter *barrier_c, unsigned n);
+int _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n);
+int _starpu_barrier_counter_wait_until_counter_reaches_up_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n);
 
 int _starpu_barrier_counter_wait_for_full_counter(struct _starpu_barrier_counter *barrier_c);
 

+ 1 - 1
src/core/sched_ctx.c

@@ -1196,7 +1196,7 @@ int _starpu_wait_for_n_submitted_tasks_of_sched_ctx(unsigned sched_ctx_id, unsig
 
 	STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_n_submitted_tasks must not be called from a task or callback");
 
-	return _starpu_barrier_counter_wait_until_counter_reaches_n(&sched_ctx->tasks_barrier, n);
+	return _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(&sched_ctx->tasks_barrier, n);
 }
 
 void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id)