next up previous contents
Next: Управление исполнительной средой MPI Up: Топологии процессов Previous: Топологические функции низкого уровня   Contents

Прикладной пример

Пример 6.6 Этот пример показывает, как могут использоваться в прикладной программе функции формирования решетки и функции запроса. Дифференциальные уравнения в частных производных, например, уравнение Пуассона, могут быть решены на прямоугольной решетке. Сначала процессы располагаются в двумерной структуре. Каждый процесс затем запрашивает номера соседей в четырех направлениях (вверх, вниз, вправо, влево). Числовая задача решается итерационным методом, детали которого скрыты в подпрограмме.

На каждой итерации каждый процесс вычисляет новые значения для функции в области решетки, за которую он ответственен. Затем процесс на своих границах должен обменяться значениями функции с соседними процессами. Например, подпрограмма обмена может содержать вызов функции MPI_SEND(..., neigh_rank (1), ...) , чтобы затем послать модифицированные значения функции левому соседу (i-1, j).

Integer ndims, num_neihg Logical reorder Parameter (ndims=2,num_neigh=4,reorder=.true.) Integer comm, comm_cart, dims (ndims), neigh_def (ndims), ierr Integer neigh_rank (num_neigh), own_position (ndims), i,j Logical periods (ndims) Real*8 u(0:101,0:101), f(0:101,0:101) Data dims /ndims*0/ Comm = MPI_COMM_WORLD C устанавливает размер решетки и периодичность Call MPI_DIMS_CREATE (comm, ndims, dims, ierr) Periods (1) = .TRUE. Periods (2) = .TRUE. C создает структуру решетки в группе WORLD C и запрашивает собственную позицию Call MPI_CART_CREATE (comm, ndims, dims, periods, reorder, comm_cart, ierr) Call MPI_CART_GET (comm_cart, ndims, dims, periods, own_position, ierr) C просматривает номера соседей. Собственные координаты есть C (i,j). Соседями являются процессы с номерами C (i-1,j), (i+1,j), (i,j-1), (i,j+1) I = own_position(1) J = own_position(2) Neigh_def(1)= i-1 Neigh_def(2)= j Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(1), ierr) Neigh_def(1)= i+1 Neigh_def(2)= j Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(2), ierr) Neigh_def(1)= i Neigh_def(2)= j-1 Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(3), ierr) Neigh_def(1)= i Neigh_def(2)= j+1 Call MPI_CART_RANK (comm_cart, neigh_def, neigh_rank(4), ierr) C инициализация функций решеток и начало итерации Call init (u,f) Do 10 it=1,100 Call relax (u,f) C обмен данными с соседними процессами сall exchange (u, comm_cart, neigh_rank, num_neigh) 10 continue call output (u) end


Alex Otwagin 2002-12-10