From 2e6b26fd5a3c9c5f4358c0143b8d6e2fd25fe0cf Mon Sep 17 00:00:00 2001 From: Pedro Gonnet <gonnet@google.com> Date: Tue, 21 Jun 2016 22:12:41 +0200 Subject: [PATCH] purge the drift tasks. --- src/cell.h | 2 +- src/engine.c | 38 +++++------- src/partition.c | 4 +- src/runner.c | 153 +++--------------------------------------------- src/runner.h | 2 +- src/scheduler.c | 9 +-- src/space.c | 1 - src/task.c | 4 +- src/task.h | 1 - 9 files changed, 30 insertions(+), 184 deletions(-) diff --git a/src/cell.h b/src/cell.h index ad39354c6c..32cbb4256c 100644 --- a/src/cell.h +++ b/src/cell.h @@ -119,7 +119,7 @@ struct cell { int nr_density, nr_force, nr_grav; /* The hierarchical tasks. */ - struct task *ghost, *init, *drift, *kick; + struct task *ghost, *init, *kick; /* Task receiving data. */ struct task *recv_xv, *recv_rho; diff --git a/src/engine.c b/src/engine.c index c412169ca7..cbed69af49 100644 --- a/src/engine.c +++ b/src/engine.c @@ -66,11 +66,19 @@ #include "timers.h" #include "units.h" -const char *engine_policy_names[13] = { - "none", "rand", "steal", "keep", - "block", "fix_dt", "cpu_tight", "mpi", - "numa_affinity", "hydro", "self_gravity", "external_gravity", - "cosmology_integration"}; +const char *engine_policy_names[13] = {"none", + "rand", + "steal", + "keep", + "block", + "fix_dt", + "cpu_tight", + "mpi", + "numa_affinity", + "hydro", + "self_gravity", + "external_gravity", + "cosmology_integration"}; /** The rank of the engine as a global variable (for messages). */ int engine_rank; @@ -136,10 +144,6 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c, c->init = scheduler_addtask(s, task_type_init, task_subtype_none, 0, 0, c, NULL, 0); - /* Add the drift task. */ - c->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, 0, 0, - c, NULL, 0); - /* Add the kick task that matches the policy. */ if (is_fixdt) { c->kick = scheduler_addtask(s, task_type_kick_fixdt, task_subtype_none, @@ -1821,10 +1825,6 @@ void engine_marktasks_mapper(void *map_data, int num_elements, t->ci->g_updated = 0; } - /* Drift? */ - else if (t->type == task_type_drift) - t->skip = 0; - /* Init? */ else if (t->type == task_type_init) { /* Set this task's skip. */ @@ -1902,10 +1902,6 @@ int engine_marktasks_serial(struct engine *e) { t->ci->g_updated = 0; } - /* Drift? */ - else if (t->type == task_type_drift) - t->skip = 0; - /* Init? */ else if (t->type == task_type_init) { /* Set this task's skip. */ @@ -2205,9 +2201,6 @@ void engine_collect_timestep(struct engine *e) { */ void engine_collect_drift(struct cell *c) { - /* Skip super-cells (Their values are already set) */ - if (c->drift != NULL) return; - /* Counters for the different quantities. */ double e_kin = 0.0, e_int = 0.0, e_pot = 0.0, mass = 0.0; double mom[3] = {0.0, 0.0, 0.0}, ang_mom[3] = {0.0, 0.0, 0.0}; @@ -2253,6 +2246,7 @@ void engine_collect_drift(struct cell *c) { c->ang_mom[1] = ang_mom[1]; c->ang_mom[2] = ang_mom[2]; } + /** * @brief Print the conserved quantities statistics to a log file * @@ -2479,7 +2473,8 @@ void engine_step(struct engine *e) { snapshot_drift_time = e->timeStep; /* Drift everybody to the snapshot position */ - engine_launch(e, e->nr_threads, 1 << task_type_drift, 0); + threadpool_map(&e->threadpool, runner_do_drift_mapper, e->s->cells, + e->s->nr_cells, sizeof(struct cell), 1, e); /* Dump... */ engine_dump_snapshot(e); @@ -2497,7 +2492,6 @@ void engine_step(struct engine *e) { e->timeStep = (e->ti_current - e->ti_old) * e->timeBase + snapshot_drift_time; /* Drift everybody */ - // engine_launch(e, e->nr_threads, 1 << task_type_drift, 0); threadpool_map(&e->threadpool, runner_do_drift_mapper, e->s->cells, e->s->nr_cells, sizeof(struct cell), 1, e); diff --git a/src/partition.c b/src/partition.c index 6df437826d..12da7e38f6 100644 --- a/src/partition.c +++ b/src/partition.c @@ -454,7 +454,6 @@ static void repart_edge_metis(int partweights, int bothweights, int nodeID, /* Skip un-interesting tasks. */ if (t->type != task_type_self && t->type != task_type_pair && t->type != task_type_sub_self && t->type != task_type_sub_self && - t->type != task_type_ghost && t->type != task_type_drift && t->type != task_type_kick && t->type != task_type_init) continue; @@ -487,8 +486,7 @@ static void repart_edge_metis(int partweights, int bothweights, int nodeID, int cid = ci - cells; /* Different weights for different tasks. */ - if (t->type == task_type_ghost || t->type == task_type_drift || - t->type == task_type_kick) { + if (t->type == task_type_ghost || t->type == task_type_kick) { /* Particle updates add only to vertex weight. */ if (taskvweights) weights_v[cid] += w; diff --git a/src/runner.c b/src/runner.c index 8f9707346b..39dada40d7 100644 --- a/src/runner.c +++ b/src/runner.c @@ -71,7 +71,8 @@ const double runner_shift[13][3] = { {0.0, 7.071067811865475e-01, 7.071067811865475e-01}, {0.0, 1.0, 0.0}, {0.0, 7.071067811865475e-01, -7.071067811865475e-01}, - {0.0, 0.0, 1.0}, }; + {0.0, 0.0, 1.0}, +}; /* Does the axis need flipping ? */ const char runner_flip[27] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, @@ -575,149 +576,12 @@ void runner_do_ghost(struct runner *r, struct cell *c) { } /** - * @brief Drift particles and g-particles forward in time + * @brief Mapper function to drift particles and g-particles forward in time. * - * @param r The runner thread. - * @param c The cell. - * @param timer Are we timing this ? + * @param map_data An array of #cells. + * @param num_elements Chunk size. + * @param extra_data Pointer to an #engine. */ -void runner_do_drift(struct runner *r, struct cell *c, int timer) { - - const double timeBase = r->e->timeBase; - const double dt = (r->e->ti_current - r->e->ti_old) * timeBase; - const int ti_old = r->e->ti_old; - const int ti_current = r->e->ti_current; - struct part *const parts = c->parts; - struct xpart *const xparts = c->xparts; - struct gpart *const gparts = c->gparts; - float dx_max = 0.f, dx2_max = 0.f, h_max = 0.f; - - double e_kin = 0.0, e_int = 0.0, e_pot = 0.0, mass = 0.0; - double mom[3] = {0.0, 0.0, 0.0}; - double ang_mom[3] = {0.0, 0.0, 0.0}; - - TIMER_TIC - -#ifdef TASK_VERBOSE - OUT; -#endif - - /* No children? */ - if (!c->split) { - - /* Loop over all the g-particles in the cell */ - const int nr_gparts = c->gcount; - for (size_t k = 0; k < nr_gparts; k++) { - - /* Get a handle on the gpart. */ - struct gpart *const gp = &gparts[k]; - - /* Drift... */ - drift_gpart(gp, dt, timeBase, ti_old, ti_current); - - /* Compute (square of) motion since last cell construction */ - const float dx2 = gp->x_diff[0] * gp->x_diff[0] + - gp->x_diff[1] * gp->x_diff[1] + - gp->x_diff[2] * gp->x_diff[2]; - dx2_max = fmaxf(dx2_max, dx2); - } - - /* Loop over all the particles in the cell (more work for these !) */ - const size_t nr_parts = c->count; - for (size_t k = 0; k < nr_parts; k++) { - - /* Get a handle on the part. */ - struct part *const p = &parts[k]; - struct xpart *const xp = &xparts[k]; - - /* Drift... */ - drift_part(p, xp, dt, timeBase, ti_old, ti_current); - - /* Compute (square of) motion since last cell construction */ - const float dx2 = xp->x_diff[0] * xp->x_diff[0] + - xp->x_diff[1] * xp->x_diff[1] + - xp->x_diff[2] * xp->x_diff[2]; - dx2_max = fmaxf(dx2_max, dx2); - - /* Maximal smoothing length */ - h_max = fmaxf(p->h, h_max); - - /* Now collect quantities for statistics */ - - const float half_dt = - (ti_current - (p->ti_begin + p->ti_end) / 2) * timeBase; - const double x[3] = {p->x[0], p->x[1], p->x[2]}; - const float v[3] = {xp->v_full[0] + p->a_hydro[0] * half_dt, - xp->v_full[1] + p->a_hydro[1] * half_dt, - xp->v_full[2] + p->a_hydro[2] * half_dt}; - const float m = p->mass; - - /* Collect mass */ - mass += m; - - /* Collect momentum */ - mom[0] += m * v[0]; - mom[1] += m * v[1]; - mom[2] += m * v[2]; - - /* Collect angular momentum */ - ang_mom[0] += m * (x[1] * v[2] - x[2] * v[1]); - ang_mom[1] += m * (x[2] * v[0] - x[0] * v[2]); - ang_mom[2] += m * (x[0] * v[1] - x[1] * v[0]); - - /* Collect energies. */ - e_kin += 0.5 * m * (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); - e_pot += 0.; - e_int += m * hydro_get_internal_energy(p, half_dt); - } - - /* Now, get the maximal particle motion from its square */ - dx_max = sqrtf(dx2_max); - } - - /* Otherwise, aggregate data from children. */ - else { - - /* Loop over the progeny. */ - for (int k = 0; k < 8; k++) - if (c->progeny[k] != NULL) { - - /* Recurse */ - struct cell *cp = c->progeny[k]; - runner_do_drift(r, cp, 0); - - /* Collect */ - dx_max = fmaxf(dx_max, cp->dx_max); - h_max = fmaxf(h_max, cp->h_max); - mass += cp->mass; - e_kin += cp->e_kin; - e_int += cp->e_int; - e_pot += cp->e_pot; - mom[0] += cp->mom[0]; - mom[1] += cp->mom[1]; - mom[2] += cp->mom[2]; - ang_mom[0] += cp->ang_mom[0]; - ang_mom[1] += cp->ang_mom[1]; - ang_mom[2] += cp->ang_mom[2]; - } - } - - /* Store the values */ - c->h_max = h_max; - c->dx_max = dx_max; - c->mass = mass; - c->e_kin = e_kin; - c->e_int = e_int; - c->e_pot = e_pot; - c->mom[0] = mom[0]; - c->mom[1] = mom[1]; - c->mom[2] = mom[2]; - c->ang_mom[0] = ang_mom[0]; - c->ang_mom[1] = ang_mom[1]; - c->ang_mom[2] = ang_mom[2]; - - if (timer) TIMER_TOC(timer_drift); -} void runner_do_drift_mapper(void *map_data, int num_elements, void *extra_data) { @@ -826,7 +690,7 @@ void runner_do_drift_mapper(void *map_data, int num_elements, for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) { struct cell *cp = c->progeny[k]; - + /* Recurse. */ runner_do_drift_mapper(cp, 1, e); @@ -1229,9 +1093,6 @@ void *runner_main(void *data) { case task_type_ghost: runner_do_ghost(r, ci); break; - case task_type_drift: - runner_do_drift(r, ci, 1); - break; case task_type_kick: runner_do_kick(r, ci, 1); break; diff --git a/src/runner.h b/src/runner.h index 6838b95995..71e849d302 100644 --- a/src/runner.h +++ b/src/runner.h @@ -51,8 +51,8 @@ void runner_do_sort(struct runner *r, struct cell *c, int flag, int clock); void runner_do_gsort(struct runner *r, struct cell *c, int flag, int clock); void runner_do_kick(struct runner *r, struct cell *c, int timer); void runner_do_kick_fixdt(struct runner *r, struct cell *c, int timer); -void runner_do_drift(struct runner *r, struct cell *c, int timer); void runner_do_init(struct runner *r, struct cell *c, int timer); void *runner_main(void *data); +void runner_do_drift_mapper(void *map_data, int num_elements, void *extra_data); #endif /* SWIFT_RUNNER_H */ diff --git a/src/scheduler.c b/src/scheduler.c index c0a9f5cb15..c4ad2b97f2 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -136,7 +136,6 @@ void scheduler_splittasks_mapper(void *map_data, int num_elements, /* Non-splittable task? */ if ((t->ci == NULL || (t->type == task_type_pair && t->cj == NULL)) || ((t->type == task_type_kick) && t->ci->nodeID != s->nodeID) || - ((t->type == task_type_drift) && t->ci->nodeID != s->nodeID) || ((t->type == task_type_init) && t->ci->nodeID != s->nodeID)) { t->type = task_type_none; t->skip = 1; @@ -954,9 +953,6 @@ void scheduler_reweight(struct scheduler *s) { case task_type_kick: t->weight += wscale * t->ci->count; break; - case task_type_drift: - t->weight += wscale * t->ci->count; - break; case task_type_init: t->weight += wscale * t->ci->count; break; @@ -1052,8 +1048,8 @@ void scheduler_start(struct scheduler *s, unsigned int mask, sizeof(struct task), 1000, s); /* Loop over the tasks and enqueue whoever is ready. */ - threadpool_map(s->threadpool, scheduler_enqueue_mapper, s->tasks_ind, s->nr_tasks, - sizeof(int), 1000, s); + threadpool_map(s->threadpool, scheduler_enqueue_mapper, s->tasks_ind, + s->nr_tasks, sizeof(int), 1000, s); /* To be safe, fire of one last sleep_cond in a safe way. */ pthread_mutex_lock(&s->sleep_mutex); @@ -1107,7 +1103,6 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { case task_type_sort: case task_type_ghost: case task_type_kick: - case task_type_drift: case task_type_init: qid = t->ci->super->owner; break; diff --git a/src/space.c b/src/space.c index 074a5740a7..8ca707ae0b 100644 --- a/src/space.c +++ b/src/space.c @@ -349,7 +349,6 @@ void space_regrid(struct space *s, double cell_max, int verbose) { s->cells[k].gcount = 0; s->cells[k].init = NULL; s->cells[k].ghost = NULL; - s->cells[k].drift = NULL; s->cells[k].kick = NULL; s->cells[k].super = &s->cells[k]; } diff --git a/src/task.c b/src/task.c index c11c34da89..77c3a98fb1 100644 --- a/src/task.c +++ b/src/task.c @@ -47,8 +47,8 @@ /* Task type names. */ const char *taskID_names[task_type_count] = { - "none", "sort", "self", "pair", "sub", - "init", "ghost", "drift", "kick", "kick_fixdt", + "none", "sort", "self", "pair", "sub_self", + "sub_pair", "init", "ghost", "kick", "kick_fixdt", "send", "recv", "grav_pp", "grav_mm", "grav_up", "grav_down", "grav_external", "comm_root"}; diff --git a/src/task.h b/src/task.h index adef90eaac..4c6e396c7f 100644 --- a/src/task.h +++ b/src/task.h @@ -41,7 +41,6 @@ enum task_types { task_type_sub_pair, task_type_init, task_type_ghost, - task_type_drift, task_type_kick, task_type_kick_fixdt, task_type_send, -- GitLab