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

3.Массивтемаксималсандыесептеупараллельдіпрограммасынжазыңыз.

int main(intargc,char **argv)

{

intsize,rank,i,n=12;

float a[]={10.0,-1.0,2.0,3.0,7.0,6.0,3.0,1.0,-2.0,4.0,-9.0,20.0};

MPI_Status status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

float f=0,max=0,maxo=0;

intnachalo,konec,shag;

shag=n/(size-1);

if(rank!=size-1)

{

nachalo=rank*shag;

konec=rank*shag+shag;

max=a[nachalo];

for(i=nachalo;i<konec;i++)

if(a[i]>max)

max=a[i];

MPI_Send(&max,1,MPI_FLOAT,size-1,1,MPI_COMM_WORLD);

}

if(rank==size-1){

maxo=-32000;

for(i=0;i<size-1;i++)

{ MPI_Recv(&max,1,MPI_FLOAT,i,1,MPI_COMM_WORLD,&status);

if(maxo<max)

maxo=max; }

printf("%f\n",maxo);

}

MPI_Finalize();

}

6 Сурак

1.Флинна таксономиясы. Мisd, мimd архитектуралары.

При программировании для сетевых кластеров используется SPMD-технология (SingleProgram – MultipleData, одна программа – множественные данные). Идея SPMD в том, чтобы поделить большой массив информации между одинаковыми процессами, которые будут вести обработку своей части данных. В случае SPMD-подхода достаточно рассылать время от времени процессам блоки данных, которые требуют трудоемкой обработки, а затем собирать результаты их работы. Если время обработки блока данных одной машиной значительно больше, чем время пересылки этого блока по сети, то сетевая кластерная система становится очень эффективной.

Именно такой подход используется в MPI. Здесь всегда есть основной процесс, который производит распределение данных по другим машинам, а после окончания вычислений собирает результаты и показывает их пользователю. Обычно процесс-мастер после распределения данных также выполняет обработку их части, чтобы использовать ресурсы системы наиболее эффективно.

Пример программы в стиле SPMD

ProgramExample3d

Implicit None

Include 'mpif.h'

Integer Size, Rank, Ierr, I, N

Double Precision Sum, GSum, A, B, time1, time2, Al, Bl, X, F

! Пределы интегрирования

Parameter (A=0.d0, B=1.d0)

! Подынтегральная функция

F(x)=DLog(1/x)

Call MPI_INIT(Ierr)

Call MPI_COMM_SIZE(MPI_COMM_WORLD, Size, Ierr)

Call MPI_COMM_RANK(MPI_COMM_WORLD, Rank, Ierr)

! «0»-процессзасекаетвремя

If (Rank.eq.0) time1 = MPI_WTime()

! Каждый процесс определяет свои пределы интегрирования

! и число интервалов разбиения

Al = A+(B-A)*Rank/Size

Bl = Al+(B-A)/Size

N = 1000000

! Каждый процесс определяет свою частичную сумму

Sum = 0

Do I = 1,N

X = Al+(Bl-Al)*(I-0.5d0)/N

Sum = Sum + F(X)

End Do

! «0»-процесс получает результат суммирования частичных сумм

Call MPI_REDUCE(Sum, GSum, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, Ierr)

If (Rank.eq.0) Then

time2 = MPI_WTime()

GSum = GSum/(N*Size)

Write (6,*) 'Result=',GSum,' Error=',1-GSum, ' Time=',time2 - time1

End If

Call MPI_FINALIZE(Ierr)

Stop

EndProgram

MPI продолжает активно развиваться и совершенствовать механизмы работы в сетевом кластере. Так, начиная с версии 2.0, в MPI появилась возможность запускать новые процессы из уже исполняющихся MPI-программ. Это необходимо для реализации модели обработки информации MPMD (MultipleProgram – MultipleData ). Для этого используется процедура:

int MPI_Comm_spawn(char *command, char *argv[],

intmaxprocs, MPI_Info info,

int root, MPI_Commcomm, MPI_Comm *intercomm, intarray_of_errcodes[])

Эта подпрограмма запускает maxprocs процессов, обозначенных командой command с аргументами, находящимися в массиве строк argv. В зависимости от реализации стандарта система может запустить меньшее количество процессов или выдать ошибки при невозможности запустить maxprocs процессов.

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