Высокопроизводительные вычисления на кластерах. Беликов Д.А - 150 стр.

UptoLike

150
Для параллельных программ распределение вектора x по процес-
сам можно осуществить с помощью вызова процедуры
Call VecGetOwnershipRange(x, istart, iend, ierr)
Аргумент istart указывает на номер первой компоненты вектора,
принадлежащий локальному процессу, а аргумент iend показывает
на единицу больший номер, чем номер последней размещенной
компоненты, принадлежащей локальному процессу. Эта команда
полезна, например, при сборке параллельных векторов.
8.3.3 Пример
Рассмотрим пример c использованием параллельной программы,
использующей библиотеку PETSc. Вычислим
xx+y=y
2
NORM
,
3=y
i
, i=x
i
,
n=i 1..
program main
implicit none
#include "include/finclude/petsc.h"
#include "include/finclude/petscis.h"
#include "include/finclude/petscvec.h"
#include "include/finclude/petscmat.h"
#include "include/finclude/petscviewer.h"
Integer ierr, n, i, istart, iend, rank
double precision v, r
Vec x, y
c устанавливаем размер вектора
n=10
c инициализируем PETSc
Call PetscInitialize(PETSC_NULL_CHARACTER, ierr)
Call MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr)
Call VecCreate(PETSC_COMM_WORLD, x, ierr)
Call VecSetSizes(x,PETSC_DECIDE, n, ierr)
Call VecSetType(x,VECMPI, ierr)
Call VecDuplicate(x, y, ierr)
Call VecGetOwnershipRange(x, istart, iend, ierr)
do i=istart,iend-1
v=dble(i)
Call VecSetValues(x, 1, i, v, INSERT_VALUES, ierr)
end do