Параллельные вычисления. Баканов В.М. - 122 стр.

UptoLike

Составители: 

- 122 -
DO IT = 1, ITMAX
DO J = 1, ncol
DO I = 1, nrow
A(I, J) = B(I, J)
ENDDO
ENDDO
C Copying shadow elements of array A from
C neighboring processors before loop execution
call MPI_Irecv(A(1,0),nrow,MPI_DOUBLE_PRECISION,pleft,1235,MPI_COMM_WORLD,req(1),ierr)
call MPI_Isend(A(1,ncol),nrow,MPI_DOUBLE_PRECISION,pright,1235,MPI_COMM_WORLD,
+ req(2),ierr)
call MPI_Irecv(A(1,ncol+1),nrow,MPI_DOUBLE_PRECISION,pright,1236,MPI_COMM_WORLD,
+ req(3),ierr)
call MPI_Isend(A(1,1),nrow,MPI_DOUBLE_PRECISION,pleft,1236,MPI_COMM_WORLD,req(4),ierr)
call MPI_Irecv(A(0,1),1,vectype,pup,1237,MPI_COMM_WORLD,req(5),ierr)
call MPI_Isend(A(nrow,1),1,vectype,pdown,1237,MPI_COMM_WORLD,req(6),ierr)
call MPI_Irecv(A(nrow+1,1),1,vectype,pdown,1238,MPI_COMM_WORLD,req(7),ierr)
call MPI_Isend(A(1,1),1,vectype,pup,1238,MPI_COMM_WORLD,req(8),ierr)
call MPI_Waitall(8,req,status,ierr)
DO J = 2, ncol-1
DO I = 2, nrow-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J) + A( I, J+1 )) / 4
ENDDO
ENDDO
ENDDO
call MPI_Finalize(ierr)
END
Приложение 2.
Параллельная Fortran-программа c использованием
OpenMP (вычисление числа
π
, по материалам [9])
Цветом (насыщенностью) выделены относящиеся к OpenMP структуры
PROGRAM COMPUTE_PI
parameter (n = 1000)
integer i
double precision w,x,sum,pi,f,a
f(a) = 4.D0/(1.D0+a*a)
w = 1.0D0/n
sum = 0.0D0;
!$OMP PARALLEL DO PRIVATE(x), SHARED(w)
!$OMP& REDUCTION(+:sum)
do i=1,n
x = w*(i - 0.5D0)
sum = sum + f(x)
enddo
pi = w * sum
print *, 'pi = ',pi
stop
end
Приложение 3.
Программа рекурсивного обхода дерева
(язык T++, основная часть кода).
// Специальный заголовочный файл txx переопределяет (с помощью макроопределений)
// все ключевые слова, добавленные в язык C++ для обеспечения функциональности Т++
                                            - 122 -

 DO IT = 1, ITMAX
  DO J = 1, ncol
   DO I = 1, nrow
   A(I, J) = B(I, J)
   ENDDO
  ENDDO
C Copying shadow elements of array A from
C neighboring processors before loop execution
 call MPI_Irecv(A(1,0),nrow,MPI_DOUBLE_PRECISION,pleft,1235,MPI_COMM_WORLD,req(1),ierr)
 call MPI_Isend(A(1,ncol),nrow,MPI_DOUBLE_PRECISION,pright,1235,MPI_COMM_WORLD,
+ req(2),ierr)
 call MPI_Irecv(A(1,ncol+1),nrow,MPI_DOUBLE_PRECISION,pright,1236,MPI_COMM_WORLD,
+ req(3),ierr)
 call MPI_Isend(A(1,1),nrow,MPI_DOUBLE_PRECISION,pleft,1236,MPI_COMM_WORLD,req(4),ierr)
 call MPI_Irecv(A(0,1),1,vectype,pup,1237,MPI_COMM_WORLD,req(5),ierr)
 call MPI_Isend(A(nrow,1),1,vectype,pdown,1237,MPI_COMM_WORLD,req(6),ierr)
 call MPI_Irecv(A(nrow+1,1),1,vectype,pdown,1238,MPI_COMM_WORLD,req(7),ierr)
 call MPI_Isend(A(1,1),1,vectype,pup,1238,MPI_COMM_WORLD,req(8),ierr)
 call MPI_Waitall(8,req,status,ierr)
 DO J = 2, ncol-1
 DO I = 2, nrow-1
  B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J) + A( I, J+1 )) / 4
 ENDDO
 ENDDO
ENDDO
 call MPI_Finalize(ierr)
 END
                                                                             Приложение 2.

                                       Параллельная Fortran-программа c использованием
                                       OpenMP (вычисление числа π , по материалам [9])

 Цветом (насыщенностью) выделены относящиеся к OpenMP структуры
  PROGRAM COMPUTE_PI
  parameter (n = 1000)
  integer i
  double precision w,x,sum,pi,f,a
  f(a) = 4.D0/(1.D0+a*a)
  w = 1.0D0/n
  sum = 0.0D0;
!$OMP PARALLEL DO PRIVATE(x), SHARED(w)
!$OMP& REDUCTION(+:sum)
  do i=1,n
    x = w*(i - 0.5D0)
    sum = sum + f(x)
  enddo
  pi = w * sum
  print *, 'pi = ',pi
  stop
  end
                                                                             Приложение 3.

                                                      Программа рекурсивного обхода дерева
                                                            (язык T++, основная часть кода).
// Специальный заголовочный файл txx переопределяет (с помощью макроопределений)
// все ключевые слова, добавленные в язык C++ для обеспечения функциональности Т++