浏览代码

do not use tree worker iterators by default, they are too expensive

Samuel Thibault 9 年之前
父节点
当前提交
2d064f8300

+ 7 - 0
doc/doxygen/chapters/40environment_variables.doxy

@@ -214,6 +214,13 @@ starpu_conf::use_explicit_workers_scc_deviceid passed to starpu_init()
 is set.
 </dd>
 
+<dt>STARPU_WORKER_TREE</dt>
+<dd>
+\anchor STARPU_WORKER_TREE
+\addindex __env__STARPU_WORKER_TREE
+Define to 1 to enable the tree iterator in schedulers.
+</dd>
+
 <dt>STARPU_SINGLE_COMBINED_WORKER</dt>
 <dd>
 \anchor STARPU_SINGLE_COMBINED_WORKER

+ 8 - 0
src/core/sched_policy.c

@@ -188,6 +188,14 @@ void _starpu_init_sched_policy(struct _starpu_machine_config *config, struct _st
 
 	load_sched_policy(selected_policy, sched_ctx);
 
+	if (starpu_get_env_number_default("STARPU_WORKER_TREE", 0))
+	{
+#ifdef STARPU_HAVE_HWLOC
+		sched_ctx->sched_policy->worker_type = STARPU_WORKER_TREE;
+#else
+		_STARPU_DISP("STARPU_WORKER_TREE ignored, please rebuild StarPU with hwloc support to enable it.");
+#endif
+	}
 	starpu_sched_ctx_create_worker_collection(sched_ctx->id,
 						  sched_ctx->sched_policy->worker_type);
 

+ 0 - 4
src/sched_policies/eager_central_policy.c

@@ -220,9 +220,5 @@ struct starpu_sched_policy _starpu_sched_eager_policy =
 	.pop_every_task = pop_every_task_eager_policy,
 	.policy_name = "eager",
 	.policy_description = "eager policy with a central queue",
-#ifdef STARPU_HAVE_HWLOC
-	.worker_type = STARPU_WORKER_TREE,
-#else
 	.worker_type = STARPU_WORKER_LIST,
-#endif
 };

+ 0 - 4
src/sched_policies/eager_central_priority_policy.c

@@ -326,9 +326,5 @@ struct starpu_sched_policy _starpu_sched_prio_policy =
 	.pop_every_task = NULL,
 	.policy_name = "prio",
 	.policy_description = "eager (with priorities)",
-#ifdef STARPU_HAVE_HWLOC
-	.worker_type = STARPU_WORKER_TREE,
-#else
 	.worker_type = STARPU_WORKER_LIST,
-#endif
 };

+ 0 - 4
src/sched_policies/heteroprio.c

@@ -661,9 +661,5 @@ struct starpu_sched_policy _starpu_sched_heteroprio_policy =
 	.pop_every_task = NULL,
         .policy_name = "heteroprio",
         .policy_description = "heteroprio",
-#ifdef STARPU_HAVE_HWLOC
-	.worker_type = STARPU_WORKER_TREE,
-#else
 	.worker_type = STARPU_WORKER_LIST,
-#endif
 };

+ 0 - 4
src/sched_policies/work_stealing_policy.c

@@ -533,9 +533,5 @@ struct starpu_sched_policy _starpu_sched_lws_policy =
 	.pop_every_task = NULL,
 	.policy_name = "lws",
 	.policy_description = "locality work stealing",
-#ifdef STARPU_HAVE_HWLOC
-	.worker_type = STARPU_WORKER_TREE,
-#else
 	.worker_type = STARPU_WORKER_LIST,
-#endif
 };

+ 5 - 1
src/worker_collection/worker_list.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2013-2014  Université de Bordeaux
+ * Copyright (C) 2013-2014, 2016  Université de Bordeaux
  * Copyright (C) 2012-2013  CNRS
  * Copyright (C) 2011-2013  INRIA
  *
@@ -17,6 +17,7 @@
  */
 
 #include <starpu.h>
+#include "core/workers.h"
 
 static unsigned list_has_next_unblocked_worker(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it)
 {
@@ -267,6 +268,9 @@ static void list_init_iterator(struct starpu_worker_collection *workers, struct
 static void list_init_iterator_for_parallel_tasks(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it, struct starpu_task *task)
 {
 	list_init_iterator(workers, it);
+	if (_starpu_get_nsched_ctxs() == 1)
+		return;
+
 	it->possibly_parallel = task->possibly_parallel; /* 0/1 => this field indicates if we consider masters only or slaves not blocked too */
 
 	int *workerids = (int *)workers->workerids;

+ 6 - 1
src/worker_collection/worker_tree.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2013  Université de Bordeaux
+ * Copyright (C) 2013, 2016  Université de Bordeaux
  * Copyright (C) 2012-2014  CNRS
  * Copyright (C) 2011-2013  INRIA
  *
@@ -312,6 +312,11 @@ static void tree_init_iterator(struct starpu_worker_collection *workers, struct
 
 static void tree_init_iterator_for_parallel_tasks(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it, struct starpu_task *task)
 {
+	if (_starpu_get_nsched_ctxs() == 1)
+	{
+		tree_init_iterator(workers, it);
+		return;
+	}
 	tree_init_iterator(workers, it);
 	it->possibly_parallel = task->possibly_parallel;
 	int i;