Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/exchangeDonors.C
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ void tioga::exchangeDonors(void)
// and receiving
//
pc->getMap(&nsend,&nrecv,&sndMap,&rcvMap);
if (nsend == 0) return;
//
// create packets to send and receive
// and initialize them to zero
Expand Down Expand Up @@ -74,7 +73,8 @@ void tioga::exchangeDonors(void)
//
// communicate donors (comm1)
//
pc->sendRecvPackets(sndPack,rcvPack);
pc->sendRecvPackets2(sndPack,rcvPack);
if (nsend == 0) return;
// Initialize linked lists and populate donor data from rcvPack
for (int ib=0;ib<nblocks;ib++) {
auto& mb = mblocks[ib];
Expand Down
226 changes: 167 additions & 59 deletions src/parallelComm.C
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,20 @@

void parallelComm::sendRecvPacketsAll(PACKET *sndPack, PACKET *rcvPack)
{
int i;
int *sint,*sreal,*rint,*rreal;
int *sint=(int *)malloc(sizeof(int)*numprocs);
int *sreal=(int *) malloc(sizeof(int)*numprocs);
int *rint=(int *)malloc(sizeof(int)*numprocs);
int *rreal=(int *) malloc(sizeof(int)*numprocs);
//
sint=(int *)malloc(sizeof(int)*numprocs);
sreal=(int *) malloc(sizeof(int)*numprocs);
rint=(int *)malloc(sizeof(int)*numprocs);
rreal=(int *) malloc(sizeof(int)*numprocs);
//
for(i=0;i<numprocs;i++){
for(int i=0;i<numprocs;i++){
sint[i]=sndPack[i].nints;
sreal[i]=sndPack[i].nreals;
}
//
MPI_Alltoall(sint,1,MPI_INT,rint,1,MPI_INT,scomm);
MPI_Alltoall(sreal,1,MPI_INT,rreal,1,MPI_INT,scomm);
//
for(i=0;i<numprocs;i++) {
for(int i=0;i<numprocs;i++) {
rcvPack[i].nints=rint[i];
rcvPack[i].nreals=rreal[i];
}
Expand Down Expand Up @@ -107,7 +104,7 @@ void parallelComm::sendRecvPacketsAll(PACKET *sndPack, PACKET *rcvPack)
&real_request);

MPI_Wait(&int_request, MPI_STATUS_IGNORE);
for(i=0;i<numprocs;i++){
for(int i=0;i<numprocs;i++){
if (rcvPack[i].nints > 0) {
rcvPack[i].intData=(int *) malloc(sizeof(int)*rcvPack[i].nints);
}
Expand Down Expand Up @@ -212,42 +209,166 @@ void parallelComm::sendRecvPacketsAll(PACKET *sndPack, PACKET *rcvPack)
// TIOGA_FREE(status);
// }

void parallelComm::sendRecvPackets(PACKET *sndPack,PACKET *rcvPack)
void parallelComm::sendRecvPackets2(PACKET *sndPack,PACKET *rcvPack)
{
int i;
int *scount,*rcount;
int tag,irnum;
MPI_Request *request;
MPI_Status *status;
int *sint=(int *)malloc(sizeof(int)*numprocs);
int *sreal=(int *) malloc(sizeof(int)*numprocs);
int *rint=(int *)malloc(sizeof(int)*numprocs);
int *rreal=(int *) malloc(sizeof(int)*numprocs);
// remove when using stl vectors and just init the vectors to 0
for(int i=0;i<numprocs;i++){
sint[i]=sreal[i]=0;
rint[i]=rreal[i]=0;
}
for(int i=0;i<nsend;i++){
sint[sndMap[i]]=sndPack[i].nints;
sreal[sndMap[i]]=sndPack[i].nreals;
}
//
scount=(int *)malloc(2*sizeof(int)*nsend);
rcount=(int *) malloc(2*sizeof(int)*nrecv);
request=(MPI_Request *) malloc(sizeof(MPI_Request)*2*(nsend+nrecv));
status=(MPI_Status *) malloc(sizeof(MPI_Status)*2*(nsend+nrecv));
MPI_Alltoall(sint,1,MPI_INT,rint,1,MPI_INT,scomm);
MPI_Alltoall(sreal,1,MPI_INT,rreal,1,MPI_INT,scomm);
//
for(i=0;i<nsend;i++){
for(int i=0;i<nrecv;i++) {
rcvPack[i].nints=rint[rcvMap[i]];
rcvPack[i].nreals=rreal[rcvMap[i]];
}

int all_snd_nints = std::accumulate(sint, sint + numprocs, 0);
int all_rcv_nints = std::accumulate(rint, rint + numprocs, 0);
int *all_snd_intData, *all_rcv_intData;
all_snd_intData=(int *) malloc(sizeof(int)*all_snd_nints);
all_rcv_intData=(int *) malloc(sizeof(int)*all_rcv_nints);
for (int i = 0; i < all_snd_nints; i++) {
Comment thread Fixed
all_snd_intData[i] = 0;
}
for (int i = 0; i < all_rcv_nints; i++) {
Comment thread Fixed
all_rcv_intData[i] = 0;
}
std::vector<int> snd_int_displs(numprocs+1, 0);
std::vector<int> rcv_int_displs(numprocs+1, 0);
for (int i=1; i <= numprocs; i++) {
Comment thread Fixed
snd_int_displs[i] = snd_int_displs[i-1] + sint[i-1];
rcv_int_displs[i] = rcv_int_displs[i-1] + rint[i-1];
}
for (int i=0; i < nsend; i++) {
Comment thread Fixed
int displ = snd_int_displs[sndMap[i]];
for(int j=0; j < sint[sndMap[i]]; j++){
all_snd_intData[displ+j] = sndPack[i].intData[j];
}
}
MPI_Request int_request;
MPI_Ialltoallv(all_snd_intData,
sint,
snd_int_displs.data(),
MPI_INT,
all_rcv_intData,
rint,
rcv_int_displs.data(),
MPI_INT,
scomm,
&int_request);

int all_snd_nreals = std::accumulate(sreal, sreal + numprocs, 0);
int all_rcv_nreals = std::accumulate(rreal, rreal + numprocs, 0);
REAL *all_snd_realData, *all_rcv_realData;
all_snd_realData=(REAL *) malloc(sizeof(REAL)*all_snd_nreals);
all_rcv_realData=(REAL *) malloc(sizeof(REAL)*all_rcv_nreals);
for (int i = 0; i < all_snd_nreals; i++) {
Comment thread Fixed
all_snd_realData[i] = 0;
}
for (int i = 0; i < all_rcv_nreals; i++) {
Comment thread Fixed
all_rcv_realData[i] = 0;
}
std::vector<int> snd_real_displs(numprocs+1, 0);
std::vector<int> rcv_real_displs(numprocs+1, 0);
for (int i=1; i <= numprocs; i++) {
Comment thread Fixed
snd_real_displs[i] = snd_real_displs[i-1] + sreal[i-1];
rcv_real_displs[i] = rcv_real_displs[i-1] + rreal[i-1];
}
for (int i=0; i < nsend; i++) {
Comment thread Fixed
int displ = snd_real_displs[sndMap[i]];
for(int j=0; j < sreal[sndMap[i]]; j++){
all_snd_realData[displ+j] = sndPack[i].realData[j];
}
}
MPI_Request real_request;
MPI_Ialltoallv(all_snd_realData,
sreal,
snd_real_displs.data(),
MPI_DOUBLE,
all_rcv_realData,
rreal,
rcv_real_displs.data(),
MPI_DOUBLE,
scomm,
&real_request);

// FIXME: here and above I think I should move this a bit lower
Comment thread Fixed

Check notice

Code scanning / CodeQL

FIXME comment

FIXME comment: here and above I think I should move this a bit lower
MPI_Wait(&int_request, MPI_STATUS_IGNORE);
for(int i=0;i<nrecv;i++){
if (rcvPack[i].nints > 0) {
rcvPack[i].intData=(int *) malloc(sizeof(int)*rcvPack[i].nints);
}
if (rcvPack[i].nreals > 0) {
rcvPack[i].realData=(REAL *) malloc(sizeof(REAL)*rcvPack[i].nreals);
}
}

// FIXME: here and above I think I should move this a bit lower

Check notice

Code scanning / CodeQL

FIXME comment

FIXME comment: here and above I think I should move this a bit lower
MPI_Wait(&real_request, MPI_STATUS_IGNORE);
for (int i=0; i < nrecv; i++) {
Comment thread Fixed
int displ = rcv_int_displs[rcvMap[i]];
for(int j=0; j < rint[rcvMap[i]]; j++){
rcvPack[i].intData[j] = all_rcv_intData[displ+j];
}
}
for (int i=0; i < nrecv; i++) {
Comment thread Fixed
int displ = rcv_real_displs[rcvMap[i]];
for(int j=0; j < rreal[rcvMap[i]]; j++){
rcvPack[i].realData[j] = all_rcv_realData[displ+j];
}
}

TIOGA_FREE(all_snd_intData);
TIOGA_FREE(all_rcv_intData);
TIOGA_FREE(all_snd_realData);
TIOGA_FREE(all_rcv_realData);
TIOGA_FREE(sint);
TIOGA_FREE(sreal);
TIOGA_FREE(rint);
TIOGA_FREE(rreal);
}

void parallelComm::sendRecvPackets(PACKET *sndPack,PACKET *rcvPack)
{
int *scount=(int *)malloc(2*sizeof(int)*nsend);
int *rcount=(int *) malloc(2*sizeof(int)*nrecv);
MPI_Request *request=(MPI_Request *) malloc(sizeof(MPI_Request)*2*(nsend+nrecv));
MPI_Status *status=(MPI_Status *) malloc(sizeof(MPI_Status)*2*(nsend+nrecv));
//
for(int i=0;i<nsend;i++){
scount[2*i]=sndPack[i].nints;
scount[2*i+1]=sndPack[i].nreals;
}
//
irnum=0;
tag=1;
int irnum=0;
int tag=1;
//
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
MPI_Irecv(&(rcount[2*i]),2,MPI_INT,rcvMap[i],tag,scomm,&request[irnum++]);
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
MPI_Isend(&(scount[2*i]),2,MPI_INT,sndMap[i],tag,scomm,&request[irnum++]);
//
MPI_Waitall(irnum,request,status);
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
rcvPack[i].nints=rcount[2*i];
rcvPack[i].nreals=rcount[2*i+1];
}
//
irnum=0;
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
if (rcvPack[i].nints > 0) {
tag=1;
Expand All @@ -265,7 +386,7 @@ void parallelComm::sendRecvPackets(PACKET *sndPack,PACKET *rcvPack)
}
}
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
{
if (sndPack[i].nints > 0){
tag=1;
Expand All @@ -290,34 +411,28 @@ void parallelComm::sendRecvPackets(PACKET *sndPack,PACKET *rcvPack)

void parallelComm::sendRecvPacketsCheck(PACKET *sndPack,PACKET *rcvPack)
{
int i;
int *scount,*rcount;
int tag,irnum;
MPI_Request *request;
MPI_Status *status;
int *scount=(int *)malloc(2*sizeof(int)*nsend);
int *rcount=(int *) malloc(2*sizeof(int)*nrecv);
MPI_Request *request=(MPI_Request *) malloc(sizeof(MPI_Request)*2*(nsend+nrecv));
MPI_Status *status=(MPI_Status *) malloc(sizeof(MPI_Status)*2*(nsend+nrecv));
//
scount=(int *)malloc(2*sizeof(int)*nsend);
rcount=(int *) malloc(2*sizeof(int)*nrecv);
request=(MPI_Request *) malloc(sizeof(MPI_Request)*2*(nsend+nrecv));
status=(MPI_Status *) malloc(sizeof(MPI_Status)*2*(nsend+nrecv));
//
for(i=0;i<nsend;i++){
for(int i=0;i<nsend;i++){
scount[2*i]=sndPack[i].nints;
scount[2*i+1]=sndPack[i].nreals;
}
//
irnum=0;
tag=1;
int irnum=0;
int tag=1;
//
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
MPI_Irecv(&(rcount[2*i]),2,MPI_INT,rcvMap[i],tag,scomm,&request[irnum++]);
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
MPI_Isend(&(scount[2*i]),2,MPI_INT,sndMap[i],tag,scomm,&request[irnum++]);
//
MPI_Waitall(irnum,request,status);

for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
rcvPack[i].nints=rcount[2*i];
rcvPack[i].nreals=rcount[2*i+1];
Expand All @@ -333,7 +448,7 @@ void parallelComm::sendRecvPacketsCheck(PACKET *sndPack,PACKET *rcvPack)
// }
//
irnum=0;
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
if (rcvPack[i].nints > 0) {
tag=1;
Expand All @@ -351,7 +466,7 @@ void parallelComm::sendRecvPacketsCheck(PACKET *sndPack,PACKET *rcvPack)
}
}
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
{
if (sndPack[i].nints > 0){
tag=1;
Expand All @@ -376,8 +491,6 @@ void parallelComm::sendRecvPacketsCheck(PACKET *sndPack,PACKET *rcvPack)

void parallelComm::setMap(int ns,int nr, int *snd,int *rcv)
{
int i;
//
if (sndMap) TIOGA_FREE(sndMap); sndMap=NULL;
if (rcvMap) TIOGA_FREE(rcvMap); rcvMap=NULL;
//
Expand All @@ -386,8 +499,8 @@ void parallelComm::setMap(int ns,int nr, int *snd,int *rcv)
sndMap=(int *) malloc(sizeof(int)*nsend);
rcvMap=(int *) malloc(sizeof(int)*nrecv);
//
for(i=0;i<nsend;i++) sndMap[i]=snd[i];
for(i=0;i<nrecv;i++) rcvMap[i]=rcv[i];
for(int i=0;i<nsend;i++) sndMap[i]=snd[i];
for(int i=0;i<nrecv;i++) rcvMap[i]=rcv[i];
}

void parallelComm::getMap(int *ns, int *nr, int **snd,int **rcv)
Expand All @@ -402,17 +515,16 @@ void parallelComm::getMap(int *ns, int *nr, int **snd,int **rcv)

void parallelComm::clearPackets(PACKET *sndPack, PACKET *rcvPack)
{
int i;
//
// free Send and recv data
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
{
if (sndPack[i].intData) TIOGA_FREE(sndPack[i].intData);
if (sndPack[i].realData) TIOGA_FREE(sndPack[i].realData);
sndPack[i].nints=sndPack[i].nreals=0;
}
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
if (rcvPack[i].intData) TIOGA_FREE(rcvPack[i].intData);
if (rcvPack[i].realData) TIOGA_FREE(rcvPack[i].realData);
Expand All @@ -424,20 +536,16 @@ void parallelComm::clearPackets(PACKET *sndPack, PACKET *rcvPack)

void parallelComm::initPackets(PACKET *sndPack, PACKET *rcvPack)
{
int i;
//
for(i=0;i<nsend;i++)
for(int i=0;i<nsend;i++)
{
sndPack[i].nints=sndPack[i].nreals=0;
sndPack[i].intData=NULL;
sndPack[i].realData=NULL;
}
//
for(i=0;i<nrecv;i++)
for(int i=0;i<nrecv;i++)
{
rcvPack[i].nints=rcvPack[i].nreals=0;
rcvPack[i].intData=NULL;
rcvPack[i].realData=NULL;
}
//
}
2 changes: 2 additions & 0 deletions src/parallelComm.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class parallelComm {

void sendRecvPacketsAll(PACKET *sndPack, PACKET *rcvPack);

void sendRecvPackets2(PACKET *sndPack, PACKET *rcvPack);

void sendRecvPackets(PACKET *sndPack, PACKET *rcvPack);

void sendRecvPacketsCheck(PACKET *sndPack, PACKET *rcvPack);
Expand Down
4 changes: 3 additions & 1 deletion src/tioga.C
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,9 @@ void tioga::performConnectivity(void)
this->myTimer("tioga::exchangeDonors",1);
//this->reduce_fringes();
//outputStatistics();
MPI_Allreduce(&ihigh,&ihighGlobal,1,MPI_INT,MPI_MAX,scomm);
//MPI_Allreduce(&ihigh,&ihighGlobal,1,MPI_INT,MPI_MAX,scomm);
assert(ihigh == 0);
ihighGlobal = 0;
Comment thread
marchdf marked this conversation as resolved.
//if (ihighGlobal) {
this->myTimer("tioga::getCellIblanks",0);
for (int ib=0;ib<nblocks;ib++) {
Expand Down