Równoległy algorytm metody Jacobiego rozwiązywania zagadanienia brzegowego dla eliptycznych równ...
Download
1 / 16

Sformu?owanie problemu - PowerPoint PPT Presentation


  • 128 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Sformu?owanie problemu' - nedaa


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
Sformu owanie problemu

Równoległy algorytm metody Jacobiego rozwiązywania zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych


Sformu owanie problemu

Sformułowanie problemu zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych


Sformu owanie problemu

Dyskretyzacja zagadnienia zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych


Sformu owanie problemu

Rozwiązanie numeryczne metodą iteracji Jacobiego zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych


Sformu owanie problemu

Kod szeregowy iteracji Jacobiego zagadanienia brzegowego dla eliptycznych równań różniczkowych cząstkowych

!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



Sformu owanie problemu

Projektowanie komunikacji dla 9 warstw i 3 procesorów

Do obliczenia elementów tablicy u leżących na granicy podziału, procesor o 1 będzie potrzebował elementów u z pierwszego rzędu przypisanego procesorowi 2 oraz ostatniego rzędu przypisanego procesorowi 0.Podobnie, procesory 0 i 2 będą potrzebowały od procesora 1 elementów z odpowiednio pierwszego i ostatniego rzędu jemu przypisanych.


Sformu owanie problemu

Kod iteracji Jacobiego dla warstwy punktów 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


Sformu owanie problemu

Wariant bardzo nieoptymalny (blokujące SEND i RECEIVE) przypisanej danemu procesorowi

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



Sformu owanie problemu

Rozpoczynanie albo od SEND albo od RECEIVE w zależności od rzędu 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


Sformu owanie problemu

Wykorzystanie procedury MPI_Sendrecv rzędu procesora

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


Sformu owanie problemu

Używanie buforowanego SEND rzędu 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

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


Sformu owanie problemu

Połączenie nieblokowanego SEND z WAITALL rzędu procesora

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


Sformu owanie problemu

Program główny: definiowanie topologii w celu podziału procesorów pomiędzy poszczególne warstwy siatki.

Źródło programu


Sformu owanie problemu

Porównanie czasów wykonania równoległego kodu iteracji Jacobiego dla zagadnienia Poissona dla różnych wariantów komunikacji