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

3. Решение 3-мерного уравнения Лапласа методом 1-мерной декомпозиции.

MPI_CommGridComm;

intsize,rank,i;

intix,iy,iz;

intx,y,z,X=10,Y=10,Z=10;

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&size);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Status status;

y=Y/size+2;

double matrix[X][y][Z],vecUP[X][Z],vecDOWN[X][Z];

if(rank==0)

{

for(ix=1;ix<X-1;ix++)

{

for(iz=1;iz<Z-1;iz++)

{

matrix[ix][1][iz]=1;

}

}

for(ix=1;ix<X-1;ix++)

{

for(iy=2;iy<y-1;iy++)

{

for(iz=1;iz<Z-1;iz++)

{

matrix[ix][iy][iz]=0;

}

}

}

}else

{

for(ix=1;ix<X-1;ix++)

{

for(iy=1;iy<y-1;iy++)

{

for(iz=1;iz<Z-1;iz++)

{

matrix[ix][iy][iz]=0;

}

}

}

}

for(inti=0;i<10;i++)

{

if(rank<size-1)

{

for(ix=0;ix<X;ix++)

{

for(iz=0;iz<Z;iz++)

{

vecUP[ix][iz]=matrix[ix][y-2][iz];

}

}

MPI_Send(vecUP,X*Z,MPI_FLOAT,rank+1,rank,MPI_COMM_WORLD);

MPI_Recv(vecUP,X*Z,MPI_FLOAT,rank+1,rank+1,MPI_COMM_WORLD,&status);

for(ix=0;ix<X;ix++)

{

for(iz=0;iz<Z;iz++)

{

matrix[ix][y-1][iz]=vecUP[ix][iz];

}

}

}

if(rank>0)

{

MPI_Recv(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank-1,MPI_COMM_WORLD,&status);

for(ix=0;ix<X;ix++)

{

for(iz=0;iz<Z;iz++)

{

matrix0[ix][0][iz]=vecDOWN[ix][iz];

vecDOWN[ix][iz]=matrix[ix][1][iz];

}

}

MPI_Send(vecDOWN,X*Z,MPI_FLOAT,rank-1,rank,MPI_COMM_WORLD);

}

for(iz=1;iz<Z-1;iz++)

{

for(iy=1;iy<y-1;iy++)

{

if(rank==0&&iy==1){continue;}

if(rank==size-1&&iy==y-2){break;}

for(ix=1;ix<X-1;ix++)

{

matrix[ix][iy][iz]=matrix[ix+1][iy][iz]+matrix[ix-1][iy][iz]+matrix[ix][iy+1][iz];

matrix[ix][iy][iz]+=matrix[ix][iy-1][iz]+matrix[ix][iy][iz+1]+matrix[ix][iy][iz-1];

matrix[ix][iy][iz]/=6;

}

}

}

}while(stop==0);

MPI_Finalize();

return 0;

}

4 Сурак

1.Примеры программ в стиле spmd и mpmd

При программировании для сетевых кластеров используется SPMD-технология (Single Program – Multiple Data, одна программа – множественные данные). Идея 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

End Program

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

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

int maxprocs, MPI_Info info,

int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[])

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

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