From fa491537c94f1601b3095b0198dba33ea98fbdbf Mon Sep 17 00:00:00 2001 From: "Peter W. Draper" <p.w.draper@durham.ac.uk> Date: Wed, 12 Oct 2016 15:44:52 +0100 Subject: [PATCH] Fix up recv/send tasks activation to get MPI working, same for fixdt free tid_active when finished --- src/engine.c | 26 ++++++++++++++------------ src/scheduler.c | 1 + 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/engine.c b/src/engine.c index ec34843181..a41659ada3 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1959,13 +1959,14 @@ void engine_marktasks_fixdt_mapper(void *map_data, int num_elements, void *extra_data) { /* Unpack the arguments. */ struct task *tasks = (struct task *)map_data; - int *rebuild_space = (int *)extra_data; + size_t *rebuild_space = &((size_t *)extra_data)[0]; + struct scheduler *s = (struct scheduler *)(((size_t *)extra_data)[1]); for (int ind = 0; ind < num_elements; ind++) { struct task *t = &tasks[ind]; /* All tasks are unskipped (we skip by default). */ - t->skip = 0; + scheduler_activate(s, t); /* Pair? */ if (t->type == task_type_pair || t->type == task_type_sub_pair) { @@ -2060,9 +2061,9 @@ void engine_marktasks_mapper(void *map_data, int num_elements, if (ci->nodeID != engine_rank) { /* Activate the tasks to recv foreign cell ci's data. */ - ci->recv_xv->skip = 0; - ci->recv_rho->skip = 0; - ci->recv_ti->skip = 0; + scheduler_activate(s, ci->recv_xv); + scheduler_activate(s, ci->recv_rho); + scheduler_activate(s, ci->recv_ti); /* Look for the local cell cj's send tasks. */ struct link *l = NULL; @@ -2087,9 +2088,10 @@ void engine_marktasks_mapper(void *map_data, int num_elements, } else if (cj->nodeID != engine_rank) { /* Activate the tasks to recv foreign cell cj's data. */ - cj->recv_xv->skip = 0; - cj->recv_rho->skip = 0; - cj->recv_ti->skip = 0; + scheduler_activate(s, cj->recv_xv); + scheduler_activate(s, cj->recv_rho); + scheduler_activate(s, cj->recv_ti); + /* Look for the local cell ci's send tasks. */ struct link *l = NULL; for (l = ci->send_xv; l != NULL && l->t->cj->nodeID != cj->nodeID; @@ -2139,18 +2141,19 @@ int engine_marktasks(struct engine *e) { struct scheduler *s = &e->sched; const ticks tic = getticks(); int rebuild_space = 0; - + /* Much less to do here if we're on a fixed time-step. */ if (e->policy & engine_policy_fixdt) { /* Run through the tasks and mark as skip or not. */ + size_t extra_data[2] = {rebuild_space, (size_t)&e->sched}; threadpool_map(&e->threadpool, engine_marktasks_fixdt_mapper, s->tasks, - s->nr_tasks, sizeof(struct task), 1000, &rebuild_space); + s->nr_tasks, sizeof(struct task), 1000, extra_data); return rebuild_space; /* Multiple-timestep case */ } else { - + /* Run through the tasks and mark as skip or not. */ size_t extra_data[3] = {e->ti_current, rebuild_space, (size_t)&e->sched}; threadpool_map(&e->threadpool, engine_marktasks_mapper, s->tasks, @@ -2634,7 +2637,6 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs) { } /* Now, launch the calculation */ - engine_print_task_counts(e); TIMER_TIC; engine_launch(e, e->nr_threads, mask, submask); TIMER_TOC(timer_runners); diff --git a/src/scheduler.c b/src/scheduler.c index 5eca53f6a2..b4e2575807 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1515,6 +1515,7 @@ void scheduler_clean(struct scheduler *s) { free(s->tasks_ind); free(s->unlocks); free(s->unlock_ind); + free(s->tid_active); for (int i = 0; i < s->nr_queues; ++i) queue_clean(&s->queues[i]); free(s->queues); } -- GitLab