From 0025151f51e76298ecca20c2e46aea92350a12d3 Mon Sep 17 00:00:00 2001 From: Pedro Gonnet <pedro.gonnet@durham.ac.uk> Date: Thu, 30 Aug 2012 22:24:49 +0000 Subject: [PATCH] make sorting more memory-efficient. Former-commit-id: 0b8d1b961353602dc0ec66a399cd1c4a7efb8f4c --- runner.c | 75 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/runner.c b/runner.c index 094886251d..05c0d13e72 100644 --- a/runner.c +++ b/runner.c @@ -882,7 +882,7 @@ void runner_dosort ( struct runner_thread *rt , struct cell *c , int flags ) { int j, k, count = c->count; int cone, ctwo; int i, ind, off[8], inds[8], temp_i; - float shift[3]; + // float shift[3]; float buff[8]; struct cell *temp_c; TIMER_TIC @@ -997,36 +997,57 @@ void runner_dosort ( struct runner_thread *rt , struct cell *c , int flags ) { } /* progeny? */ + /* Otherwise, just sort. */ + // else { + // + // /* Loop over the different cell axes. */ + // for ( j = 0 ; j < 13 ; j++ ) { + // + // /* Has this sort array been flagged? */ + // if ( !( flags & (1 << j) ) ) + // continue; + // + // /* Get the shift vector. */ + // shift[0] = runner_shift[ 3*j + 0 ]; + // shift[1] = runner_shift[ 3*j + 1 ]; + // shift[2] = runner_shift[ 3*j + 2 ]; + // + // /* Fill the sort array. */ + // finger = &c->sort[ j*(count + 1) ]; + // for ( k = 0 ; k < count ; k++ ) { + // finger[k].i = k; + // finger[k].d = parts[k].x[0]*shift[0] + parts[k].x[1]*shift[1] + parts[k].x[2]*shift[2]; + // } + // + // /* Add the sentinel. */ + // finger[ c->count ].d = FLT_MAX; + // finger[ c->count ].i = 0; + // + // /* Sort descending. */ + // runner_dosort_ascending( finger , c->count ); + // + // } + // + // } + /* Otherwise, just sort. */ else { - /* Loop over the different cell axes. */ - for ( j = 0 ; j < 13 ; j++ ) { - - /* Has this sort array been flagged? */ - if ( !( flags & (1 << j) ) ) - continue; - - /* Get the shift vector. */ - shift[0] = runner_shift[ 3*j + 0 ]; - shift[1] = runner_shift[ 3*j + 1 ]; - shift[2] = runner_shift[ 3*j + 2 ]; - - /* Fill the sort array. */ - finger = &c->sort[ j*(count + 1) ]; - for ( k = 0 ; k < count ; k++ ) { - finger[k].i = k; - finger[k].d = parts[k].x[0]*shift[0] + parts[k].x[1]*shift[1] + parts[k].x[2]*shift[2]; + /* Fill the sort array. */ + for ( k = 0 ; k < count ; k++ ) + for ( j = 0 ; j < 13 ; j++ ) + if ( flags & (1 << j) ) { + c->sort[ j*(count + 1) + k].i = k; + c->sort[ j*(count + 1) + k].d = parts[k].x[0]*runner_shift[ 3*j + 0 ] + parts[k].x[1]*runner_shift[ 3*j + 1 ] + parts[k].x[2]*runner_shift[ 3*j + 2 ]; + } + + /* Add the sentinel and sort. */ + for ( j = 0 ; j < 13 ; j++ ) + if ( flags & (1 << j) ) { + c->sort[ j*(count + 1) + c->count ].d = FLT_MAX; + c->sort[ j*(count + 1) + c->count ].i = 0; + runner_dosort_ascending( &c->sort[ j*(count + 1) ] , c->count ); } - - /* Add the sentinel. */ - finger[ c->count ].d = FLT_MAX; - finger[ c->count ].i = 0; - - /* Sort descending. */ - runner_dosort_ascending( finger , c->count ); - - } } -- GitLab