Simplify loop structure to fix issues

This commit is contained in:
Stan Moore
2022-02-04 11:45:28 -08:00
parent e15ca1eeef
commit f45663bfc2

View File

@ -952,76 +952,67 @@ void Dump::balance()
int nswap = 0; int nswap = 0;
MPI_Request *request = new MPI_Request[nprocs]; MPI_Request *request = new MPI_Request[nprocs];
int procstart = 0;
int iproc = me;
int iproc_prev;
for (int i = 0; i < nme_balance; i++) { // find which proc starting atom belongs to
// find which proc this atom belongs to int startproc = me;
while (proc_new_offsets[me] < proc_offsets[startproc]) startproc--;
while (proc_new_offsets[me] > proc_offsets[startproc+1]-1) startproc++;
while (proc_new_offsets[me] + i < proc_offsets[iproc]) iproc--; // find which proc ending atom belongs to
while (proc_new_offsets[me] + i > proc_offsets[iproc+1]-1) iproc++;
if (i != 0 && (iproc != iproc_prev || i == nme_balance - 1)) { int endproc = me;
while (proc_new_offsets[me] + nme_balance-1 < proc_offsets[endproc]) endproc--;
while (proc_new_offsets[me] + nme_balance-1 > proc_offsets[endproc+1]-1) endproc++;
// finished with proc // loop over procs
int procrecv = iproc; for (int iproc = startproc; iproc <= endproc; iproc++) {
if (iproc != iproc_prev) procrecv = iproc_prev; int istart = MAX(0, proc_offsets[iproc] - proc_new_offsets[me]);
int iend = MIN(nme_balance-1, proc_offsets[iproc+1]-1 - proc_new_offsets[me]);
int procnrecv = i - procstart + 1; int nrecv = iend - istart + 1;
if (iproc != iproc_prev) procnrecv--; if (nrecv == 0) continue;
// post receive for this proc // post receive for this proc
if (procrecv != me) if (iproc != me)
MPI_Irecv(&buf_balance[procstart*size_one],procnrecv*size_one,MPI_DOUBLE, MPI_Irecv(&buf_balance[istart*size_one],nrecv*size_one,MPI_DOUBLE,
procrecv,0,world,&request[nswap++]); iproc,0,world,&request[nswap++]);
procstart = i;
}
iproc_prev = iproc;
} }
// compute which atoms I am sending and to which procs // compute which atoms I am sending and to which procs
procstart = 0; // find which proc starting atom belongs to
iproc = me;
for (int i = 0; i < nme; i++) {
// find which proc this atom should belong to startproc = me;
while (proc_offsets[me] < proc_new_offsets[startproc]) startproc--;
while (proc_offsets[me] > proc_new_offsets[startproc+1]-1) startproc++;
while (proc_offsets[me] + i < proc_new_offsets[iproc]) iproc--; // find which proc ending atom belongs to
while (proc_offsets[me] + i > proc_new_offsets[iproc+1] - 1) iproc++;
if (i != 0 && (iproc != iproc_prev || i == nme - 1)) { endproc = me;
while (proc_offsets[me] + nme-1 < proc_new_offsets[endproc]) endproc--;
while (proc_offsets[me] + nme-1 > proc_new_offsets[endproc+1]-1) endproc++;
// finished with proc // loop over procs
int procsend = iproc; for (int iproc = startproc; iproc <= endproc; iproc++) {
if (iproc != iproc_prev) procsend = iproc_prev; int istart = MAX(0,proc_new_offsets[iproc] - proc_offsets[me]);
int iend = MIN(nme-1,proc_new_offsets[iproc+1]-1 - proc_offsets[me]);
int procnsend = i - procstart + 1; int nsend = iend - istart + 1;
if (iproc != iproc_prev) procnsend--; if (nsend == 0) continue;
// send for this proc // send for this proc
if (procsend != me) { if (iproc != me) {
MPI_Send(&buf[procstart*size_one],procnsend*size_one,MPI_DOUBLE,procsend,0,world); MPI_Send(&buf[istart*size_one],nsend*size_one,MPI_DOUBLE,iproc,0,world);
} else { } else {
// sending to self, copy buffers // sending to self, copy buffers
int offset_me = proc_offsets[me] - proc_new_offsets[me]; int offset_me = proc_offsets[me] - proc_new_offsets[me];
memcpy(&buf_balance[(offset_me + procstart)*size_one],&buf[procstart*size_one],sizeof(double)*procnsend*size_one); memcpy(&buf_balance[(offset_me + istart)*size_one],&buf[istart*size_one],sizeof(double)*nsend*size_one);
} }
procstart = i;
}
iproc_prev = iproc;
} }
// wait for all recvs // wait for all recvs