Новости
О Центре
Кластер
Обучение
Основной курс по параллельному программированию
Учебные курсы
Магистратура
Дополнительное образование
Работы студентов
Библиотека
Исследования
Конференции
Полезные ссылки
NVIDIA
Контакты
О сайте
Имя:
Пароль:
запомнить:
Забыли пароль? Регистрация

Параллельная схема

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;

}

}

Новости

22.10.2012
04.09.2012
05.04.2012
06.03.2012
02.03.2012