1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
! Tiled fortran stencil
SUBROUTINE stencilftiled(A, B, N, iters)
INTEGER N, iters
DOUBLE PRECISION A(N,N,N), B(N,N,N)
INTEGER z
DOUBLE PRECISION c
c = 1 / 7.
DO z=1,iters
CALL tiledStencil(A, B, N, c)
CALL tiledStencil(B, A, N, c)
ENDDO
RETURN
END
SUBROUTINE tiledStencil(A, B, N, c)
INTEGER N
DOUBLE PRECISION A(N,N,N), B(N,N,N)
DOUBLE PRECISION c
INTEGER i,j,k,bi,bj,bk,ni,nj,nk
INTEGER blockSize
blockSize = 16
DO bi=2,N-1,blockSize
DO bj=2,N-1,blockSize
DO bk=2,N-1,blockSize
ni = min(bi+blockSize-1,N-1)
nj = min(bj+blockSize-1,N-1)
nk = min(bk+blockSize-1,N-1)
DO k=bk,nk
DO j=bj,nj
DO i=bi,ni
A(i,j,k) = c * (B(i,j,k) + B(i+1,j,k) + B(i-1,j,k)
. + B(i,j+1,k) + B(i,j-1,k) + B(i,j,k+1) + B(i,j,k-1))
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
RETURN
END
|