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

36 Сурак

1. Структура MPI программ в стиле MPMD. Приведите пример.

Структура MPMD (Multiple Program Multiple Data) предполагает, процессы параллельного приложенияимеют различные исходные коды. MPI - программа представляет собой совокупность автономных процессов, функционирующих под управлением своих собственных программ и взаимодействующих посредством стандартного набора библиотечных процедур для передачи и приема сообщений. Таким образом, в самом общем случае MPI - программа реализует MPMD - модель программирования (Multipleprogram - MultipleData).

Эмуляция MPMD

int main(int argc, char *argv[]){

if (rank < .... /* process should run the ocean model */){

ocean( /* arguments */ );

}else{

weather( /* arguments */ );

}}

Структура MPI программы в стиле SPMD. Приведите пример.

Структура SPMD (SingleProgramMultipleData)предполагает, каждый процесс параллельного приложения имеет один и тот же исходный код.

Все процессы исполняют в общем случае различные ветви одной и той же программы. Такой подход обусловлен тем обстоятельством, что задача может быть достаточно естественным образом разбита на подзадачи, решаемые по одному алгоритму. На практике чаще всего встречается именно эта модель программирования (Singleprogram - MultipleData) [1,12].

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

#include <mpi.h>

#include <stdlib.h>

#include <stdio.h>

void main( int argc, char *argv[ ])

{

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

If (myid == 0 ){

/* Работает только корневой процесс */

}

/* Все без исключения процессы выполняеют одну и ту же работу */

if (myid == 0) {

/* Работает только корневой процесс */

}

MPI_Finalize();}

2. Spmd стилінде mpi. Мысал келтіріңіз.

#include <mpi.h>

#include <stdlib.h>

#include <stdio.h>

void main( int argc, char *argv[ ])

{

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

If (myid == 0 ){

/* Работает только корневой процесс */

}

/* Все без исключения процессы выполняеют одну и ту же работу */

if (myid == 0) {

/* Работает только корневой процесс */

}

MPI_Finalize();

}

3. . Напишите программу параллельного вычисления определенного интеграла от фукнции 2*sin(x) в интервале [0,1].

double f(double x)

{return 2*sin(x);}

int main(int argc,char **argv)

{

int size,rank;

MPI_Status status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

float h=0.05,a=0,b=1,s=0.0;

for(int i=rank; a+h*(i+1)<b+h; i+=size)

{ s+=h*f(a+h*(i+1)); }

if(rank!=0)

{ MPI_Send(&s,1,MPI_FLOAT,0,1,MPI_COMM_WORLD); }

if(rank==0)

{ float r;

MPI_Recv(&r,1,MPI_FLOAT,1,1,MPI_COMM_WORLD,&status);

s+=r;

printf("s=%f\n ",s);

}

}

Билеттердің номерлері :

1-108

10-1

11-181

12-21

21-12

2-208

20-2

22-282

13-31

23-32

3-308

30-3

33-383

14-41

24-42

4-408

40-4

44-484

15-51

25-52

5-508

50-5

55-585

16-61

26-62

6-608

60-6

17-71

7-708

18-81

8-808

19-91

9-908

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]