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

       

Алгоритм Гаусса решения систем линейных


// Программа 8.1. — Алгоритм Гаусса решения систем линейных уравнений int ProcNum; // Число доступных процессоров int ProcRank; // Ранг текущего процессора int *pParallelPivotPos; // Номера строк, которые были выбраны ведущими int *pProcPivotIter; // Номера итераций, на которых строки // процессора использовались в качестве ведущих void main(int argc, char* argv[]) { double* pMatrix; // Матрица линейной системы double* pVector; // Вектор правых частей линейной системы double* pResult; // Вектор неизвестных double *pProcRows; // Строки матрицы A double *pProcVector; // Блок вектора b double *pProcResult; // Блок вектора x int Size; // Размер матрицы и векторов int RowNum; // Количество строк матрицы double start, finish, duration;
setvbuf(stdout, 0, _IONBF, 0);
MPI_Init ( &argc, &argv ); MPI_Comm_rank ( MPI_COMM_WORLD, &ProcRank ); MPI_Comm_size ( MPI_COMM_WORLD, &ProcNum );
if (ProcRank == 0) printf("Параллельный метод Гаусса для решения систем линейных уравнений\n");
// Выделение памяти и инициализация данных ProcessInitialization(pMatrix, pVector, pResult, pProcRows, pProcVector, pProcResult, Size, RowNum);
// Распределение исходных данных DataDistribution(pMatrix, pProcRows, pVector, pProcVector, Size, RowNum);
// Выполнение параллельного алгоритма Гаусса ParallelResultCalculation(pProcRows, pProcVector, pProcResult, Size, RowNum);
// Сбор найденного вектора неизвестных на ведущем процессе ResultCollection(pProcResult, pResult);
// Завершение процесса вычислений ProcessTermination(pMatrix, pVector, pResult, pProcRows, pProcVector, pProcResult);
MPI_Finalize(); }
Пример 8.1.
Закрыть окно




// Программа 8.1. — Алгоритм Гаусса решения систем линейных уравнений
int ProcNum; // Число доступных процессоров
int ProcRank; // Ранг текущего процессора


int *pParallelPivotPos; // Номера строк, которые были выбраны ведущими
int *pProcPivotIter; // Номера итераций, на которых строки
// процессора использовались в качестве ведущих
void main(int argc, char* argv[]) {
double* pMatrix; // Матрица линейной системы
double* pVector; // Вектор правых частей линейной системы
double* pResult; // Вектор неизвестных
double *pProcRows; // Строки матрицы A
double *pProcVector; // Блок вектора b
double *pProcResult; // Блок вектора x
int Size; // Размер матрицы и векторов
int RowNum; // Количество строк матрицы
double start, finish, duration;
setvbuf(stdout, 0, _IONBF, 0);
MPI_Init ( &argc, &argv );
MPI_Comm_rank ( MPI_COMM_WORLD, &ProcRank );
MPI_Comm_size ( MPI_COMM_WORLD, &ProcNum );

if (ProcRank == 0)
printf("Параллельный метод Гаусса для решения систем линейных уравнений\n");
// Выделение памяти и инициализация данных
ProcessInitialization(pMatrix, pVector, pResult,
pProcRows, pProcVector, pProcResult, Size, RowNum);
// Распределение исходных данных
DataDistribution(pMatrix, pProcRows, pVector, pProcVector,
Size, RowNum);
// Выполнение параллельного алгоритма Гаусса
ParallelResultCalculation(pProcRows, pProcVector, pProcResult, Size,
RowNum);
// Сбор найденного вектора неизвестных на ведущем процессе
ResultCollection(pProcResult, pResult);

// Завершение процесса вычислений
ProcessTermination(pMatrix, pVector, pResult, pProcRows,
pProcVector, pProcResult);
MPI_Finalize();
}

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