Rwnolegy algorytm metody Jacobiego rozwizywania zagadanienia brzegowego dla eliptycznych rwn...
Sponsored Links
This presentation is the property of its rightful owner.
1 / 16

Sformułowanie problemu PowerPoint PPT Presentation


  • 80 Views
  • Uploaded on
  • Presentation posted in: General

Równoległy algorytm metody Jacobiego rozwiązywania zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych. Sformułowanie problemu. Dyskretyzacja zagadnienia. Rozwiązanie numeryczne metodą iteracji Jacobiego. Kod szeregowy iteracji Jacobiego !Main Loop

Download Presentation

Sformułowanie problemu

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Rwnolegy algorytm metody Jacobiego rozwizywania zagadanienia brzegowego dla eliptycznych rwna rniczkowych czstkowych


Sformuowanie problemu


Dyskretyzacja zagadnienia


Rozwizanie numeryczne metod iteracji Jacobiego


Kod szeregowy iteracji Jacobiego

!Main Loop

DO WHILE(.NOT.converged)

! perform 4 point stencil

DO j=1, n

DO i=1, n

B(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)-&

H*H*F(I,J))

END DO

END DO

! copy result back into array A

DO j=1, n

DO i=1, n

A(i,j) = B(i,j)

END DO

END DO

...

! convergence test omitted

END DO


Przykadowy podzia punktw siatki pomidzy procesory dla 9 warstw i 3 procesorw


Projektowanie komunikacji

Do obliczenia elementw tablicy u lecych na granicy podziau, procesor o 1 bdzie potrzebowa elementw u z pierwszego rzdu przypisanego procesorowi 2 oraz ostatniego rzdu przypisanego procesorowi 0.Podobnie, procesory 0 i 2 bd potrzeboway od procesora 1 elementw z odpowiednio pierwszego i ostatniego rzdu jemu przypisanych.


Kod iteracji Jacobiego dla warstwy punktw siatki przypisanej danemu procesorowi

c

c Perform a Jacobi sweep for a 1-d decomposition.

c Sweep from a into b

c

subroutine sweep1d( a, f, nx, s, e, b )

integer nx, s, e

double precision a(0:nx+1,s-1:e+1), f(0:nx+1,s-1:e+1), + b(0:nx+1,s-1:e+1)

c

integer i, j

double precision h

c

h = 1.0d0 / dble(nx+1)

do 10 j=s, e

do 10 i=1, nx

b(i,j) = 0.25 * (a(i-1,j)+a(i,j+1)+a(i,j-1) + a(i+1,j) - h * h * f(i,j) )

10 continue

return

end


Wariant bardzo nieoptymalny (blokujce SEND i RECEIVE)

subroutine exchng1( a, nx, s, e, comm1d, nbrbottom, nbrtop )

include 'mpif.h'

integer nx, s, e

double precision a(0:nx+1,s-1:e+1)

integer comm1d, nbrbottom, nbrtop

integer status(MPI_STATUS_SIZE), ierr

C

call MPI_SEND( a(1,e), nx, MPI_DOUBLE_PRECISION,

* nbrtop, 0, comm1d, ierr )

call MPI_RECV( a(1,s-1), nx, MPI_DOUBLE_PRECISION,

* nbrbottom, 0, comm1d, status, ierr )

call MPI_SEND( a(1,s), nx, MPI_DOUBLE_PRECISION,

* nbrbottom, 1, comm1d, ierr )

call MPI_RECV( a(1,e+1), nx, MPI_DOUBLE_PRECISION,

* nbrtop, 1, comm1d, status, ierr )

return

end


Czas oczekiwania przez poszczeglne procesory na dane w przypadku zastosowania wariantu 1


Rozpoczynanie albo od SEND albo od RECEIVE w zalenoci od rzdu procesora

subroutine exchng1( a, nx, s, e, comm1d, nbrbottom, nbrtop )

use mpi

integer nx, s, e

double precision a(0:nx+1,s-1:e+1)

integer comm1d, nbrbottom, nbrtop, rank, coord

integer status(MPI_STATUS_SIZE), ierr

!

call MPI_COMM_RANK( comm1d, rank, ierr )

call MPI_CART_COORDS( comm1d, rank, 1, coord, ierr )

if (mod( coord, 2 ) .eq. 0) then

