Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка для MPI.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.88 Кб
Скачать
  1. Задание

Написать программу пересылающую n байтов по цепочке: от нулевого процесса первому процессу, первый процесс ко второму, и так далее. Последний процесс отсылает данные обратно нулевому процессу. При этом требуется замерить время работы полного цикла, а также время пересылки между отдельными процессами.

  1. Методические указания

В начале работы программы организуцется буфер для передачи. Размер буфера должен браться из аргумента ком. Строки, переданной прогроамме при запуске. Под буфер выделяется место в памяти. После этого можно начатьт передавать данные. Нулевой процесс заполняет этот буфер какими либо данными (можно просто нулями) и посылает их первому процессу. Посылка происходит с помощью команды:

MPI_Send ( буфер, размер буфера, MPI_CHAR, 1, 1, MPI_COMM_WORLD).

При этом происходит посылка первому процессу данного буфера. Стоит обратить внимание на идентификацию посылки. Он должен совпадать у отправителя и у получателя.

Остальные процессы должны по цепочке передавать это сообщение друг другу. Т.е. сначала вызывается функция:

MPI_Recv ( буфер, размер буфера, MPI_CHAR, номер пред. процесса, номер процесса MPI_COMM_WORLD, & statuc);

Потом вызывается

MPI_Send ( буфер, размер буфера, MPI_CHAR, номер след.процесса, номер след.процесса, MPI_COMM_WORLD);

Последний процесс отсылает сообщение первому.

Первый процесс получает от посоледнего данные с помощью функции

MPI Recv ( буфер, размер буфера, MPI_CHAR, номер после. процесса, 0, MPI_COMM_WOPLD & status);

Обратите внимание: сообщения отсылаются строго в последовательности передачи, т.е. фукции MPI_Recv(), MPI_Send() выполняются с блокировкой, т.е. программа ждет получения всего буфера.

  1. Алгоритм

MPI_Init()

Настройка буфера

MPI_Recv()

MPI_Send()

Сообщение о Gdiffnorm получении

Заполнение буфера данными

MPI_Recv()

MPI_Send()

Сообщение о получении

MPI_Finalize()

Да

Нет

Схема прохождения сигнала

Процесс 1

Процесс 2

Процесс 3

Процесс n

Send Recv

Пример выполнения

Посылка данных в цикл (1024 байтов) …

Процесс номер 1 получил 1024 байта от процесса 0 … 0.0001242 сек

Процесс номер 1 получил 1024 байта от процесса 1 … 0.0018743 сек

Процесс номер 1 получил 1024 байта от процесса 2 … 0.0002536 сек

Процесс номер 1 получил данные от процесса 3: общее время… 0.0035021 сек

Лабораторная работа № 5 Матричные вычисления

  1. Подготовка к работе

Необходимо иметь в наличии работающий кластер на базе MPICH Уметь программировать на языке С. Ознакомится с методом решения СЛАУ методом решения Якоби.

  1. Контрольные вопросы

  1. Каким образом организуеия совместная работа всех процессов с одной матрицей.

  2. Как происходит обработка матрицы несколькими процессами.

  3. Что делает каждый процесс с общей матрицей при расчете.

  4. Описишите принцип метода Якоби.

  5. Что делает функция MPI_Allreduce()

  6. С какой точностью производится расчет?

  7. Что такое точечная посылка?

  8. Чем отличается посылка с блокировкой от посылки без блокировки?

  9. Как процесс получает именно свое сообщение?

  10. Почему нужно использовать MPI_WTime для получения времени?

  11. Из-за чего могут возникать задержки в передаче данных между процессами?

  1. Задание

Для решения системы СЛАУ методом Якоби вам требуется решить уравнение Лапласа. Для это требуется создать матрицу и использовать данный алгоритм.

  1. Методические указания

Каждый процесс создает матрицу разрера 12Х12 ячеек, которые будут обрабатываться четырьмя процессами. Исходная матрица разделяется на четыре части, каждая из них обрабатывается отдельным процессом, используя функцию:

