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

         

и рассылки ведущего элемента void


// Функция выбора и рассылки ведущего элемента 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; }
Пример 9.2.
Закрыть окно



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







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