accelerate-0.8.0.0: examples/simple/src/Stencil.hs
{-# LANGUAGE ParallelListComp #-}
module Stencil (stencil_test, stencil_test_ref) where
import Prelude hiding (replicate, zip, map, filter, max, min, not, zipWith)
import qualified Prelude
import Data.Array.Unboxed hiding (Array)
import Data.Array.IArray as IArray hiding (Array)
import Data.Array.Accelerate
stencil_test :: Array DIM2 Float -> Acc (Array DIM2 Float)
stencil_test = stencil stencil2D5 Clamp . use
stencil_test_ref :: UArray (Int, Int) Float
-> UArray (Int, Int) Float
stencil_test_ref arr
= array (bounds arr) [(xy, stencilFun xy) | xy <- indices arr]
where
stencilFun (x, y) = (arr IArray.! (clamp (x-1,y)) +
arr IArray.! (clamp (x+1,y)) +
arr IArray.! (clamp (x,y-1)) +
arr IArray.! (clamp (x,y+1)) -
4*arr IArray.! (clamp (x,y))) / 4
clamp (x, y) = (minx `Prelude.max` x `Prelude.min` maxx,
miny `Prelude.max` y `Prelude.min` maxy)
where
((minx, miny), (maxx, maxy)) = bounds arr
-- some example stencils
stencil1D :: (Elem a, IsFloating a)
=> Stencil3 a -> Exp a
stencil1D (x, y, z) = (x + z - 2 * y) / 2
stencil2D5 :: (Elem a, IsFloating a)
=> Stencil3x3 a -> Exp a
stencil2D5 ( (_, t, _)
, (l, m, r)
, (_, b, _)
)
= (t + l + r + b - 4 * m) / 4
stencil2D :: (Elem a, IsFloating a)
=> Stencil3x3 a -> Exp a
stencil2D ( (t1, t2, t3)
, (l , m, r )
, (b1, b2, b3)
)
= (t1/2 + t2 + t3/2 + l + r + b1/2 + b2 + b3/2 - 4 * m) / 4
stencil3D :: (Elem a, IsNum a)
=> Stencil3x3x3 a -> Exp a
stencil3D (front, back, _) = -- 'b4' is the focal point
let ((f1, f2, _),
(f3, f4, _),
_ ) = front
((b1, b2, _),
(b3, b4, _),
_ ) = back
in
f1 + f2 + f3 + f4 + b1 + b2 + b3 + b4
-- usaging them to ensure the types of the example fit the 'stencil' function
use1D :: Acc (Array DIM1 Float) -> Acc (Array DIM1 Float)
use1D arr = stencil stencil1D Clamp arr
use2D5 :: Acc (Array DIM2 Float) -> Acc (Array DIM2 Float)
use2D5 arr = stencil stencil2D5 Clamp arr
use2D :: Acc (Array DIM2 Float) -> Acc (Array DIM2 Float)
use2D arr = stencil stencil2D Clamp arr
use3D :: Acc (Array DIM3 Float) -> Acc (Array DIM3 Float)
use3D arr = stencil stencil3D Clamp arr