瀏覽代碼

Make starpu_worker_get_id_check public

Samuel Thibault 9 年之前
父節點
當前提交
943b5d56bf

+ 1 - 0
ChangeLog

@@ -186,6 +186,7 @@ Small features:
   * Add starpu_task_list_ismember.
   * Add _starpu_fifo_pop_this_task.
   * Add STARPU_MAX_MEMORY_USE environment variable.
+  * Add starpu_worker_get_id_check().
 
 Changes:
   * Data interfaces (variable, vector, matrix and block) now define

+ 5 - 0
doc/doxygen/chapters/api/workers.doxy

@@ -154,6 +154,11 @@ the one associated to the calling thread. The returned value is either
 from the application outside a task or a callback), or an integer
 between 0 and starpu_worker_get_count() - 1.
 
+\fn unsigned starpu_worker_get_id_check(void)
+\ingroup API_Workers_Properties
+This is the same as starpu_worker_get_id, but aborts when called from outside a
+worker (i.e. when starpu_worker_get_id() would return -1).
+
 \fn int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize)
 \ingroup API_Workers_Properties
 This function gets the list of identifiers of workers with the

+ 3 - 0
include/starpu_worker.h

@@ -91,6 +91,9 @@ unsigned starpu_scc_worker_get_count(void);
 unsigned starpu_mic_device_get_count(void);
 
 int starpu_worker_get_id(void);
+unsigned _starpu_worker_get_id_check(const char *f, int l);
+unsigned starpu_worker_get_id_check(void);
+#define starpu_worker_get_id_check() _starpu_worker_get_id_check(__FILE__, __LINE__)
 int starpu_worker_get_bindid(int workerid);
 
 int starpu_combined_worker_get_id(void);

+ 8 - 0
src/core/workers.c

@@ -1686,6 +1686,14 @@ int starpu_worker_get_id(void)
 }
 #define starpu_worker_get_id _starpu_worker_get_id
 
+#undef _starpu_worker_get_id_check
+unsigned _starpu_worker_get_id_check(const char *f, int l)
+{
+	int id = _starpu_worker_get_id();
+	STARPU_ASSERT_MSG(id>=0, "%s:%u Cannot be called from outside a worker\n", f, l);
+	return id;
+}
+
 int starpu_combined_worker_get_id(void)
 {
 	struct _starpu_worker *worker;

+ 2 - 2
src/core/workers.h

@@ -559,12 +559,12 @@ static inline int _starpu_worker_get_id(void)
 #define starpu_worker_get_id _starpu_worker_get_id
 
 /* Similar behaviour to starpu_worker_get_id() but fails when called from outside a worker */
-static inline unsigned __starpu_worker_get_id_check(char *f, int l)
+static inline unsigned __starpu_worker_get_id_check(const char *f, int l)
 {
 	int id = starpu_worker_get_id();
 	STARPU_ASSERT_MSG(id>=0, "%s:%u Cannot be called from outside a worker\n", f, l);
 	return id;
 }
-#define _starpu_worker_get_id_check() __starpu_worker_get_id_check(__FILE__, __LINE__)
+#define _starpu_worker_get_id_check(f,l) __starpu_worker_get_id_check(f,l)
 
 #endif // __WORKERS_H__

+ 1 - 1
src/sched_policies/component_best_implementation.c

@@ -102,7 +102,7 @@ static struct starpu_task * best_implementation_pull_task(struct starpu_sched_co
 	}
 	if(task)
 		/* this worker can execute this task as it was returned by a pop*/
-		(void)find_best_impl(component->tree->sched_ctx_id, task, _starpu_worker_get_id_check());
+		(void)find_best_impl(component->tree->sched_ctx_id, task, starpu_worker_get_id_check());
 	return task;
 }
 

+ 1 - 1
src/sched_policies/component_fifo.c

