Решить систему линейных алгебраических уравнений методом простой итерации.
Решение системы осуществляется по итерационной схеме, используя формулу:
где – вектор решения на
текущей итерации,
– вектор решения на
предыдущей итерации,
b – вектор правой части,
– весовой коэффициент.
Этот метод обеспечивает сходимость метода при условии, что весовой коэффициент положительный и меньше единицы.
Реализация алгоритма простой итерации.
Исходная матрица разрезается на блоки. Т.к. размерность матрицы может нацело не делиться на число компьютеров в топологии, блоков существует два типа,:
1.
блок ширины L,
где L определяется следующим образом: , где n – размерность
матрицы системы, size – число компьютеров в топологии.
2. блок ширины L–1.
Таким образом, получаемая реализация разреза такова: сперва выделяются блоки шириной L, а затем блоки шириной L–1.
Таким же образом происходит разрезание векторов правой части и решения на текущей и предыдущей итерациях.
Main ()
{
{Size-1 компьютер производит считывание и рассылку данных всем остальным}
Continue: // метка продолжения счета
{Увеличить количество итераций}
{Умножить матрицу на
вектор ()}
{Вычислить решение на
текущей итерации: }
if (Условие выхода выполняется)
{Вывести результаты}
else
{Продолжить вычисления (goto continue)}
}
Компьютер, имеющий номер size–1, считывает матрицу и вектор правой части и рассылает всем остальным. После получения данных, происходит умножение матрицы на вектор, используя алгоритм пересылки данных по кольцу, и далее, вычисление решения на текущей итерации.
После получения решения каждый компьютер проверяет по своей части вектора решения условие выхода и посылает полученную информацию компьютеру с номером 0. Нулевой компьютер проводит анализ полученной информации и рассылает всем остальным решение об окончании или продолжении счета.
После окончания счета все компьютеры отсылают свои части вектора решения нулевому компьютеру.
Результаты
Проведем следующие исследования:
1. время счета в зависимости от размерности задачи;
2. при некоторой фиксированной размерности (n=N) построить график зависимости времени счета от числа процессоров в осях t, np.
Для исследований выберем матрицу следующего вида:
А =
Эта матрица является невырожденной, следовательно, система линейных алгебраических уравнений с такой матрицей имеет единственное решение.
Для простой проверки правильности решения будем формировать правую часть таким образом, чтобы вектор решений был единичным.
Время счета в зависимости от размерности задачи
Размерность |
Время счета, сек |
500 |
2 |
1000 |
8 |
1500 |
21 |
2000 |
40 |
2500 |
65 |
3000 |
95 |
3500 |
129 |
4000 |
168 |
4500 |
220 |
5000 |
283 |
![]() |
Число процессоров |
Время, сек |
1 |
95 |
2 |
95 |
3 |
97 |
4 |
95 |
5 |
95 |
6 |
95 |
7 |
95 |
8 |
95 |
![]() |
#include "mpi.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
#define ND 1
#define Eps 1.e-08
double **A, *Y1, *Y0, *Result, tau;
int n,m,L,iter=0;
time_t starttime,finishtime;
int main( int argc, char *argv[])
{
int tag=11,rank,size,start;
MPI_Status st; MPI_Comm ring;
int dims[ND],per[ND],reord=0,prev,next;
int i,j,k,dim,d;
FILE *fp;
int flag=0;
int recv_flag=0;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank); //computer number
MPI_Comm_size(MPI_COMM_WORLD,&size); //total number of computers
per[0]=1; //ring
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.