소스 검색

add/remove_worker now block workers when they push a task

Simon Archipoff 12 년 전
부모
커밋
147d95be4e
3개의 변경된 파일24개의 추가작업 그리고 9개의 파일을 삭제
  1. 7 1
      src/sched_policies/node_sched.c
  2. 15 8
      src/sched_policies/node_worker.c
  3. 2 0
      src/sched_policies/sched_node.h

+ 7 - 1
src/sched_policies/node_sched.c

@@ -201,7 +201,8 @@ struct starpu_bitmap * _starpu_get_worker_mask(unsigned sched_ctx_id)
 	struct starpu_sched_tree * t = starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	return t->workers;
 }
-
+void _starpu_sched_node_block_worker(int workerid);
+void _starpu_sched_node_unblock_worker(int workerid);
 int starpu_sched_tree_push_task(struct starpu_task * task)
 {
 	unsigned sched_ctx_id = task->sched_ctx;
@@ -209,9 +210,14 @@ int starpu_sched_tree_push_task(struct starpu_task * task)
 	int workerid = starpu_worker_get_id();
 	if(-1 == workerid)
 		STARPU_PTHREAD_RWLOCK_RDLOCK(&tree->lock);
+	else
+		_starpu_sched_node_block_worker(workerid);
+		
 	int ret_val = tree->root->push_task(tree->root,task);
 	if(-1 == workerid)
 		STARPU_PTHREAD_RWLOCK_UNLOCK(&tree->lock);
+	else
+		_starpu_sched_node_unblock_worker(workerid);
 	return ret_val;
 }
 struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx_id)

+ 15 - 8
src/sched_policies/node_worker.c

@@ -356,23 +356,30 @@ void starpu_sched_node_worker_destroy(struct starpu_sched_node *node)
 	_worker_nodes[id] = NULL;
 }
 
+void _starpu_sched_node_block_worker(int workerid)
+{
+	STARPU_ASSERT(0 <= workerid && workerid < starpu_worker_get_count());
+	struct _starpu_worker_node_data * data = starpu_sched_node_worker_create(workerid)->data;
+	STARPU_PTHREAD_MUTEX_LOCK(&data->lock);
+}
+void _starpu_sched_node_unblock_worker(int workerid)
+{
+	STARPU_ASSERT(0 <= workerid && workerid < starpu_worker_get_count());
+	struct _starpu_worker_node_data * data = starpu_sched_node_worker_create(workerid)->data;
+	STARPU_PTHREAD_MUTEX_UNLOCK(&data->lock);
+}
+
 void _starpu_sched_node_lock_all_workers(void)
 {
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count(); i++)
-	{
-		struct _starpu_worker_node_data * data = starpu_sched_node_worker_create(i)->data;
-		STARPU_PTHREAD_MUTEX_LOCK(&data->lock);
-	}
+		_starpu_sched_node_block_worker(i);
 }
 void _starpu_sched_node_unlock_all_workers(void)
 {
 	unsigned i;
 	for(i = 0; i < starpu_worker_get_count(); i++)
-	{
-		struct _starpu_worker_node_data * data = starpu_sched_node_worker_create(i)->data;
-		STARPU_PTHREAD_MUTEX_UNLOCK(&data->lock);
-	}
+		_starpu_sched_node_unblock_worker(i);
 }
 
 

+ 2 - 0
src/sched_policies/sched_node.h

@@ -3,5 +3,7 @@
 
 void _starpu_sched_node_lock_all_workers(void);
 void _starpu_sched_node_unlock_all_workers(void);
+void _starpu_sched_node_block_worker(int workerid);
+void _starpu_sched_node_unblock_worker(int workerid);
 
 #endif