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

Sformułowanie problemu PowerPoint PPT Presentation


  • 72 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


Sformu owanie problemu

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


Sformu owanie problemu

Sformuowanie problemu


Sformu owanie problemu

Dyskretyzacja zagadnienia


Sformu owanie problemu

Rozwizanie numeryczne metod iteracji Jacobiego


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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.


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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


Sformu owanie problemu

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

rdo programu


Sformu owanie problemu

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


  • Login