Преглед изворни кода

fix worker_tree collection: one bind id can correspond to several workerids

Andra Hugo пре 11 година
родитељ
комит
df64b8fa75
4 измењених фајлова са 66 додато и 31 уклоњено
  1. 31 10
      src/core/tree.c
  2. 4 6
      src/core/workers.c
  3. 2 2
      src/core/workers.h
  4. 29 13
      src/worker_collection/worker_tree.c

+ 31 - 10
src/core/tree.c

@@ -17,11 +17,18 @@
 #include <stdlib.h>
 #include "starpu_tree.h"
 #include "workers.h"
-
 void starpu_tree_reset_visited(struct starpu_tree *tree, int *visited)
 {
 	if(tree->arity == 0)
-		visited[tree->id] = 0;
+	{
+		int workerids[STARPU_NMAXWORKERS];
+		int nworkers = _starpu_worker_get_workerids(tree->id, workerids);
+		int w;
+		for(w = 0; w < nworkers; w++)
+		{
+			visited[workerids[w]] = 0;
+		}
+	}
 	int i;
 	for(i = 0; i < tree->arity; i++)
 		starpu_tree_reset_visited(tree->nodes[i], visited);
@@ -71,10 +78,17 @@ struct starpu_tree* _get_down_to_leaves(struct starpu_tree *node, int *visited,
 	{
 		if(node->nodes[i]->arity == 0)
 		{
-			/* if it is a valid workerid (bindids can exist on the machine but they may not be used by StarPU) */
-			if(node->nodes[i]->is_pu && _starpu_worker_get_workerid(node->nodes[i]->id) != -1 &&
-			   !visited[node->nodes[i]->id] && present[node->nodes[i]->id] )
-				return node->nodes[i];
+			if(node->nodes[i]->is_pu)
+			{
+				int workerids[STARPU_NMAXWORKERS];
+				int nworkers = _starpu_worker_get_workerids(node->nodes[i]->id, workerids);
+				int w;
+				for(w = 0; w < nworkers; w++)
+				{
+					if(!visited[workerids[w]] && present[workerids[w]])
+						return node->nodes[i];
+				}
+			}
 		}
 		else
 		{
@@ -97,10 +111,17 @@ struct starpu_tree* starpu_tree_get_neighbour(struct starpu_tree *tree, struct s
 		{
 			if(father->nodes[i]->arity == 0)
 			{
-				/* if it is a valid workerid (bindids can exist on the machine but they may not be used by StarPU) */
-				if(father->nodes[i]->is_pu && _starpu_worker_get_workerid(father->nodes[i]->id) != -1 &&
-				   !visited[father->nodes[i]->id] && present[father->nodes[i]->id])
-					return father->nodes[i];
+				if(father->nodes[i]->is_pu)
+				{
+					int workerids[STARPU_NMAXWORKERS];
+					int nworkers = _starpu_worker_get_workerids(father->nodes[i]->id, workerids);
+					int w;
+					for(w = 0; w < nworkers; w++)
+					{
+						if(!visited[workerids[w]] && present[workerids[w]])
+							return father->nodes[i];
+					}
+				}
 			}
 			else
 			{

+ 4 - 6
src/core/workers.c

@@ -1613,17 +1613,15 @@ int starpu_worker_get_bindid(int workerid)
 	return config.workers[workerid].bindid;
 }
 
-int _starpu_worker_get_workerid(int bindid)
+int _starpu_worker_get_workerids(int bindid, int *workerids)
 {
 	unsigned nworkers = starpu_worker_get_count();
-
+	int nw = 0;
 	unsigned id;
 	for (id = 0; id < nworkers; id++)
 		if (config.workers[id].bindid == bindid)
-			return id;
-
-	/* Not found */
-	return -1;
+			workerids[nw++] = id;
+	return nw;
 }
 
 /* Retrieve the status which indicates what the worker is currently doing. */

+ 2 - 2
src/core/workers.h

@@ -410,8 +410,8 @@ int starpu_worker_get_nids_by_type(enum starpu_worker_archtype type, int *worker
    the list might not be updated */
 int starpu_worker_get_nids_ctx_free_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize);
 
-/* geet starpu workerid corresponding to the os physical id bindid */
-int _starpu_worker_get_workerid(int bindid);
+/* geet starpu workerids corresponding to the os physical id bindid */
+int _starpu_worker_get_workerids(int bindid, int *workerids);
 
 /* if the current worker has the lock release it */
 void _starpu_unlock_mutex_if_prev_locked();

+ 29 - 13
src/worker_collection/worker_tree.c

@@ -37,9 +37,18 @@ static unsigned tree_has_next(struct starpu_worker_collection *workers, struct s
 		it->possible_value = NULL;
 		return 0;
 	}
-
-	it->possible_value = neighbour;
-	int id = _starpu_worker_get_workerid(neighbour->id);
+	int id = -1;
+	int workerids[STARPU_NMAXWORKERS];
+	int nworkers = _starpu_worker_get_workerids(neighbour->id, workerids);
+	int w;
+	for(w = 0; w < nworkers; w++)
+	{
+		if(!it->visited[workerids[w]] && workers->present[workerids[w]])
+		{
+			id = workerids[w];
+			it->possible_value = neighbour;
+		}
+	}
 
 	STARPU_ASSERT_MSG(id != -1, "bind id (%d) for workerid (%d) not correct", neighbour->id, id);
 
@@ -62,11 +71,20 @@ static int tree_get_next(struct starpu_worker_collection *workers, struct starpu
 	
 	STARPU_ASSERT_MSG(neighbour, "no element anymore");
 	
-	it->value = neighbour;
-
-	ret = _starpu_worker_get_workerid(neighbour->id);
+	
+	int workerids[STARPU_NMAXWORKERS];
+	int nworkers = _starpu_worker_get_workerids(neighbour->id, workerids);
+	int w;
+	for(w = 0; w < nworkers; w++)
+	{
+		if(!it->visited[workerids[w]] && workers->present[workerids[w]])
+		{
+			ret = workerids[w];
+			it->visited[workerids[w]] = 1;
+			it->value = neighbour;
+		}
+	}
 	STARPU_ASSERT_MSG(ret != -1, "bind id not correct");
-	it->visited[neighbour->id] = 1;
 
 	return ret;
 }
@@ -75,10 +93,9 @@ static int tree_add(struct starpu_worker_collection *workers, int worker)
 {
 	struct starpu_tree *tree = (struct starpu_tree *)workers->workerids;
 
-	int bindid = starpu_worker_get_bindid(worker);
-	if(!workers->present[bindid])
+	if(!workers->present[worker])
 	{
-		workers->present[bindid] = 1;
+		workers->present[worker] = 1;
 		workers->nworkers++;
 		return worker;
 	}
@@ -91,10 +108,9 @@ static int tree_remove(struct starpu_worker_collection *workers, int worker)
 {
 	struct starpu_tree *tree = (struct starpu_tree *)workers->workerids;
 
-	int bindid = starpu_worker_get_bindid(worker);
-	if(workers->present[bindid])
+	if(workers->present[worker])
 	{
-		workers->present[bindid] = 0;
+		workers->present[worker] = 0;
 		workers->nworkers--;
 		return worker;
 	}