@@ -163,7 +163,7 @@ static struct starpu_task * fifo_pull_task(struct starpu_sched_component * compo
 	struct _starpu_fifo_taskq * fifo = data->fifo;
 	starpu_pthread_mutex_t * mutex = &data->mutex;
 	STARPU_PTHREAD_MUTEX_LOCK(mutex);
-	struct starpu_task * task = _starpu_fifo_pop_task(fifo, _starpu_worker_get_id_check());
+	struct starpu_task * task = _starpu_fifo_pop_task(fifo, starpu_worker_get_id_check());
 	if(task)
 	{
 		if(!isnan(task->predicted))

+ 1 - 1
src/sched_policies/component_sched.c

@@ -350,7 +350,7 @@ int starpu_sched_component_push_task(struct starpu_sched_component *from STARPU_
 
 struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct starpu_sched_component * component = starpu_sched_component_worker_get(sched_ctx, workerid);
 
 	/* _starpu_sched_component_lock_worker(workerid) is called by component->pull_task()

+ 1 - 1
src/sched_policies/component_work_stealing.c

@@ -120,7 +120,7 @@ static int is_worker_of_component(struct starpu_sched_component * component, int
 
 static struct starpu_task * pull_task(struct starpu_sched_component * component)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	int i;
 	for(i = 0; i < component->nchildren; i++)
 	{

+ 6 - 6
src/sched_policies/component_worker.c

@@ -150,8 +150,8 @@ static struct _starpu_task_grid * _starpu_task_grid_create(void)
 
 static struct _starpu_worker_task_list * _worker_get_list(unsigned sched_ctx_id)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
-	STARPU_ASSERT(workerid < (int) starpu_worker_get_count());
+	unsigned workerid = starpu_worker_get_id_check();
+	STARPU_ASSERT(workerid < starpu_worker_get_count());
 	struct _starpu_worker_component_data * d = starpu_sched_component_worker_get(sched_ctx_id, workerid)->data;
 	return d->list;
 }
@@ -342,7 +342,7 @@ void _starpu_sched_component_unlock_worker(unsigned sched_ctx_id, int workerid)
  */
 static void _starpu_sched_component_worker_lock_scheduling(unsigned sched_ctx_id)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	starpu_pthread_mutex_t *sched_mutex;
 	starpu_pthread_cond_t *sched_cond;
 	starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond);
@@ -356,7 +356,7 @@ static void _starpu_sched_component_worker_lock_scheduling(unsigned sched_ctx_id
 
 static void _starpu_sched_component_worker_unlock_scheduling(unsigned sched_ctx_id)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	starpu_pthread_mutex_t *sched_mutex;
 	starpu_pthread_cond_t *sched_cond;
 	starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond);
@@ -482,7 +482,7 @@ static int simple_worker_push_task(struct starpu_sched_component * component, st
 
 static struct starpu_task * simple_worker_pull_task(struct starpu_sched_component *component)
 {
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_worker_component_data * data = component->data;
 	struct _starpu_worker_task_list * list = data->list;
 	STARPU_PTHREAD_MUTEX_LOCK(&list->mutex);
@@ -640,7 +640,7 @@ static void combined_worker_can_pull(struct starpu_sched_component * component)
 	(void) component;
 	STARPU_ASSERT(starpu_sched_component_is_combined_worker(component));
 	struct _starpu_worker_component_data * data = component->data;
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	int i;
 	for(i = 0; i < data->combined_worker->worker_size; i++)
 	{

+ 5 - 5
src/sched_policies/deque_modeling_policy_data_aware.c

@@ -185,7 +185,7 @@ static struct starpu_task *dmda_pop_ready_task(unsigned sched_ctx_id)
 
 	struct starpu_task *task;
 
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid];
 
 	unsigned node = starpu_worker_get_memory_node(workerid);
@@ -234,7 +234,7 @@ static struct starpu_task *dmda_pop_task(unsigned sched_ctx_id)
 
 	struct starpu_task *task;
 
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid];
 
 	STARPU_ASSERT_MSG(fifo, "worker %d does not belong to ctx %d anymore.\n", workerid, sched_ctx_id);
@@ -285,7 +285,7 @@ static struct starpu_task *dmda_pop_every_task(unsigned sched_ctx_id)
 
 	struct starpu_task *new_list;
 
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid];
 
 	starpu_pthread_mutex_t *sched_mutex;
@@ -1059,7 +1059,7 @@ static void deinitialize_dmda_policy(unsigned sched_ctx_id)
 static void dmda_pre_exec_hook(struct starpu_task *task)
 {
 	unsigned sched_ctx_id = starpu_sched_ctx_get_ctx_for_task(task);
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid];
 	double model = task->predicted;
@@ -1172,7 +1172,7 @@ static void dmda_post_exec_hook(struct starpu_task * task)
 {
 	unsigned sched_ctx_id = starpu_sched_ctx_get_ctx_for_task(task);
 	struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid];
 	starpu_pthread_mutex_t *sched_mutex;
 	starpu_pthread_cond_t *sched_cond;

+ 2 - 2
src/sched_policies/eager_central_policy.c

@@ -137,7 +137,7 @@ static int push_task_eager_policy(struct starpu_task *task)
 static struct starpu_task *pop_every_task_eager_policy(unsigned sched_ctx_id)
 {
 	struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex);
 	struct starpu_task* task = _starpu_fifo_pop_every_task(data->fifo, workerid);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex);
@@ -150,7 +150,7 @@ static struct starpu_task *pop_every_task_eager_policy(unsigned sched_ctx_id)
 static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id)
 {
 	struct starpu_task *chosen_task = NULL;
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
 	/* block until some event happens */

+ 1 - 1
src/sched_policies/eager_central_priority_policy.c

@@ -189,7 +189,7 @@ static int _starpu_priority_push_task(struct starpu_task *task)
 static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id)
 {
 	struct starpu_task *chosen_task = NULL, *task, *nexttask;
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	int skipped = 0;
 
 	struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);

