diff --git a/src/cell.c b/src/cell.c index 454f54d9cd3a59554a8d44cf9cf8a800b10a0ba8..e11edbda77d1560bfab8d1398410e342214181f0 100644 --- a/src/cell.c +++ b/src/cell.c @@ -151,6 +151,7 @@ void cell_split ( struct cell *c ) { int i, j, k; struct part temp, *parts = c->parts; + struct xpart xtemp, *xparts = c->xparts; int left[8], right[8]; double pivot[3]; @@ -167,6 +168,7 @@ void cell_split ( struct cell *c ) { j -= 1; if ( i < j ) { temp = parts[i]; parts[i] = parts[j]; parts[j] = temp; + xtemp = xparts[i]; xparts[i] = xparts[j]; xparts[j] = xtemp; } } /* for ( k = 0 ; k <= j ; k++ ) @@ -188,6 +190,7 @@ void cell_split ( struct cell *c ) { j -= 1; if ( i < j ) { temp = parts[i]; parts[i] = parts[j]; parts[j] = temp; + xtemp = xparts[i]; xparts[i] = xparts[j]; xparts[j] = xtemp; } } /* for ( int kk = left[k] ; kk <= j ; kk++ ) @@ -212,6 +215,7 @@ void cell_split ( struct cell *c ) { j -= 1; if ( i < j ) { temp = parts[i]; parts[i] = parts[j]; parts[j] = temp; + xtemp = xparts[i]; xparts[i] = xparts[j]; xparts[j] = xtemp; } } /* for ( int kk = left[k] ; kk <= j ; kk++ ) @@ -232,6 +236,7 @@ void cell_split ( struct cell *c ) { for ( k = 0 ; k < 8 ; k++ ) { c->progeny[k]->count = right[k] - left[k] + 1; c->progeny[k]->parts = &c->parts[ left[k] ]; + c->progeny[k]->xparts = &c->xparts[ left[k] ]; } /* Verify that _all_ the parts have been assigned to a cell. */ diff --git a/src/cell.h b/src/cell.h index 9f882b9eec10f795496fa0e6bcb3e6a1e5a8d902..b282ecf17970414b809895ad029cf153ddf3e507 100644 --- a/src/cell.h +++ b/src/cell.h @@ -54,6 +54,9 @@ struct cell { /* Pointers to the particle data. */ struct part *parts; + /* Pointers to the extra particle data. */ + struct xpart *xparts; + /* Pointers for the sorted indices. */ struct entry *sort; unsigned int sorted; diff --git a/src/part.h b/src/part.h index dd116b0528aa4bcef81b48f926f59741edbfef21..d5e5bb54e22e52ff44e161dce34fcffa08f9a0c2 100644 --- a/src/part.h +++ b/src/part.h @@ -125,9 +125,6 @@ struct part { /* Particle ID. */ unsigned long long id; - /* Pointer to extra particle data. */ - struct xpart *xtras; - } __attribute__((aligned (part_align))); diff --git a/src/runner.c b/src/runner.c index e4be2241a6341229a3ac9c4be1299ba7ef6213cc..15d9936ad374fc87a29851db39359b6bbb42d1cb 100644 --- a/src/runner.c +++ b/src/runner.c @@ -527,7 +527,7 @@ void runner_dokick2 ( struct runner *r , struct cell *c ) { float dt_cfl, dt_h_change, dt_u_change, dt_new; float h_dt, u_dt; struct part *restrict p, *restrict parts = c->parts; - struct xpart *restrict xp; + struct xpart *restrict xp, *restrict xparts = c->xparts; TIMER_TIC @@ -544,7 +544,7 @@ void runner_dokick2 ( struct runner *r , struct cell *c ) { __builtin_prefetch( &parts[k+3] , 0 , 1 ); __builtin_prefetch( &parts[k+3].rho_dh , 0 , 1 ); p = &parts[k]; - xp = p->xtras; + xp = &xparts[k]; /* Get local copies of particle data. */ pdt = p->dt; @@ -637,7 +637,7 @@ void runner_dokick1 ( struct runner *r , struct cell *c ) { float a[3], v[3], u, u_dt, h, h_dt, v_old[3], w, rho; double x[3], x_old[3]; struct part *restrict p, *restrict parts = c->parts; - struct xpart *restrict xp; + struct xpart *restrict xp, *restrict xparts = c->xparts; /* No children? */ if ( !c->split ) { @@ -660,8 +660,8 @@ void runner_dokick1 ( struct runner *r , struct cell *c ) { /* Get a handle on the kth particle. */ __builtin_prefetch( &parts[k+3] , 0 , 1 ); __builtin_prefetch( &parts[k+3].rho_dh , 0 , 1 ); - p = &c->parts[k]; - xp = p->xtras; + p = &parts[k]; + xp = &xparts[k]; /* Load the data locally. */ a[0] = p->a[0]; a[1] = p->a[1]; a[2] = p->a[2]; diff --git a/src/scheduler.c b/src/scheduler.c index 36383333dc4c72b152a4faa59ad2a52fcf293cc1..aae8b30c35b748db51bd8472d8745946b28af48c 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -842,7 +842,7 @@ struct task *scheduler_gettask ( struct scheduler *s , int qid , struct cell *su /* Check qid. */ if ( qid >= nr_queues || qid < 0 ) - error( "Bad queue ID." ); + error( "Bad queue ID." ); /* Loop as long as there are tasks... */ while ( s->waiting > 0 && res == NULL ) { diff --git a/src/space.c b/src/space.c index a1fb6074f91bc238983281a72395af83ccafacc0..5afd39f54c505d491c239a008852a93ab417b579 100644 --- a/src/space.c +++ b/src/space.c @@ -159,6 +159,7 @@ void space_rebuild ( struct space *s , double cell_max ) { int i, j, k, cdim[3], nr_parts = s->nr_parts; struct cell *restrict c; struct part *restrict finger, *restrict p, *parts = s->parts; + struct xpart *xfinger, *xparts = s->xparts; int *ind; double ih[3], dim[3]; // ticks tic; @@ -281,7 +282,7 @@ void space_rebuild ( struct space *s , double cell_max ) { /* Sort the parts according to their cells. */ // tic = getticks(); - parts_sort( parts , ind , s->nr_parts , 0 , s->nr_cells-1 ); + parts_sort( parts , xparts , ind , s->nr_parts , 0 , s->nr_cells-1 ); // printf( "space_rebuild: parts_sort took %.3f ms.\n" , (double)(getticks() - tic) / CPU_TPS * 1000 ); /* Verify sort. */ @@ -298,11 +299,14 @@ void space_rebuild ( struct space *s , double cell_max ) { /* Hook the cells up to the parts. */ // tic = getticks(); - finger = s->parts; + finger = parts; + xfinger = xparts; for ( k = 0 ; k < s->nr_cells ; k++ ) { c = &s->cells[ k ]; c->parts = finger; + c->xparts = xfinger; finger = &finger[ c->count ]; + xfinger = &xfinger[ c->count ]; } // printf( "space_rebuild: hooking up cells took %.3f ms.\n" , (double)(getticks() - tic) / CPU_TPS * 1000 ); @@ -336,7 +340,7 @@ void space_rebuild ( struct space *s , double cell_max ) { * @param max highest index. */ -void parts_sort ( struct part *parts , int *ind , int N , int min , int max ) { +void parts_sort ( struct part *parts , struct xpart *xparts , int *ind , int N , int min , int max ) { struct { int i, j, min, max, ready; @@ -346,6 +350,7 @@ void parts_sort ( struct part *parts , int *ind , int N , int min , int max ) { int pivot; int i, ii, j, jj, temp_i, qid; struct part temp_p; + struct xpart temp_xp; /* Init the interval stack. */ qstack[0].i = 0; @@ -358,7 +363,7 @@ void parts_sort ( struct part *parts , int *ind , int N , int min , int max ) { first = 0; last = 1; waiting = 1; /* Parallel bit. */ - #pragma omp parallel default(shared) private(pivot,i,ii,j,jj,min,max,temp_i,qid,temp_p) + #pragma omp parallel default(shared) private(pivot,i,ii,j,jj,min,max,temp_i,qid,temp_xp,temp_p) { /* Main loop. */ @@ -398,6 +403,7 @@ void parts_sort ( struct part *parts , int *ind , int N , int min , int max ) { if ( ii < jj ) { temp_i = ind[ii]; ind[ii] = ind[jj]; ind[jj] = temp_i; temp_p = parts[ii]; parts[ii] = parts[jj]; parts[jj] = temp_p; + temp_xp = xparts[ii]; xparts[ii] = xparts[jj]; xparts[jj] = temp_xp; } } @@ -632,7 +638,7 @@ void space_split ( struct space *s , struct cell *c ) { float h, h_max = 0.0f, dt, dt_min = c->parts[0].dt, dt_max = dt_min; struct cell *temp; struct part *p, *parts = c->parts; - struct xpart *xp; + struct xpart *xp, *xparts = c->xparts; /* Check the depth. */ if ( c->depth > s->maxdepth ) @@ -707,7 +713,7 @@ void space_split ( struct space *s , struct cell *c ) { for ( k = 0 ; k < count ; k++ ) { p = &parts[k]; - xp = p->xtras; + xp = &xparts[k]; xp->x_old[0] = p->x[0]; xp->x_old[1] = p->x[1]; xp->x_old[2] = p->x[2]; @@ -835,8 +841,6 @@ struct cell *space_getcell ( struct space *s ) { void space_init ( struct space *s , double dim[3] , struct part *parts , int N , int periodic , double h_max ) { - int k; - /* Store eveything in the space. */ s->dim[0] = dim[0]; s->dim[1] = dim[1]; s->dim[2] = dim[2]; s->periodic = periodic; @@ -845,11 +849,9 @@ void space_init ( struct space *s , double dim[3] , struct part *parts , int N , s->cell_min = h_max; s->nr_queues = 1; - /* Allocate and link the xtra parts array. */ + /* Allocate the xtra parts array. */ if ( posix_memalign( (void *)&s->xparts , 32 , N * sizeof(struct xpart) ) != 0 ) error( "Failed to allocate xparts." ); - for ( k = 0 ; k < N ; k++ ) - s->parts[k].xtras = &s->xparts[k]; /* Init the space lock. */ if ( lock_init( &s->lock ) != 0 ) diff --git a/src/space.h b/src/space.h index 2f970091c8ce7c217e34562c86066024affadcbf..7ae8fefce07e09c5bc27faa8b2a0d23bf60f4e57 100644 --- a/src/space.h +++ b/src/space.h @@ -100,7 +100,7 @@ struct space { /* function prototypes. */ -void parts_sort ( struct part *parts , int *ind , int N , int min , int max ); +void parts_sort ( struct part *parts , struct xpart *xparts , int *ind , int N , int min , int max ); struct cell *space_getcell ( struct space *s ); int space_getsid ( struct space *s , struct cell **ci , struct cell **cj , double *shift ); void space_init ( struct space *s , double dim[3] , struct part *parts , int N , int periodic , double h_max );