Теория и практика параллельных вычислений

         

int Mask, int Iter, double


// Функция выбора и рассылки ведущего элемента
void PivotDistribution (double *pProcData, int ProcDataSize, int Dim,
int Mask, int Iter, double *pPivot) {
MPI_Group WorldGroup;
MPI_Group SubcubeGroup; // Группа процессов — подгиперкуб
MPI_Comm SubcubeComm; // Коммуникатор подгиперкуба
int j = 0;

int GroupNum = ProcNum /(int)pow(2, Dim-Iter);
int *ProcRanks = new int [GroupNum];
// формирование списка рангов процессов для гиперкуба
int StartProc = ProcRank – GroupNum;
if (StartProc < 0) StartProc = 0;
int EndProc = ProcRank + GroupNum;
if (EndProc > ProcNum) EndProc = ProcNum;
for (int proc = StartProc; proc < EndProc; proc++) {
if ((ProcRank & Mask)>>(Iter) == (proc & Mask)>>(Iter)) {
ProcRanks[j++] = proc;
}
}
// Объединение процессов подгиперкуба в одну группу
MPI_Comm_group(MPI_COMM_WORLD, &WorldGroup);
MPI_Group_incl(WorldGroup, GroupNum, ProcRanks, &SubcubeGroup);
MPI_Comm_create(MPI_COMM_WORLD, SubcubeGroup, &SubcubeComm);

// Поиск и рассылка ведущего элемента всем процессам подгиперкуба
if (ProcRank == ProcRanks[0])
*pPivot = pProcData[ProcDataSize / 2];
MPI_Bcast(pPivot, 1, MPI_DOUBLE, 0, SubcubeComm);
MPI_Group_free(&SubcubeGroup);
MPI_Comm_free(&SubcubeComm);
delete [] ProcRanks;
}

Содержание  Назад  







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий