logo
Лекции - Чернышева

Алгоритм распараллеливания.

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

  1. Все процессы кроме последнего процесса высчитывают значение искомой функции в своих внутренних точках и сразу же определяют, достигнута ли необходимая точность

do { pr=1;

for (int, j=1; j<m-1;j++)

for (int i=10; i<n-1;i++){

pn =u[i][j];

u[i][j]=0.25*(ω[i][j]+u[i+1][j]+u[i-1][j]+u[i][j-1]+u[i][j+1]);

if (fabs (pn – u[i][j])>ε)

pr=0;

}

  1. Вычисляем новые значения на границах области;

3. Значения в граничных точках своих подобластей процессы получают от соседних процессов, для которых эти точки – внутренние. Передачу осуществляют за четыре такта. В данном случае передаём столбцы значений

4. Сапсапаритмспаимспи

  1. Все процессы проверяют условие окончания итерационного процесса

Все процессы пересылают на последний процесс свой признак. Он анализирует полученные значения и если хотя бы один полученный признак <> 1 пересылает всем процессам значения признака = 0.

if (rank == size -1) {

int ind = 1;

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

MPI_Recv (& ind, 1, MPI_INT,i,msgtag, MPI_COMM_WORLD,& Status);

if (ind ==0) pr=0

}

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

MPI_Send (& pr,1, MPI_INT,i, msgtag, MPI_COMM_WORLD);

}

else {

MPI_Send (& pr,1, MPI_INT,size-1, msgtag, MPI_COMM_WORLD);

MPI_Recv (& pr, 1, MPI_INT,size-1,msgtag, MPI_COMM_WORLD,& Status);

}

  1. Все процессы последовательно печатают значения искомой функции , используя сквозную нумерацию элементов массива.