Explorar o código

restore lazy evaluation of blocking conditions

Olivier Aumage %!s(int64=7) %!d(string=hai) anos
pai
achega
c13076efdd
Modificáronse 1 ficheiros con 26 adicións e 50 borrados
  1. 26 50
      src/drivers/driver_common/driver_common.c

+ 26 - 50
src/drivers/driver_common/driver_common.c

@@ -391,42 +391,31 @@ struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *worker, int w
 		STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond);
 
 #ifndef STARPU_NON_BLOCKING_DRIVERS
-		int cond_no_keep_awake = !worker->state_keep_awake;
-		int cond_can_block = _starpu_worker_can_block(memnode, worker);
-		int cond_no_last_awake = !_starpu_sched_ctx_last_worker_awake(worker);
-		int cond_no_block_in_parallel_rq = !worker->state_block_in_parallel_req;
-		int cond_no_unblock_in_parallel_rq = !worker->state_unblock_in_parallel_req;
-
-		if (cond_can_block
-			&& cond_no_last_awake
-			&& cond_no_block_in_parallel_rq
-			&& cond_no_unblock_in_parallel_rq)
+		if (_starpu_worker_can_block(memnode, worker)
+			&& !worker->state_block_in_parallel_req
+			&& !worker->state_unblock_in_parallel_req
+			&& !_starpu_sched_ctx_last_worker_awake(worker))
 		{
 			do
 			{
-				//_STARPU_DEBUG("worker %u going to sleep: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
 				STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
-
-				cond_no_keep_awake = !worker->state_keep_awake;
-				cond_can_block = _starpu_worker_can_block(memnode, worker);
-				cond_no_block_in_parallel_rq = !worker->state_block_in_parallel_req;
-				cond_no_unblock_in_parallel_rq = !worker->state_unblock_in_parallel_req;
-				if (cond_no_keep_awake
-					&& cond_can_block
-					&& cond_no_block_in_parallel_rq
-					&& cond_no_unblock_in_parallel_rq)
+				if (!worker->state_keep_awake
+					&& _starpu_worker_can_block(memnode, worker)
+					&& !worker->state_block_in_parallel_req
+					&& !worker->state_unblock_in_parallel_req)
 				{
 					_starpu_worker_set_status_sleeping(workerid);
-					cond_no_last_awake = !_starpu_sched_ctx_last_worker_awake(worker);
+					if (_starpu_sched_ctx_last_worker_awake(worker))
+					{
+						break;
+					}
 				}
 				else
 				{
-					cond_no_last_awake = 0;
 					break;
 				}
 			}
-			while (cond_no_last_awake);
-			//_STARPU_DEBUG("worker %u waking up: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
+			while (1);
 			worker->state_keep_awake = 0;
 			_starpu_worker_set_status_scheduling_done(workerid);
 			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
@@ -434,7 +423,6 @@ struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *worker, int w
 		else
 #endif
 		{
-			//_STARPU_DEBUG("worker %u wont sleep: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
 			_starpu_worker_set_status_scheduling_done(workerid);
 			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
 			if (_starpu_machine_is_running())
@@ -598,49 +586,37 @@ int _starpu_get_multi_worker_task(struct _starpu_worker *workers, struct starpu_
 		_starpu_worker_set_status_sleeping(workerid);
 		_starpu_worker_leave_sched_op(worker);
 
-		int cond_no_keep_awake = 1;
-		int cond_can_block = _starpu_worker_can_block(memnode, worker);
-		int cond_no_last_awake = !_starpu_sched_ctx_last_worker_awake(worker);
-		int cond_no_block_in_parallel_rq = !worker->state_block_in_parallel_req;
-		int cond_no_unblock_in_parallel_rq = !worker->state_unblock_in_parallel_req;
-
-		if (cond_can_block
-			&& cond_no_last_awake
-			&& cond_no_block_in_parallel_rq
-			&& cond_no_unblock_in_parallel_rq)
+		if (_starpu_worker_can_block(memnode, worker)
+			&& !worker->state_block_in_parallel_req
+			&& !worker->state_unblock_in_parallel_req
+			&& !_starpu_sched_ctx_last_worker_awake(worker))
 		{
 			do
 			{
-				//_STARPU_DEBUG("worker %u going to sleep: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
 				STARPU_PTHREAD_COND_WAIT(&worker->sched_cond, &worker->sched_mutex);
-
-				cond_no_keep_awake = !worker->state_keep_awake;
-				cond_can_block = _starpu_worker_can_block(memnode, worker);
-				cond_no_block_in_parallel_rq = !worker->state_block_in_parallel_req;
-				cond_no_unblock_in_parallel_rq = !worker->state_unblock_in_parallel_req;
-				if (cond_no_keep_awake
-					&& cond_can_block
-					&& cond_no_block_in_parallel_rq
-					&& cond_no_unblock_in_parallel_rq)
+				if (!worker->state_keep_awake
+					&& _starpu_worker_can_block(memnode, worker)
+					&& !worker->state_block_in_parallel_req
+					&& !worker->state_unblock_in_parallel_req)
 				{
 					_starpu_worker_set_status_sleeping(workerid);
-					cond_no_last_awake = !_starpu_sched_ctx_last_worker_awake(worker);
+					if (_starpu_sched_ctx_last_worker_awake(worker))
+					{
+						break;
+					}
 				}
 				else
 				{
-					cond_no_last_awake = 0;
 					break;
 				}
 			}
-			while (cond_no_last_awake);
-			//_STARPU_DEBUG("worker %u waking up: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
+			while (1);
 			worker->state_keep_awake = 0;
 			_starpu_worker_set_status_scheduling_done(workerid);
 			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
 		}
 		else
 		{
-			//_STARPU_DEBUG("worker %u wont sleep: %d|%d|%d|%d|%d\n", worker->workerid, cond_no_keep_awake, cond_can_block, cond_no_last_awake, cond_no_block_in_parallel_rq, cond_no_unblock_in_parallel_rq);
 			_starpu_worker_set_status_scheduling_done(workerid);
 			STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(&worker->sched_mutex);
 			if (_starpu_machine_is_running())