Poissong equation with parallel
  • 개요
    • poissong방정식을 fdm의 방식으로 차분화하고 이를 parallel방법을 이용하여 여러개의 cpu로 연산을 하게 된다.
    • 모든 격자는 같은 크기를 가진것으로 가정하여 단순화 하였다.
    • 계산 영역의 크기는 1 x 1의 단위 크기의 2차원으로 가정 하였다.
    • 소스코드는 여기에서 받을 수 있다.(zip형식으로 되어 있음)

     

  • poissong 방정식과 차분화
    • governer equation : del ^2 u=f(x,y)
    • boundary condition : u(x,y)=g(x,y)
    • (u(i-1,j) + u(i,j+1) + u(i,j-1) + u(i+1,j) )/h^2 =f(i,j)
    • u(i,j)_k+! = 1/4*(u(i-1,j) + u(i,j+1) + u(i,j-1) + u(i+1,j) -h^2 f(i,j))

     

  • subroutines
    • decomp.cpp : 1차원 parallel을 하기 위한 형상 나누기 배열의 시작값과 끝 값을 결정
    • diff.cpp : 수렴성 판별을 위한 잔차 계산
    • exchng1.cpp : 인접 node에 경계면의 겂을 서로 수수한다.
    • onedbase.cpp : 초기화
    • poissong.cpp : main program
    • sweep.cpp : 각 노드별로 poissong을 계산한다.

     

  • decomp.cpp
    • double diff(double a[MAXN][MAXN],double b[MAXN][MAXN], int ny, int s, int e)
      • 시작과 끝 까지[cpu에 할당된 격자]까지 전 step과 이번 step사이의 잔차를 계사한다.
      • s는 시작 값을 나타내며 e격자의 끝을 나타낸다.

       

  • exchng1.cpp
    • int exchng1(double a[MAXN][MAXN], int nx, int s, int e, int comm1d, int nbrbottom, int nbrtop)
      • MPI_Send, MPI_Recv의 방법을 이용하여 상부면[e]에서 자료를 보내고 하부면[s-1]에서 자료를 받는 경우 자료의 보내고 받음이 순차적으로 일어 나게 되어 대기 시간이 길어진다.
      • 특히 cpu의 개수가 많은 경우 이러한 대기 시간이 더욱 길어 지게 된다.
      • 대신 보내고 받음을 동시에 수행하게 되는 MPI_Sendrecv을 사용하였다. 그러나 cpu의 개수가 적은 경우 MPI_Send, MPI_Recv와 같은 성능을 나타낸다.

       

  • onedbase.cpp
    • int onedinit(double a[MAXN][MAXN], double b[MAXN][MAXN], double f[MAXN][MAXN],int ny, int s, int e)
      • 해당 cpu에 배열을 초기화 한다.
      • 경계조건에 해당하는 i=0,j=0에 대하여는 1.0의 값을 준다.

       

  • poissong.cpp
    • main
      • sweep/exchange을 2회 실시하고 있다.
      • 이것은 매 iteration끝에 a matrix에 결과가 저장되도록 하고 있다.

       

  • sweep.cpp
    • int sweep1d(double a[MAXN][MAXN], double f[MAXN][MAXN], int ny, int s, int e, double b[MAXN][MAXN])
      • 해당 노드의 poissong연산을 수행한다.