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])
|