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;
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--;
while (proc_new_offsets[me] + i > proc_offsets[iproc+1]-1) iproc++;
// find which proc ending atom belongs to
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;
if (iproc != iproc_prev) procrecv = iproc_prev;
for (int iproc = startproc; iproc <= endproc; iproc++) {
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 nrecv = iend - istart + 1;
if (nrecv == 0) continue;
int procnrecv = i - procstart + 1;
if (iproc != iproc_prev) procnrecv--;
// post receive for this proc
// post receive for this proc
if (procrecv != me)
MPI_Irecv(&buf_balance[procstart*size_one],procnrecv*size_one,MPI_DOUBLE,
procrecv,0,world,&request[nswap++]);
procstart = i;
}
iproc_prev = iproc;
if (iproc != me)
MPI_Irecv(&buf_balance[istart*size_one],nrecv*size_one,MPI_DOUBLE,
iproc,0,world,&request[nswap++]);
}
// compute which atoms I am sending and to which procs
procstart = 0;
iproc = me;
for (int i = 0; i < nme; i++) {
// find which proc starting atom belongs to
// 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--;
while (proc_offsets[me] + i > proc_new_offsets[iproc+1] - 1) iproc++;
// find which proc ending atom belongs to
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;
if (iproc != iproc_prev) procsend = iproc_prev;
for (int iproc = startproc; iproc <= endproc; iproc++) {
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 nsend = iend - istart + 1;
if (nsend == 0) continue;
int procnsend = i - procstart + 1;
if (iproc != iproc_prev) procnsend--;
// send for this proc
// send for this proc
if (iproc != me) {
MPI_Send(&buf[istart*size_one],nsend*size_one,MPI_DOUBLE,iproc,0,world);
} else {
if (procsend != me) {
MPI_Send(&buf[procstart*size_one],procnsend*size_one,MPI_DOUBLE,procsend,0,world);
} else {
// sending to self, copy buffers
// sending to self, copy buffers
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);
}
procstart = i;
int offset_me = proc_offsets[me] - proc_new_offsets[me];
memcpy(&buf_balance[(offset_me + istart)*size_one],&buf[istart*size_one],sizeof(double)*nsend*size_one);
}
iproc_prev = iproc;
}
// wait for all recvs