浏览代码

do not take the mutex if the current worker is calling the code

Andra Hugo 11 年之前
父节点
当前提交
6266721e89
共有 2 个文件被更改,包括 19 次插入10 次删除
  1. 11 5
      src/core/sched_ctx.c
  2. 8 5
      src/sched_policies/eager_central_policy.c

+ 11 - 5
src/core/sched_ctx.c

@@ -134,14 +134,15 @@ void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id)
 {
 	struct _starpu_worker *worker = _starpu_get_worker_struct(workerid);
 	struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
+	int curr_workerid = starpu_worker_get_id();
 	/* if is the initial sched_ctx no point in taking the mutex, the workers are
-	   not launched yet */
-	if(!sched_ctx->is_initial_sched)
+	   not launched yet, or if the current worker is calling this */
+	if(!sched_ctx->is_initial_sched && workerid != curr_workerid)
 		STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex);
 
 	worker->shares_tasks_lists[sched_ctx_id] = 1;
 
-	if(!sched_ctx->is_initial_sched)
+	if(!sched_ctx->is_initial_sched && workerid != curr_workerid)
 		STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex);
 }
 
@@ -166,10 +167,15 @@ static void _starpu_add_workers_to_sched_ctx(struct _starpu_sched_ctx *sched_ctx
 				added_workers[(*n_added_workers)++] = worker;
 			else
 			{
+				int curr_workerid = starpu_worker_get_id();
 				struct _starpu_worker *worker_str = _starpu_get_worker_struct(workerids[i]);
-				STARPU_PTHREAD_MUTEX_LOCK(&worker_str->sched_mutex);
+				if(curr_workerid != workerids[i])
+					STARPU_PTHREAD_MUTEX_LOCK(&worker_str->sched_mutex);
+
 				worker_str->removed_from_ctx[sched_ctx->id] = 0;
-				STARPU_PTHREAD_MUTEX_UNLOCK(&worker_str->sched_mutex);
+
+				if(curr_workerid != workerids[i])
+					STARPU_PTHREAD_MUTEX_UNLOCK(&worker_str->sched_mutex);
 			}
 		}
 		else

+ 8 - 5
src/sched_policies/eager_central_policy.c

@@ -175,13 +175,16 @@ static void eager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nw
 	for (i = 0; i < nworkers; i++)
 	{
 		workerid = workerids[i];
-		starpu_pthread_mutex_t *sched_mutex;
-		starpu_pthread_cond_t *sched_cond;
-		starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond);
-		starpu_wakeup_worker(workerid, sched_cond, sched_mutex);
+		int curr_workerid = starpu_worker_get_id();
+		if(workerid != curr_workerid)
+		{
+			starpu_pthread_mutex_t *sched_mutex;
+			starpu_pthread_cond_t *sched_cond;
+			starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond);
+			starpu_wakeup_worker(workerid, sched_cond, sched_mutex);
+		}
 
 		starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id);
-
 	}
 }