ВУЗ:
Составители:
Рубрика:
- 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++ для обеспечения функциональности Т++