diff --git a/src/engine.c b/src/engine.c index 84ad45d284af5fa33d6fd7d00361e608e3ad3749..85a6e6fb3ec7b001397e30a2a288a13587328b90 100644 --- a/src/engine.c +++ b/src/engine.c @@ -2506,11 +2506,8 @@ void engine_print_stats(struct engine *e) { * * @param e The #engine. * @param nr_runners The number of #runner to let loose. - * @param mask The task mask to launch. - * @param submask The sub-task mask to launch. */ -void engine_launch(struct engine *e, int nr_runners, unsigned int mask, - unsigned int submask) { +void engine_launch(struct engine *e, int nr_runners) { const ticks tic = getticks(); @@ -2525,7 +2522,7 @@ void engine_launch(struct engine *e, int nr_runners, unsigned int mask, /* Load the tasks. */ pthread_mutex_unlock(&e->barrier_mutex); - scheduler_start(&e->sched, mask, submask); + scheduler_start(&e->sched); pthread_mutex_lock(&e->barrier_mutex); /* Remove the safeguard. */ @@ -2565,61 +2562,60 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs) { engine_marktasks(e); - /* Build the masks corresponding to the policy */ - unsigned int mask = 0; - unsigned int submask = 0; + /* /\* Build the masks corresponding to the policy *\/ */ + /* unsigned int mask = 0; */ + /* unsigned int submask = 0; */ - /* We always have sort tasks */ - mask |= 1 << task_type_sort; - mask |= 1 << task_type_init; + /* /\* We always have sort tasks *\/ */ + /* mask |= 1 << task_type_sort; */ + /* mask |= 1 << task_type_init; */ - /* Add the tasks corresponding to hydro operations to the masks */ - if (e->policy & engine_policy_hydro) { + /* /\* Add the tasks corresponding to hydro operations to the masks *\/ */ + /* if (e->policy & engine_policy_hydro) { */ + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_pair; */ + /* mask |= 1 << task_type_sub_self; */ + /* mask |= 1 << task_type_sub_pair; */ + /* mask |= 1 << task_type_ghost; */ - mask |= 1 << task_type_self; - mask |= 1 << task_type_pair; - mask |= 1 << task_type_sub_self; - mask |= 1 << task_type_sub_pair; - mask |= 1 << task_type_ghost; + /* submask |= 1 << task_subtype_density; */ + /* } */ - submask |= 1 << task_subtype_density; - } + /* /\* Add the tasks corresponding to self-gravity to the masks *\/ */ + /* if (e->policy & engine_policy_self_gravity) { */ - /* Add the tasks corresponding to self-gravity to the masks */ - if (e->policy & engine_policy_self_gravity) { + /* mask |= 1 << task_type_grav_up; */ + /* mask |= 1 << task_type_grav_mm; */ + /* mask |= 1 << task_type_grav_gather_m; */ + /* mask |= 1 << task_type_grav_fft; */ + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_pair; */ + /* mask |= 1 << task_type_sub_self; */ + /* mask |= 1 << task_type_sub_pair; */ - mask |= 1 << task_type_grav_up; - mask |= 1 << task_type_grav_mm; - mask |= 1 << task_type_grav_gather_m; - mask |= 1 << task_type_grav_fft; - mask |= 1 << task_type_self; - mask |= 1 << task_type_pair; - mask |= 1 << task_type_sub_self; - mask |= 1 << task_type_sub_pair; + /* submask |= 1 << task_subtype_grav; */ + /* } */ - submask |= 1 << task_subtype_grav; - } + /* /\* Add the tasks corresponding to external gravity to the masks *\/ */ + /* if (e->policy & engine_policy_external_gravity) { */ - /* Add the tasks corresponding to external gravity to the masks */ - if (e->policy & engine_policy_external_gravity) { + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_sub_self; */ - mask |= 1 << task_type_self; - mask |= 1 << task_type_sub_self; + /* submask |= 1 << task_subtype_external_grav; */ + /* } */ - submask |= 1 << task_subtype_external_grav; - } + /* /\* Add MPI tasks if need be *\/ */ + /* if (e->policy & engine_policy_mpi) { */ - /* Add MPI tasks if need be */ - if (e->policy & engine_policy_mpi) { - - mask |= 1 << task_type_send; - mask |= 1 << task_type_recv; - submask |= 1 << task_subtype_tend; - } + /* mask |= 1 << task_type_send; */ + /* mask |= 1 << task_type_recv; */ + /* submask |= 1 << task_subtype_tend; */ + /* } */ /* Now, launch the calculation */ TIMER_TIC; - engine_launch(e, e->nr_threads, mask, submask); + engine_launch(e, e->nr_threads); TIMER_TOC(timer_runners); /* Apply some conversions (e.g. internal energy -> entropy) */ @@ -2629,8 +2625,7 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs) { space_map_cells_pre(s, 0, cell_convert_hydro, NULL); /* Correct what we did (e.g. in PE-SPH, need to recompute rho_bar) */ - if (hydro_need_extra_init_loop) - engine_launch(e, e->nr_threads, mask, submask); + if (hydro_need_extra_init_loop) engine_launch(e, e->nr_threads); } clocks_gettime(&time2); @@ -2707,7 +2702,7 @@ void engine_step(struct engine *e) { /* Drift only the necessary particles, that means all particles * if we are about to repartition. */ - int repart = (e->forcerepart != REPART_NONE); + const int repart = (e->forcerepart != REPART_NONE); e->drift_all = repart || e->drift_all; engine_drift(e); @@ -2720,85 +2715,85 @@ void engine_step(struct engine *e) { /* Restore the default drifting policy */ e->drift_all = (e->policy & engine_policy_drift_all); - /* Build the masks corresponding to the policy */ - unsigned int mask = 0, submask = 0; + /* /\* Build the masks corresponding to the policy *\/ */ + /* unsigned int mask = 0, submask = 0; */ - /* We always have sort tasks and init tasks */ - mask |= 1 << task_type_sort; - mask |= 1 << task_type_init; + /* /\* We always have sort tasks and init tasks *\/ */ + /* mask |= 1 << task_type_sort; */ + /* mask |= 1 << task_type_init; */ - /* Add the correct kick task */ - if (e->policy & engine_policy_fixdt) { - mask |= 1 << task_type_kick_fixdt; - } else { - mask |= 1 << task_type_kick; - } + /* /\* Add the correct kick task *\/ */ + /* if (e->policy & engine_policy_fixdt) { */ + /* mask |= 1 << task_type_kick_fixdt; */ + /* } else { */ + /* mask |= 1 << task_type_kick; */ + /* } */ - /* Add the tasks corresponding to hydro operations to the masks */ - if (e->policy & engine_policy_hydro) { + /* /\* Add the tasks corresponding to hydro operations to the masks *\/ */ + /* if (e->policy & engine_policy_hydro) { */ - mask |= 1 << task_type_self; - mask |= 1 << task_type_pair; - mask |= 1 << task_type_sub_self; - mask |= 1 << task_type_sub_pair; - mask |= 1 << task_type_ghost; + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_pair; */ + /* mask |= 1 << task_type_sub_self; */ + /* mask |= 1 << task_type_sub_pair; */ + /* mask |= 1 << task_type_ghost; */ - submask |= 1 << task_subtype_density; - submask |= 1 << task_subtype_force; + /* submask |= 1 << task_subtype_density; */ + /* submask |= 1 << task_subtype_force; */ -#ifdef EXTRA_HYDRO_LOOP - mask |= 1 << task_type_extra_ghost; - submask |= 1 << task_subtype_gradient; -#endif - } + /* #ifdef EXTRA_HYDRO_LOOP */ + /* mask |= 1 << task_type_extra_ghost; */ + /* submask |= 1 << task_subtype_gradient; */ + /* #endif */ + /* } */ - /* Add the tasks corresponding to self-gravity to the masks */ - if (e->policy & engine_policy_self_gravity) { + /* /\* Add the tasks corresponding to self-gravity to the masks *\/ */ + /* if (e->policy & engine_policy_self_gravity) { */ - mask |= 1 << task_type_grav_up; - mask |= 1 << task_type_grav_mm; - mask |= 1 << task_type_grav_gather_m; - mask |= 1 << task_type_grav_fft; - mask |= 1 << task_type_self; - mask |= 1 << task_type_pair; - mask |= 1 << task_type_sub_self; - mask |= 1 << task_type_sub_pair; + /* mask |= 1 << task_type_grav_up; */ + /* mask |= 1 << task_type_grav_mm; */ + /* mask |= 1 << task_type_grav_gather_m; */ + /* mask |= 1 << task_type_grav_fft; */ + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_pair; */ + /* mask |= 1 << task_type_sub_self; */ + /* mask |= 1 << task_type_sub_pair; */ - submask |= 1 << task_subtype_grav; - } + /* submask |= 1 << task_subtype_grav; */ + /* } */ - /* Add the tasks corresponding to external gravity to the masks */ - if (e->policy & engine_policy_external_gravity) { + /* /\* Add the tasks corresponding to external gravity to the masks *\/ */ + /* if (e->policy & engine_policy_external_gravity) { */ - mask |= 1 << task_type_self; - mask |= 1 << task_type_sub_self; + /* mask |= 1 << task_type_self; */ + /* mask |= 1 << task_type_sub_self; */ - submask |= 1 << task_subtype_external_grav; - } + /* submask |= 1 << task_subtype_external_grav; */ + /* } */ - /* Add the tasks corresponding to cooling to the masks */ - if (e->policy & engine_policy_cooling) { - mask |= 1 << task_type_cooling; - } + /* /\* Add the tasks corresponding to cooling to the masks *\/ */ + /* if (e->policy & engine_policy_cooling) { */ + /* mask |= 1 << task_type_cooling; */ + /* } */ - /* Add the tasks corresponding to sourceterms to the masks */ - if (e->policy & engine_policy_sourceterms) { - mask |= 1 << task_type_sourceterms; - } + /* /\* Add the tasks corresponding to sourceterms to the masks *\/ */ + /* if (e->policy & engine_policy_sourceterms) { */ + /* mask |= 1 << task_type_sourceterms; */ + /* } */ - /* Add MPI tasks if need be */ - if (e->policy & engine_policy_mpi) { + /* /\* Add MPI tasks if need be *\/ */ + /* if (e->policy & engine_policy_mpi) { */ - mask |= 1 << task_type_send; - mask |= 1 << task_type_recv; - submask |= 1 << task_subtype_tend; - } + /* mask |= 1 << task_type_send; */ + /* mask |= 1 << task_type_recv; */ + /* submask |= 1 << task_subtype_tend; */ + /* } */ if (e->verbose) engine_print_task_counts(e); /* Send off the runners. */ TIMER_TIC; - engine_launch(e, e->nr_threads, mask, submask); + engine_launch(e, e->nr_threads); TIMER_TOC(timer_runners); /* Save some statistics */ diff --git a/src/engine.h b/src/engine.h index ec9e16553c3172f22e9bfe60971163488947a47e..1ec0ca2fd03ddda98b484eede02b9cd53692cf8a 100644 --- a/src/engine.h +++ b/src/engine.h @@ -230,8 +230,7 @@ void engine_init(struct engine *e, struct space *s, const struct external_potential *potential, const struct cooling_function_data *cooling, struct sourceterms *sourceterms); -void engine_launch(struct engine *e, int nr_runners, unsigned int mask, - unsigned int submask); +void engine_launch(struct engine *e, int nr_runners); void engine_prepare(struct engine *e, int nodrift); void engine_print(struct engine *e); void engine_init_particles(struct engine *e, int flag_entropy_ICs); diff --git a/src/scheduler.c b/src/scheduler.c index 44790fcd2fa5f67e6f325ba5849da19e35ab285a..3b87357bf85896d28d32708a3b1cc2ddffa0877f 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -888,8 +888,6 @@ void scheduler_reset(struct scheduler *s, int size) { s->nr_tasks = 0; s->tasks_next = 0; s->waiting = 0; - s->mask = 0; - s->submask = 0; s->nr_unlocks = 0; s->completed_unlock_writes = 0; s->active_count = 0; @@ -996,15 +994,12 @@ void scheduler_reweight(struct scheduler *s, int verbose) { void scheduler_rewait_mapper(void *map_data, int num_elements, void *extra_data) { - struct scheduler *s = (struct scheduler *)extra_data; struct task *tasks = (struct task *)map_data; for (int ind = 0; ind < num_elements; ind++) { struct task *t = &tasks[ind]; - if (t->skip || !((1 << t->type) & s->mask) || - !((1 << t->subtype) & s->submask)) - continue; + if (t->skip) continue; /* Skip sort tasks that have already been performed */ if (t->type == task_type_sort && t->flags == 0) { @@ -1026,8 +1021,7 @@ void scheduler_enqueue_mapper(void *map_data, int num_elements, struct task *tasks = s->tasks; for (int ind = 0; ind < num_elements; ind++) { struct task *t = &tasks[tid[ind]]; - if (atomic_dec(&t->wait) == 1 && !t->skip && ((1 << t->type) & s->mask) && - ((1 << t->subtype) & s->submask)) { + if (atomic_dec(&t->wait) == 1 && !t->skip) { scheduler_enqueue(s, t); } } @@ -1038,16 +1032,8 @@ void scheduler_enqueue_mapper(void *map_data, int num_elements, * @brief Start the scheduler, i.e. fill the queues with ready tasks. * * @param s The #scheduler. - * @param mask The task types to enqueue. - * @param submask The sub-task types to enqueue. */ - -void scheduler_start(struct scheduler *s, unsigned int mask, - unsigned int submask) { - - /* Store the masks */ - s->mask = mask; - s->submask = submask | (1 << task_subtype_none); +void scheduler_start(struct scheduler *s) { /* Clear all the waits, rids, and times. */ for (int k = 0; k < s->nr_tasks; k++) { @@ -1055,14 +1041,11 @@ void scheduler_start(struct scheduler *s, unsigned int mask, s->tasks[k].rid = -1; s->tasks[k].tic = 0; s->tasks[k].toc = 0; - if (((1 << s->tasks[k].type) & mask) == 0 || - ((1 << s->tasks[k].subtype) & s->submask) == 0) - s->tasks[k].skip = 1; } /* Re-wait the tasks. */ threadpool_map(s->threadpool, scheduler_rewait_mapper, s->tasks, s->nr_tasks, - sizeof(struct task), 1000, s); + sizeof(struct task), 1000, NULL); /* Check we have not missed an active task */ #ifdef SWIFT_DEBUG_CHECKS @@ -1109,8 +1092,7 @@ void scheduler_start(struct scheduler *s, unsigned int mask, /* Loop over the tasks and enqueue whoever is ready. */ for (int k = 0; k < s->active_count; k++) { struct task *t = &s->tasks[s->tid_active[k]]; - if (atomic_dec(&t->wait) == 1 && !t->skip && ((1 << t->type) & s->mask) && - ((1 << t->subtype) & s->submask)) { + if (atomic_dec(&t->wait) == 1 && !t->skip) { scheduler_enqueue(s, t); pthread_cond_signal(&s->sleep_cond); } @@ -1140,11 +1122,8 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { /* Fail if this task has already been enqueued before. */ if (t->rid >= 0) error("Task has already been enqueued."); - /* Ignore skipped tasks and tasks not in the masks. */ - if (t->skip || (1 << t->type) & ~(s->mask) || - (1 << t->subtype) & ~(s->submask)) { - return; - } + /* Ignore skipped tasks */ + if (t->skip) return; /* If this is an implicit task, just pretend it's done. */ if (t->implicit) { diff --git a/src/scheduler.h b/src/scheduler.h index 22c83ae3c551d4dc7e601e23f7a5301241bd1fa4..8631d22cce6cc5925f154a8f3c875dc8d38d5c8b 100644 --- a/src/scheduler.h +++ b/src/scheduler.h @@ -60,12 +60,6 @@ struct scheduler { /* Scheduler flags. */ unsigned int flags; - /* Scheduler task mask */ - unsigned int mask; - - /* Scheduler sub-task mask */ - unsigned int submask; - /* Number of queues in this scheduler. */ int nr_queues; @@ -117,7 +111,6 @@ struct scheduler { * @param s The #scheduler. * @param t The task to be added. */ - __attribute__((always_inline)) INLINE static void scheduler_activate( struct scheduler *s, struct task *t) { if (atomic_cas(&t->skip, 1, 0)) { @@ -134,8 +127,7 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_tasks, struct task *scheduler_gettask(struct scheduler *s, int qid, const struct task *prev); void scheduler_enqueue(struct scheduler *s, struct task *t); -void scheduler_start(struct scheduler *s, unsigned int mask, - unsigned int submask); +void scheduler_start(struct scheduler *s); void scheduler_reset(struct scheduler *s, int nr_tasks); void scheduler_ranktasks(struct scheduler *s); void scheduler_reweight(struct scheduler *s, int verbose);