+ 1 - 1
src/sched_policies/graph_test_policy.c

@@ -283,7 +283,7 @@ static int push_task_graph_test_policy(struct starpu_task *task)
 static struct starpu_task *pop_task_graph_test_policy(unsigned sched_ctx_id)
 {
 	struct starpu_task *chosen_task = NULL;
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_graph_test_policy_data *data = (struct _starpu_graph_test_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	struct _starpu_prio_deque *prio;
 

+ 1 - 1
src/sched_policies/heteroprio.c

@@ -448,7 +448,7 @@ static int push_task_heteroprio_policy(struct starpu_task *task)
 
 static struct starpu_task *pop_task_heteroprio_policy(unsigned sched_ctx_id)
 {
-	const unsigned workerid = _starpu_worker_get_id_check();
+	const unsigned workerid = starpu_worker_get_id_check();
 	struct _starpu_heteroprio_data *hp = (struct _starpu_heteroprio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 	struct _heteroprio_worker_wrapper* worker = &hp->workers_heteroprio[workerid];
 

+ 1 - 1
src/sched_policies/parallel_eager.c

@@ -182,7 +182,7 @@ static struct starpu_task *pop_task_peager_policy(unsigned sched_ctx_id)
 {
 	struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 
 	/* If this is not a CPU or a MIC, then the worker simply grabs tasks from the fifo */
 	if (starpu_worker_get_type(workerid) != STARPU_CPU_WORKER && starpu_worker_get_type(workerid) != STARPU_MIC_WORKER)

+ 1 - 1
src/sched_policies/parallel_heft.c

@@ -76,7 +76,7 @@ static void parallel_heft_pre_exec_hook(struct starpu_task *task)
 	if (!task->cl || task->execute_on_a_specific_worker)
 		return;
 
-	unsigned workerid = _starpu_worker_get_id_check();
+	unsigned workerid = starpu_worker_get_id_check();
 	double model = task->predicted;
 	double transfer_model = task->predicted_transfer;
 

+ 1 - 1
src/sched_policies/work_stealing_policy.c

@@ -525,7 +525,7 @@ static struct starpu_task *ws_pop_task(unsigned sched_ctx_id)
 	struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id);
 
 	struct starpu_task *task;
-	int workerid = _starpu_worker_get_id_check();
+	int workerid = starpu_worker_get_id_check();
 
 	task = ws_pick_task(workerid, workerid, sched_ctx_id);
 	if (task)