call MPI_SEND( a(1,e), nx, MPI_DOUBLE_PRECISION,

& nbrtop, 0, comm1d, ierr )

call MPI_RECV( a(1,s-1), nx, MPI_DOUBLE_PRECISION,

& nbrbottom, 0, comm1d, status, ierr )

call MPI_SEND( a(1,s), nx, MPI_DOUBLE_PRECISION,

& nbrbottom, 1, comm1d, ierr )

call MPI_RECV( a(1,e+1), nx, MPI_DOUBLE_PRECISION,

& nbrtop, 1, comm1d, status, ierr )

else

call MPI_RECV( a(1,s-1), nx, MPI_DOUBLE_PRECISION,

& nbrbottom, 0, comm1d, status, ierr )

call MPI_SEND( a(1,e), nx, MPI_DOUBLE_PRECISION,

& nbrtop, 0, comm1d, ierr )

call MPI_RECV( a(1,e+1), nx, MPI_DOUBLE_PRECISION,

& nbrtop, 1, comm1d, status, ierr )

call MPI_SEND( a(1,s), nx, MPI_DOUBLE_PRECISION,

& nbrbottom, 1, comm1d, ierr )

endif

return

end


Wykorzystanie procedury MPI_Sendrecv

subroutine exchng1( a, nx, s, e, comm1d, nbrbottom, nbrtop )

include 'mpif.h'

integer nx, s, e

double precision a(0:nx+1,s-1:e+1)

integer comm1d, nbrbottom, nbrtop

integer status(MPI_STATUS_SIZE), ierr

c

call MPI_SENDRECV(a(1,e), nx, MPI_DOUBLE_PRECISION, nbrtop, 0,

& a(1,s-1), nx, MPI_DOUBLE_PRECISION, nbrbottom, 0, comm1d, status, ierr )

call MPI_SENDRECV(a(1,s), nx, MPI_DOUBLE_PRECISION, nbrbottom, 1,

& a(1,e+1), nx, MPI_DOUBLE_PRECISION, nbrtop, 1, comm1d, status, ierr )

return

end


Uywanie buforowanego SEND

subroutine exchng1( a, nx, s, e, comm1d, nbrbottom, nbrtop )

use mpi integer nx, s, e

double precision a(0:nx+1,s-1:e+1)

integer comm1d, nbrbottom, nbrtop

integer status(MPI_STATUS_SIZE), ierr

call MPI_BSEND( a(1,e), nx, MPI_DOUBLE_PRECISION, nbrtop, 0, comm1d, ierr )

call MPI_RECV( a(1,s-1), nx, MPI_DOUBLE_PRECISION, nbrbottom,

& 0, comm1d, status, ierr )

call MPI_BSEND( a(1,s), nx, MPI_DOUBLE_PRECISION, nbrbottom,

& 1, comm1d, ierr )

call MPI_RECV( a(1,e+1), nx, MPI_DOUBLE_PRECISION, nbrtop,

& 1, comm1d, status, ierr )

return

end


Poczenie nieblokowanego SEND z WAITALL

subroutine exchng1( a, nx, s, e, comm1d, nbrbottom, nbrtop )

include 'mpif.h'

integer nx, s, e

double precision a(0:nx+1,s-1:e+1)

integer comm1d, nbrbottom, nbrtop

integer status_array(MPI_STATUS_SIZE,4), ierr, req(4)

C

call MPI_IRECV (a(1,s-1), nx, MPI_DOUBLE_PRECISION, nbrbottom, 0,

* comm1d, req(1), ierr )

call MPI_IRECV (a(1,e+1), nx, MPI_DOUBLE_PRECISION, nbrtop, 1,

* comm1d, req(2), ierr )

call MPI_ISEND (a(1,e), nx, MPI_DOUBLE_PRECISION, nbrtop, 0,

* comm1d, req(3), ierr )

call MPI_ISEND (a(1,s), nx, MPI_DOUBLE_PRECISION, nbrbottom, 1,

* comm1d, req(4), ierr )

C

call MPI_WAITALL ( 4, req, status_array, ierr )

return

end


Program gwny: definiowanie topologii w celu podziau procesorw pomidzy poszczeglne warstwy siatki.

rdo programu


Porwnanie czasw wykonania rwnolegego kodu iteracji Jacobiego dla zagadnienia Poissona dla rnych wariantw komunikacji


  • Login