for (i,j) xnew [i][ j] = (x[ i + 1][ j] + x[ i- I][j] + x[i][j + 1] + х [i][ j - 1]/4;

for(i,j) x [i][j ]= xnew [i][j].

Для этого нам потребуется каждому процессу иметь доступ к следующим элементам матрицы:

X [0 ][ j ], x[ n – 1] [j], x [ i ][ 0], x [i ] [n - 1].

Каждый процесс будет обрабатывать ¼ часть матрицы, деля ее по горизонтали. Затем результат работы четырех процессов суммируется нулевым процессом.

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1

3 3 3 3 3 3 3 3 3 3

3 3 3 3 3 3 3 3 3 3

2 2 2 2 2 2 2 2 2 2

2 2 2 2 2 2 2 2 2 2

2 2 2 2 2 2 2 2 2 2

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1

В данной примерной матрице номерами указан какую ячейку обрабатывает каждый процесс, где –1 суммируется нулевым процессом. Всего выполняется 100 итераций. Для сбора результатов от процессов используйте функцию MPI_Allreduce() с параметром MPI_SUM.

  1. А

    MPI_Init()

    лгоритм

Xlocal ( I, J) = rank

Xlocal (0, J) = -1

Xlocal (size, J) = -1

MPI Send (xlocal[maxn/size], maxn MPI_DOUBLE, rank + 1, 0, … );

MPI_

MPI_Recv(xlocal[0], maxn, MPI_DOUBLE, rank+1,1,… );

MPI_Send(xloca [1],maxn,MPI_DOUBLE,rank+1,1,…)

MPI_ Send (xlocal [maxn/size+1], maxn

MPI_Double, rank + 1, 0, … );

Co++, diff = 0

xnew(i) [j] = (xI [i] [j+1] +xI [I][ j-1] + x [i+1] [j]+x1 [i-1] [ j ] / 4;

Diffnorm += (xn [ I][ j] – xl [I] [ j] )*(xn [i][ j] – xl [i] [j] );

MPI_ALLreduce (&diffnorm, &gdiffnorm,1,... );

Xlocal [i] [ j] + xnew [i][ j] ;

Gdiffnorm + Gdiffnorm

Вывести тек.значение gdiffnorm

п

MPI-Finalize ()

  1. Пример выполнения

At iteration 1, diff is 3. 791438e + 000

At iteration 2, diff is 3. 948557e + 000

At iteration 3, diff is 3. 324536e + 000

At iteration 4, diff is 3. 014272e + 000

At iteration 5, diff is 3. 266808e + 001

At iteration 6, diff is 3. 992270e + 001

At iteration 7, diff is 3. 063208e + 001

At iteration 8, diff is 3. 354581e + 001

At iteration 9, diff is 3. 796424e + 001

At iteration 10, diff is 3. 345620e + 001

. . .

At iteration 91, diff is 1. 077600e + 002

At iteration 92, diff is 1. 033949e + 002

At iteration 93, diff is 9. 920652e + 003

Final solution is

-1.00000 –1.00000 –1.00000 –1.00000 –1.00000 –1.00000 –1.00000 –1.00000 –1.00000

-1.00000 –1.00000 –1.00000

3.000000 0.892898 0.065635 -0.299648 -0.470180 -0.539828 -0.539828 -0.470180

0.892898 3.00000

3.000000 1.505402 0.668228 -0.043031 -0.151248 -0.043031 0.204468 0.668228

1.505402 3.000000

2.000000 1.459421 0.895371 0.489475 0.241411 0.125389 0.125386 0.241411 0.489475 0.895371 1.459421 2.000000

2.000000 1.435428 0.961518 0.612675 0.389030 0.280790 0.280790 0.389030 0.612675 0.961518 1.435428 2.000000

2.000000 1.318993 0.899183 0.605903 0.415499 0.321700 0.415499 0.605903 0.899183

1.318993 2.000000

1.0000000 0.939427 0.706611 0.491070 0.339122 0.262020 0.262020 0.33122 0.491070 0.706611 0.939427 1.000000

1.000000 0.730175 0.493062 0.307470 0.181674 0.118464 0.118464 0.181674

0.307470 0.493062 0.730175 1.000000

1.000000 0.486443 0.224600 0.059331 –0.044069 –0.094514 -0.094514 -0.044069 0.059331 0.224600 0.486443 1.000000

0.000000 -0.010469 -0.143252 -0.254610 -0.327503 -0.363090 -0.363090 -0.327503 -0.254610 -0.143252 -0.010469 0.000000

0.000000 –0.386115 -0.534537 -0.609828 -0.670933 –0.670933 -0.651626 -0.609828 -0.534537 -0.386115 0.000000

-1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000 –1.000000