@@ -6998,7 +6998,9 @@ int VMK::alltoall(void *in, int inCount, void *out, int outCount,
6998
6998
// Step-1: SSI root PETs gather xfer data on their SSI.
6999
6999
// - Each PET prepares an xferBuffer to send its "in" data that is
7000
7000
// destined for PETs outside the local SSI to its SSI root PET.
7001
- std::vector<char> xferBuffer((npets-ssiLocalPetCount)*inCount*size);
7001
+ unsigned long bufferSize = inCount * size;
7002
+ bufferSize *= npets - ssiLocalPetCount;
7003
+ std::vector<char> xferBuffer(bufferSize);
7002
7004
char *xferBC = (char *)&(xferBuffer[0]);
7003
7005
char *inC = (char *)in;
7004
7006
int j=0;
@@ -7017,17 +7019,18 @@ int VMK::alltoall(void *in, int inCount, void *out, int outCount,
7017
7019
char *xferSsiBC = NULL;
7018
7020
std::vector<char> xferSsiBuffer;
7019
7021
if (mpi_c_ssi_roots != MPI_COMM_NULL){
7020
- xferSsiBuffer.resize((npets-ssiLocalPetCount)
7021
- *inCount*size*ssiLocalPetCount);
7022
+ bufferSize = inCount * size;
7023
+ bufferSize *= npets - ssiLocalPetCount;
7024
+ bufferSize *= ssiLocalPetCount;
7025
+ xferSsiBuffer.resize(bufferSize);
7022
7026
xferSsiBC = (char *)&(xferSsiBuffer[0]);
7023
7027
}
7024
7028
MPI_Gather(xferBC, (npets-ssiLocalPetCount)*inCount, mpitype,
7025
7029
xferSsiBC, (npets-ssiLocalPetCount)*outCount, mpitype, 0, mpi_c_ssi);
7026
7030
{
7027
7031
std::stringstream msg;
7028
7032
msg << "VMK::alltoall(): line=" << __LINE__
7029
- << " gathered into xferSsiBuffer bytes =" << (npets-ssiLocalPetCount)
7030
- *inCount*size*ssiLocalPetCount;
7033
+ << " gathered into xferSsiBuffer bytes =" << bufferSize;
7031
7034
ESMC_LogDefault.Write(msg.str(), ESMC_LOGMSG_DEBUG);
7032
7035
}
7033
7036
// Total exchange between SSI roots
@@ -7065,8 +7068,10 @@ int VMK::alltoall(void *in, int inCount, void *out, int outCount,
7065
7068
}
7066
7069
}
7067
7070
// - SSI roots collate data into SSI blocks for sending
7068
- std::vector<char> xferSsiSendBuffer((npets-ssiLocalPetCount)
7069
- *inCount*size*ssiLocalPetCount);
7071
+ bufferSize = inCount * size;
7072
+ bufferSize *= npets - ssiLocalPetCount;
7073
+ bufferSize *= ssiLocalPetCount;
7074
+ std::vector<char> xferSsiSendBuffer(bufferSize);
7070
7075
char *xferSsiSBC = (char *)&(xferSsiSendBuffer[0]);
7071
7076
int localSsi; // rank of local SSI's root, same as SSI index
7072
7077
MPI_Comm_rank(mpi_c_ssi_roots, &localSsi);
@@ -7076,7 +7081,6 @@ int VMK::alltoall(void *in, int inCount, void *out, int outCount,
7076
7081
<< " localSsi=" << localSsi;
7077
7082
ESMC_LogDefault.Write(msg.str(), ESMC_LOGMSG_DEBUG);
7078
7083
}
7079
-
7080
7084
std::vector<int> xferInCounts(ssiCount);
7081
7085
std::vector<int> xferInOffsets(ssiCount);
7082
7086
std::vector<int> xferOutCounts(ssiCount);
@@ -7108,12 +7112,10 @@ int VMK::alltoall(void *in, int inCount, void *out, int outCount,
7108
7112
}
7109
7113
}
7110
7114
}
7111
- #if 1
7112
7115
// - Alltoallv xferSsiSendBuffer -> xferSsiBuffer
7113
7116
MPI_Alltoallv(xferSsiSBC, &(xferInCounts[0]), &(xferInOffsets[0]),
7114
7117
mpitype, xferSsiBC, &(xferOutCounts[0]), &(xferOutOffsets[0]),
7115
7118
mpitype, mpi_c_ssi_roots);
7116
- #endif
7117
7119
}
7118
7120
}
7119
7121
MPI_Barrier(mpi_c); //TODO: remove once implementation done
0 commit comments