void QSort_parallel(double
*&procData, int &procDataSize)
{
double *data, *sendData, *recvData,
*mergeData;
int dataSize, sendDataSize, recvDataSize, mergeDataSize, commProcRank;
int hypercubDim = (int)ceil(log((double)procNum) / log(2.0)), mask =
procNum;
double pivot = 0.0;
MPI_Status status;
//
QSort_serial(procData, procDataSize - 1);
for (int i = hypercubDim; i > 0;
i--)
{
//
PivotDistribution(procData, procDataSize, hypercubDim, mask, i, pivot);
mask = mask >> 1;
//
int pos = GetDataDivisionPos(procData,
procDataSize, pivot);
//
if ( ((procRank & mask) >> (i - 1))
== 0 )
{
sendData = &procData[pos + 1];
sendDataSize = procDataSize - pos - 1;
if (sendDataSize < 0) sendDataSize = 0;
commProcRank = procRank + mask;
data = &procData[0];
dataSize = pos + 1;
}
else
{
sendData = &procData[0];
sendDataSize = pos + 1;
if (sendDataSize > procDataSize)
sendDataSize = pos;
commProcRank = procRank - mask;
data = &procData[pos + 1];
dataSize = procDataSize - pos - 1;
if (dataSize < 0) dataSize = 0;
}
//
MPI_Sendrecv(&sendDataSize, 1, MPI_INT, commProcRank, 0,
&recvDataSize, 1, MPI_INT, commProcRank, 0, MPI_COMM_WORLD,
&status);
recvData = new double[recvDataSize];
MPI_Sendrecv(sendData, sendDataSize, MPI_DOUBLE, commProcRank, 0,
recvData, recvDataSize, MPI_DOUBLE, commProcRank, 0, MPI_COMM_WORLD,
&status);
mergeDataSize = dataSize + recvDataSize;
mergeData = new double[mergeDataSize];
//
DataMerge(mergeData, data, dataSize, recvData, recvDataSize);
delete [] procData;
delete [] recvData;
procData = mergeData;
procDataSize = mergeDataSize;
}
}