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

         

Функция для параллельного выполнения прямого


// Функция для параллельного выполнения прямого хода метода Гаусса
void ParallelGaussianElimination (double* pProcRows,
double* pProcVector, int Size, int RowNum) {
double MaxValue; // Значение ведущего элемента на процессоре
int PivotPos; // Положение ведущей строки в полосе линейной
// системы даннного процессора
// Структура для выбора ведущего элемента
struct { double MaxValue; int ProcRank; } ProcPivot, Pivot;
// pPivotRow используется для хранения ведущей строки матрицы и
// соответствующего элемента вектора b
double* pPivotRow = new double [Size+1];
// Итерации прямого хода метода Гаусса
for (int i=0; i

// Нахождение ведущей строки среди строк процесса
double MaxValue = 0;
for (int j=0; j
if ((pProcPivotIter[j] == -1) &&
(MaxValue < fabs(pProcRows[j*Size+i]))) {
MaxValue = fabs(pProcRows[j*Size+i]);
PivotPos = j;
}
}
ProcPivot.MaxValue = MaxValue;
ProcPivot.ProcRank = ProcRank;
// Нахождение ведущего процесса (процесса, который содержит
// максимальное значение переменной MaxValue)
MPI_Allreduce(&ProcPivot, &Pivot, 1, MPI_DOUBLE_INT,
MPI_MAXLOC, MPI_COMM_WORLD);
// Рассылка ведущей строки
if ( ProcRank == Pivot.ProcRank ){
pProcPivotIter[PivotPos]= i; // номер итерации
pParallelPivotPos[i]= pProcInd[ProcRank] + PivotPos;
}
MPI_Bcast(&pParallelPivotPos[i], 1, MPI_INT, Pivot.ProcRank,
MPI_COMM_WORLD);
if ( ProcRank == Pivot.ProcRank ){
// заполнение ведущей строки
for (int j=0; j
pPivotRow[j] = pProcRows[PivotPos*Size + j];
}
pPivotRow[Size] = pProcVector[PivotPos];
}
MPI_Bcast(pPivotRow, Size+1, MPI_DOUBLE, Pivot.ProcRank,
MPI_COMM_WORLD);
ParallelEliminateColumns(pProcRows, pProcVector, pPivotRow,
Size, RowNum, i);
}
}

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







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