module Data.Array.Accelerate.AST (
Idx(..), idxToInt, tupleIdxToInt,
Val(..), ValElt(..), prj, prjElt,
PreOpenAfun(..), OpenAfun, PreAfun, Afun, PreOpenAcc(..), OpenAcc(..), Acc,
Stencil(..), StencilR(..),
PreOpenFun(..), OpenFun, PreFun, Fun, PreOpenExp(..), OpenExp, PreExp, Exp, PrimConst(..),
PrimFun(..),
NFDataAcc,
rnfPreOpenAfun, rnfPreOpenAcc, rnfPreOpenFun, rnfPreOpenExp,
showPreAccOp, showPreExpOp,
) where
import Data.List
import Data.Typeable
import Control.DeepSeq
import Data.Array.Accelerate.Type
import Data.Array.Accelerate.Product
import Data.Array.Accelerate.Array.Representation ( SliceIndex(..) )
import Data.Array.Accelerate.Array.Sugar as Sugar
#if __GLASGOW_HASKELL__ < 800
import Data.Array.Accelerate.Error
#endif
data Idx env t where
ZeroIdx :: Idx (env, t) t
SuccIdx :: Idx env t -> Idx (env, s) t
idxToInt :: Idx env t -> Int
idxToInt ZeroIdx = 0
idxToInt (SuccIdx idx) = 1 + idxToInt idx
tupleIdxToInt :: TupleIdx tup e -> Int
tupleIdxToInt ZeroTupIdx = 0
tupleIdxToInt (SuccTupIdx idx) = 1 + tupleIdxToInt idx
data Val env where
Empty :: Val ()
Push :: Val env -> t -> Val (env, t)
deriving instance Typeable Val
data ValElt env where
EmptyElt :: ValElt ()
PushElt :: Elt t
=> ValElt env -> EltRepr t -> ValElt (env, t)
prj :: Idx env t -> Val env -> t
prj ZeroIdx (Push _ v) = v
prj (SuccIdx idx) (Push val _) = prj idx val
#if __GLASGOW_HASKELL__ < 800
prj _ _ = $internalError "prj" "inconsistent valuation"
#endif
prjElt :: Idx env t -> ValElt env -> t
prjElt ZeroIdx (PushElt _ v) = Sugar.toElt v
prjElt (SuccIdx idx) (PushElt val _) = prjElt idx val
#if __GLASGOW_HASKELL__ < 800
prjElt _ _ = $internalError "prjElt" "inconsistent valuation"
#endif
data PreOpenAfun acc aenv t where
Abody :: Arrays t => acc aenv t -> PreOpenAfun acc aenv t
Alam :: Arrays a => PreOpenAfun acc (aenv, a) t -> PreOpenAfun acc aenv (a -> t)
type OpenAfun = PreOpenAfun OpenAcc
type PreAfun acc = PreOpenAfun acc ()
type Afun = OpenAfun ()
newtype OpenAcc aenv t = OpenAcc (PreOpenAcc OpenAcc aenv t)
type Acc = OpenAcc ()
deriving instance Typeable PreOpenAcc
deriving instance Typeable OpenAcc
data PreOpenAcc acc aenv a where
Alet :: (Arrays bndArrs, Arrays bodyArrs)
=> acc aenv bndArrs
-> acc (aenv, bndArrs) bodyArrs
-> PreOpenAcc acc aenv bodyArrs
Avar :: Arrays arrs
=> Idx aenv arrs
-> PreOpenAcc acc aenv arrs
Atuple :: (Arrays arrs, IsAtuple arrs)
=> Atuple (acc aenv) (TupleRepr arrs)
-> PreOpenAcc acc aenv arrs
Aprj :: (Arrays arrs, IsAtuple arrs, Arrays a)
=> TupleIdx (TupleRepr arrs) a
-> acc aenv arrs
-> PreOpenAcc acc aenv a
Apply :: (Arrays arrs1, Arrays arrs2)
=> PreOpenAfun acc aenv (arrs1 -> arrs2)
-> acc aenv arrs1
-> PreOpenAcc acc aenv arrs2
Aforeign :: (Arrays as, Arrays bs, Foreign asm)
=> asm (as -> bs)
-> PreAfun acc (as -> bs)
-> acc aenv as
-> PreOpenAcc acc aenv bs
Acond :: Arrays arrs
=> PreExp acc aenv Bool
-> acc aenv arrs
-> acc aenv arrs
-> PreOpenAcc acc aenv arrs
Awhile :: Arrays arrs
=> PreOpenAfun acc aenv (arrs -> Scalar Bool)
-> PreOpenAfun acc aenv (arrs -> arrs)
-> acc aenv arrs
-> PreOpenAcc acc aenv arrs
Use :: Arrays arrs
=> ArrRepr arrs
-> PreOpenAcc acc aenv arrs
Unit :: Elt e
=> PreExp acc aenv e
-> PreOpenAcc acc aenv (Scalar e)
Reshape :: (Shape sh, Shape sh', Elt e)
=> PreExp acc aenv sh
-> acc aenv (Array sh' e)
-> PreOpenAcc acc aenv (Array sh e)
Generate :: (Shape sh, Elt e)
=> PreExp acc aenv sh
-> PreFun acc aenv (sh -> e)
-> PreOpenAcc acc aenv (Array sh e)
Transform :: (Elt a, Elt b, Shape sh, Shape sh')
=> PreExp acc aenv sh'
-> PreFun acc aenv (sh' -> sh)
-> PreFun acc aenv (a -> b)
-> acc aenv (Array sh a)
-> PreOpenAcc acc aenv (Array sh' b)
Replicate :: (Shape sh, Shape sl, Elt slix, Elt e)
=> SliceIndex (EltRepr slix)
(EltRepr sl)
co
(EltRepr sh)
-> PreExp acc aenv slix
-> acc aenv (Array sl e)
-> PreOpenAcc acc aenv (Array sh e)
Slice :: (Shape sh, Shape sl, Elt slix, Elt e)
=> SliceIndex (EltRepr slix)
(EltRepr sl)
co
(EltRepr sh)
-> acc aenv (Array sh e)
-> PreExp acc aenv slix
-> PreOpenAcc acc aenv (Array sl e)
Map :: (Shape sh, Elt e, Elt e')
=> PreFun acc aenv (e -> e')
-> acc aenv (Array sh e)
-> PreOpenAcc acc aenv (Array sh e')
ZipWith :: (Shape sh, Elt e1, Elt e2, Elt e3)
=> PreFun acc aenv (e1 -> e2 -> e3)
-> acc aenv (Array sh e1)
-> acc aenv (Array sh e2)
-> PreOpenAcc acc aenv (Array sh e3)
Fold :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array sh e)
Fold1 :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array sh e)
FoldSeg :: (Shape sh, Elt e, Elt i, IsIntegral i)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> acc aenv (Segments i)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Fold1Seg :: (Shape sh, Elt e, Elt i, IsIntegral i)
=> PreFun acc aenv (e -> e -> e)
-> acc aenv (Array (sh:.Int) e)
-> acc aenv (Segments i)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Scanl :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Scanl' :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e, Array sh e)
Scanl1 :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Scanr :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Scanr' :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> PreExp acc aenv e
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e, Array sh e)
Scanr1 :: (Shape sh, Elt e)
=> PreFun acc aenv (e -> e -> e)
-> acc aenv (Array (sh:.Int) e)
-> PreOpenAcc acc aenv (Array (sh:.Int) e)
Permute :: (Shape sh, Shape sh', Elt e)
=> PreFun acc aenv (e -> e -> e)
-> acc aenv (Array sh' e)
-> PreFun acc aenv (sh -> sh')
-> acc aenv (Array sh e)
-> PreOpenAcc acc aenv (Array sh' e)
Backpermute :: (Shape sh, Shape sh', Elt e)
=> PreExp acc aenv sh'
-> PreFun acc aenv (sh' -> sh)
-> acc aenv (Array sh e)
-> PreOpenAcc acc aenv (Array sh' e)
Stencil :: (Elt e, Elt e', Stencil sh e stencil)
=> PreFun acc aenv (stencil -> e')
-> Boundary (EltRepr e)
-> acc aenv (Array sh e)
-> PreOpenAcc acc aenv (Array sh e')
Stencil2 :: (Elt e1, Elt e2, Elt e',
Stencil sh e1 stencil1,
Stencil sh e2 stencil2)
=> PreFun acc aenv (stencil1 ->
stencil2 -> e')
-> Boundary (EltRepr e1)
-> acc aenv (Array sh e1)
-> Boundary (EltRepr e2)
-> acc aenv (Array sh e2)
-> PreOpenAcc acc aenv (Array sh e')
class (Shape sh, Elt e, IsTuple stencil, Elt stencil) => Stencil sh e stencil where
stencil :: StencilR sh e stencil
stencilAccess :: (sh -> e) -> sh -> stencil
data StencilR sh e pat where
StencilRunit3 :: (Elt e)
=> StencilR DIM1 e (e,e,e)
StencilRunit5 :: (Elt e)
=> StencilR DIM1 e (e,e,e,e,e)
StencilRunit7 :: (Elt e)
=> StencilR DIM1 e (e,e,e,e,e,e,e)
StencilRunit9 :: (Elt e)
=> StencilR DIM1 e (e,e,e,e,e,e,e,e,e)
StencilRtup3 :: (Shape sh, Elt e)
=> StencilR sh e pat1
-> StencilR sh e pat2
-> StencilR sh e pat3
-> StencilR (sh:.Int) e (pat1,pat2,pat3)
StencilRtup5 :: (Shape sh, Elt e)
=> StencilR sh e pat1
-> StencilR sh e pat2
-> StencilR sh e pat3
-> StencilR sh e pat4
-> StencilR sh e pat5
-> StencilR (sh:.Int) e (pat1,pat2,pat3,pat4,pat5)
StencilRtup7 :: (Shape sh, Elt e)
=> StencilR sh e pat1
-> StencilR sh e pat2
-> StencilR sh e pat3
-> StencilR sh e pat4
-> StencilR sh e pat5
-> StencilR sh e pat6
-> StencilR sh e pat7
-> StencilR (sh:.Int) e (pat1,pat2,pat3,pat4,pat5,pat6,pat7)
StencilRtup9 :: (Shape sh, Elt e)
=> StencilR sh e pat1
-> StencilR sh e pat2
-> StencilR sh e pat3
-> StencilR sh e pat4
-> StencilR sh e pat5
-> StencilR sh e pat6
-> StencilR sh e pat7
-> StencilR sh e pat8
-> StencilR sh e pat9
-> StencilR (sh:.Int) e (pat1,pat2,pat3,pat4,pat5,pat6,pat7,pat8,pat9)
instance Elt e => Stencil DIM1 e (e, e, e) where
stencil = StencilRunit3
stencilAccess rf (Z:.y) = (rf' (y 1),
rf' y ,
rf' (y + 1))
where
rf' d = rf (Z:.d)
instance Elt e => Stencil DIM1 e (e, e, e, e, e) where
stencil = StencilRunit5
stencilAccess rf (Z:.y) = (rf' (y 2),
rf' (y 1),
rf' y ,
rf' (y + 1),
rf' (y + 2))
where
rf' d = rf (Z:.d)
instance Elt e => Stencil DIM1 e (e, e, e, e, e, e, e) where
stencil = StencilRunit7
stencilAccess rf (Z:.y) = (rf' (y 3),
rf' (y 2),
rf' (y 1),
rf' y ,
rf' (y + 1),
rf' (y + 2),
rf' (y + 3))
where
rf' d = rf (Z:.d)
instance Elt e => Stencil DIM1 e (e, e, e, e, e, e, e, e, e) where
stencil = StencilRunit9
stencilAccess rf (Z:.y) = (rf' (y 4),
rf' (y 3),
rf' (y 2),
rf' (y 1),
rf' y ,
rf' (y + 1),
rf' (y + 2),
rf' (y + 3),
rf' (y + 4))
where
rf' d = rf (Z:.d)
instance (Stencil (sh:.Int) a row1,
Stencil (sh:.Int) a row2,
Stencil (sh:.Int) a row3) => Stencil (sh:.Int:.Int) a (row1, row2, row3) where
stencil = StencilRtup3 stencil stencil stencil
stencilAccess rf xi = (stencilAccess (rf' (i 1)) ix,
stencilAccess (rf' i ) ix,
stencilAccess (rf' (i + 1)) ix)
where
ix' :. i = invertShape xi
ix = invertShape ix'
rf' d ds = rf $ invertShape (invertShape ds :. d)
instance (Stencil (sh:.Int) a row1,
Stencil (sh:.Int) a row2,
Stencil (sh:.Int) a row3,
Stencil (sh:.Int) a row4,
Stencil (sh:.Int) a row5) => Stencil (sh:.Int:.Int) a (row1, row2, row3, row4, row5) where
stencil = StencilRtup5 stencil stencil stencil stencil stencil
stencilAccess rf xi = (stencilAccess (rf' (i 2)) ix,
stencilAccess (rf' (i 1)) ix,
stencilAccess (rf' i ) ix,
stencilAccess (rf' (i + 1)) ix,
stencilAccess (rf' (i + 2)) ix)
where
ix' :. i = invertShape xi
ix = invertShape ix'
rf' d ds = rf $ invertShape (invertShape ds :. d)
instance (Stencil (sh:.Int) a row1,
Stencil (sh:.Int) a row2,
Stencil (sh:.Int) a row3,
Stencil (sh:.Int) a row4,
Stencil (sh:.Int) a row5,
Stencil (sh:.Int) a row6,
Stencil (sh:.Int) a row7)
=> Stencil (sh:.Int:.Int) a (row1, row2, row3, row4, row5, row6, row7) where
stencil = StencilRtup7 stencil stencil stencil stencil stencil stencil stencil
stencilAccess rf xi = (stencilAccess (rf' (i 3)) ix,
stencilAccess (rf' (i 2)) ix,
stencilAccess (rf' (i 1)) ix,
stencilAccess (rf' i ) ix,
stencilAccess (rf' (i + 1)) ix,
stencilAccess (rf' (i + 2)) ix,
stencilAccess (rf' (i + 3)) ix)
where
ix' :. i = invertShape xi
ix = invertShape ix'
rf' d ds = rf $ invertShape (invertShape ds :. d)
instance (Stencil (sh:.Int) a row1,
Stencil (sh:.Int) a row2,
Stencil (sh:.Int) a row3,
Stencil (sh:.Int) a row4,
Stencil (sh:.Int) a row5,
Stencil (sh:.Int) a row6,
Stencil (sh:.Int) a row7,
Stencil (sh:.Int) a row8,
Stencil (sh:.Int) a row9)
=> Stencil (sh:.Int:.Int) a (row1, row2, row3, row4, row5, row6, row7, row8, row9) where
stencil = StencilRtup9 stencil stencil stencil stencil stencil stencil stencil stencil stencil
stencilAccess rf xi = (stencilAccess (rf' (i 4)) ix,
stencilAccess (rf' (i 3)) ix,
stencilAccess (rf' (i 2)) ix,
stencilAccess (rf' (i 1)) ix,
stencilAccess (rf' i ) ix,
stencilAccess (rf' (i + 1)) ix,
stencilAccess (rf' (i + 2)) ix,
stencilAccess (rf' (i + 3)) ix,
stencilAccess (rf' (i + 4)) ix)
where
ix' :. i = invertShape xi
ix = invertShape ix'
rf' d ds = rf $ invertShape (invertShape ds :. d)
invertShape :: Shape sh => sh -> sh
invertShape = listToShape . reverse . shapeToList
data PreOpenFun (acc :: * -> * -> *) env aenv t where
Body :: Elt t => PreOpenExp acc env aenv t -> PreOpenFun acc env aenv t
Lam :: Elt a => PreOpenFun acc (env, a) aenv t -> PreOpenFun acc env aenv (a -> t)
type OpenFun = PreOpenFun OpenAcc
type PreFun acc = PreOpenFun acc ()
type Fun = OpenFun ()
type OpenExp = PreOpenExp OpenAcc
type PreExp acc = PreOpenExp acc ()
type Exp = OpenExp ()
data PreOpenExp (acc :: * -> * -> *) env aenv t where
Let :: (Elt bnd_t, Elt body_t)
=> PreOpenExp acc env aenv bnd_t
-> PreOpenExp acc (env, bnd_t) aenv body_t
-> PreOpenExp acc env aenv body_t
Var :: Elt t
=> Idx env t
-> PreOpenExp acc env aenv t
Foreign :: (Foreign asm, Elt x, Elt y)
=> asm (x -> y)
-> PreFun acc () (x -> y)
-> PreOpenExp acc env aenv x
-> PreOpenExp acc env aenv y
Const :: Elt t
=> EltRepr t
-> PreOpenExp acc env aenv t
Tuple :: (Elt t, IsTuple t)
=> Tuple (PreOpenExp acc env aenv) (TupleRepr t)
-> PreOpenExp acc env aenv t
Prj :: (Elt t, IsTuple t, Elt e)
=> TupleIdx (TupleRepr t) e
-> PreOpenExp acc env aenv t
-> PreOpenExp acc env aenv e
IndexNil :: PreOpenExp acc env aenv Z
IndexCons :: (Slice sl, Elt a)
=> PreOpenExp acc env aenv sl
-> PreOpenExp acc env aenv a
-> PreOpenExp acc env aenv (sl:.a)
IndexHead :: (Slice sl, Elt a)
=> PreOpenExp acc env aenv (sl:.a)
-> PreOpenExp acc env aenv a
IndexTail :: (Slice sl, Elt a)
=> PreOpenExp acc env aenv (sl:.a)
-> PreOpenExp acc env aenv sl
IndexAny :: Shape sh
=> PreOpenExp acc env aenv (Any sh)
IndexSlice :: (Shape sh, Shape sl, Elt slix)
=> SliceIndex (EltRepr slix) (EltRepr sl) co (EltRepr sh)
-> PreOpenExp acc env aenv slix
-> PreOpenExp acc env aenv sh
-> PreOpenExp acc env aenv sl
IndexFull :: (Shape sh, Shape sl, Elt slix)
=> SliceIndex (EltRepr slix) (EltRepr sl) co (EltRepr sh)
-> PreOpenExp acc env aenv slix
-> PreOpenExp acc env aenv sl
-> PreOpenExp acc env aenv sh
ToIndex :: Shape sh
=> PreOpenExp acc env aenv sh
-> PreOpenExp acc env aenv sh
-> PreOpenExp acc env aenv Int
FromIndex :: Shape sh
=> PreOpenExp acc env aenv sh
-> PreOpenExp acc env aenv Int
-> PreOpenExp acc env aenv sh
Cond :: Elt t
=> PreOpenExp acc env aenv Bool
-> PreOpenExp acc env aenv t
-> PreOpenExp acc env aenv t
-> PreOpenExp acc env aenv t
While :: Elt a
=> PreOpenFun acc env aenv (a -> Bool)
-> PreOpenFun acc env aenv (a -> a)
-> PreOpenExp acc env aenv a
-> PreOpenExp acc env aenv a
PrimConst :: Elt t
=> PrimConst t
-> PreOpenExp acc env aenv t
PrimApp :: (Elt a, Elt r)
=> PrimFun (a -> r)
-> PreOpenExp acc env aenv a
-> PreOpenExp acc env aenv r
Index :: (Shape dim, Elt t)
=> acc aenv (Array dim t)
-> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv t
LinearIndex :: (Shape dim, Elt t)
=> acc aenv (Array dim t)
-> PreOpenExp acc env aenv Int
-> PreOpenExp acc env aenv t
Shape :: (Shape dim, Elt e)
=> acc aenv (Array dim e)
-> PreOpenExp acc env aenv dim
ShapeSize :: Shape dim
=> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv Int
Intersect :: Shape dim
=> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv dim
Union :: Shape dim
=> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv dim
-> PreOpenExp acc env aenv dim
data PrimConst ty where
PrimMinBound :: BoundedType a -> PrimConst a
PrimMaxBound :: BoundedType a -> PrimConst a
PrimPi :: FloatingType a -> PrimConst a
data PrimFun sig where
PrimAdd :: NumType a -> PrimFun ((a, a) -> a)
PrimSub :: NumType a -> PrimFun ((a, a) -> a)
PrimMul :: NumType a -> PrimFun ((a, a) -> a)
PrimNeg :: NumType a -> PrimFun (a -> a)
PrimAbs :: NumType a -> PrimFun (a -> a)
PrimSig :: NumType a -> PrimFun (a -> a)
PrimQuot :: IntegralType a -> PrimFun ((a, a) -> a)
PrimRem :: IntegralType a -> PrimFun ((a, a) -> a)
PrimQuotRem :: IntegralType a -> PrimFun ((a, a) -> (a, a))
PrimIDiv :: IntegralType a -> PrimFun ((a, a) -> a)
PrimMod :: IntegralType a -> PrimFun ((a, a) -> a)
PrimDivMod :: IntegralType a -> PrimFun ((a, a) -> (a, a))
PrimBAnd :: IntegralType a -> PrimFun ((a, a) -> a)
PrimBOr :: IntegralType a -> PrimFun ((a, a) -> a)
PrimBXor :: IntegralType a -> PrimFun ((a, a) -> a)
PrimBNot :: IntegralType a -> PrimFun (a -> a)
PrimBShiftL :: IntegralType a -> PrimFun ((a, Int) -> a)
PrimBShiftR :: IntegralType a -> PrimFun ((a, Int) -> a)
PrimBRotateL :: IntegralType a -> PrimFun ((a, Int) -> a)
PrimBRotateR :: IntegralType a -> PrimFun ((a, Int) -> a)
PrimPopCount :: IntegralType a -> PrimFun (a -> Int)
PrimCountLeadingZeros :: IntegralType a -> PrimFun (a -> Int)
PrimCountTrailingZeros :: IntegralType a -> PrimFun (a -> Int)
PrimFDiv :: FloatingType a -> PrimFun ((a, a) -> a)
PrimRecip :: FloatingType a -> PrimFun (a -> a)
PrimSin :: FloatingType a -> PrimFun (a -> a)
PrimCos :: FloatingType a -> PrimFun (a -> a)
PrimTan :: FloatingType a -> PrimFun (a -> a)
PrimAsin :: FloatingType a -> PrimFun (a -> a)
PrimAcos :: FloatingType a -> PrimFun (a -> a)
PrimAtan :: FloatingType a -> PrimFun (a -> a)
PrimSinh :: FloatingType a -> PrimFun (a -> a)
PrimCosh :: FloatingType a -> PrimFun (a -> a)
PrimTanh :: FloatingType a -> PrimFun (a -> a)
PrimAsinh :: FloatingType a -> PrimFun (a -> a)
PrimAcosh :: FloatingType a -> PrimFun (a -> a)
PrimAtanh :: FloatingType a -> PrimFun (a -> a)
PrimExpFloating :: FloatingType a -> PrimFun (a -> a)
PrimSqrt :: FloatingType a -> PrimFun (a -> a)
PrimLog :: FloatingType a -> PrimFun (a -> a)
PrimFPow :: FloatingType a -> PrimFun ((a, a) -> a)
PrimLogBase :: FloatingType a -> PrimFun ((a, a) -> a)
PrimTruncate :: FloatingType a -> IntegralType b -> PrimFun (a -> b)
PrimRound :: FloatingType a -> IntegralType b -> PrimFun (a -> b)
PrimFloor :: FloatingType a -> IntegralType b -> PrimFun (a -> b)
PrimCeiling :: FloatingType a -> IntegralType b -> PrimFun (a -> b)
PrimIsNaN :: FloatingType a -> PrimFun (a -> Bool)
PrimAtan2 :: FloatingType a -> PrimFun ((a, a) -> a)
PrimLt :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimGt :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimLtEq :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimGtEq :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimEq :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimNEq :: ScalarType a -> PrimFun ((a, a) -> Bool)
PrimMax :: ScalarType a -> PrimFun ((a, a) -> a )
PrimMin :: ScalarType a -> PrimFun ((a, a) -> a )
PrimLAnd :: PrimFun ((Bool, Bool) -> Bool)
PrimLOr :: PrimFun ((Bool, Bool) -> Bool)
PrimLNot :: PrimFun (Bool -> Bool)
PrimOrd :: PrimFun (Char -> Int)
PrimChr :: PrimFun (Int -> Char)
PrimBoolToInt :: PrimFun (Bool -> Int)
PrimFromIntegral :: IntegralType a -> NumType b -> PrimFun (a -> b)
PrimToFloating :: NumType a -> FloatingType b -> PrimFun (a -> b)
PrimCoerce :: ScalarType a -> ScalarType b -> PrimFun (a -> b)
instance NFData (OpenAfun aenv f) where
rnf = rnfOpenAfun
instance NFData (OpenAcc aenv t) where
rnf = rnfOpenAcc
instance NFData (OpenExp env aenv t) where
rnf = rnfPreOpenExp rnfOpenAcc
instance NFData (OpenFun env aenv t) where
rnf = rnfPreOpenFun rnfOpenAcc
type NFDataAcc acc = forall aenv t. acc aenv t -> ()
rnfIdx :: Idx env t -> ()
rnfIdx ZeroIdx = ()
rnfIdx (SuccIdx ix) = rnfIdx ix
rnfTupleIdx :: TupleIdx t e -> ()
rnfTupleIdx ZeroTupIdx = ()
rnfTupleIdx (SuccTupIdx tix) = rnfTupleIdx tix
rnfOpenAfun :: OpenAfun aenv t -> ()
rnfOpenAfun = rnfPreOpenAfun rnfOpenAcc
rnfOpenAcc :: OpenAcc aenv t -> ()
rnfOpenAcc (OpenAcc pacc) = rnfPreOpenAcc rnfOpenAcc pacc
rnfPreOpenAfun :: NFDataAcc acc -> PreOpenAfun acc aenv t -> ()
rnfPreOpenAfun rnfA (Abody b) = rnfA b
rnfPreOpenAfun rnfA (Alam f) = rnfPreOpenAfun rnfA f
rnfPreOpenAcc :: forall acc aenv t. NFDataAcc acc -> PreOpenAcc acc aenv t -> ()
rnfPreOpenAcc rnfA pacc =
let
rnfAF :: PreOpenAfun acc aenv' t' -> ()
rnfAF = rnfPreOpenAfun rnfA
rnfE :: PreOpenExp acc env' aenv' t' -> ()
rnfE = rnfPreOpenExp rnfA
rnfF :: PreOpenFun acc env' aenv' t' -> ()
rnfF = rnfPreOpenFun rnfA
rnfB :: forall aenv' sh e. Elt e => acc aenv' (Array sh e) -> Boundary (EltRepr e) -> ()
rnfB _ = rnfBoundary (eltType (undefined::e))
in
case pacc of
Alet bnd body -> rnfA bnd `seq` rnfA body
Avar ix -> rnfIdx ix
Atuple atup -> rnfAtuple rnfA atup
Aprj tix a -> rnfTupleIdx tix `seq` rnfA a
Apply afun acc -> rnfAF afun `seq` rnfA acc
Aforeign asm afun a -> rnf (strForeign asm) `seq` rnfAF afun `seq` rnfA a
Acond p a1 a2 -> rnfE p `seq` rnfA a1 `seq` rnfA a2
Awhile p f a -> rnfAF p `seq` rnfAF f `seq` rnfA a
Use arrs -> rnfArrays (arrays (undefined::t)) arrs
Unit x -> rnfE x
Reshape sh a -> rnfE sh `seq` rnfA a
Generate sh f -> rnfE sh `seq` rnfF f
Transform sh p f a -> rnfE sh `seq` rnfF p `seq` rnfF f `seq` rnfA a
Replicate slice sh a -> rnfSliceIndex slice `seq` rnfE sh `seq` rnfA a
Slice slice a sh -> rnfSliceIndex slice `seq` rnfE sh `seq` rnfA a
Map f a -> rnfF f `seq` rnfA a
ZipWith f a1 a2 -> rnfF f `seq` rnfA a1 `seq` rnfA a2
Fold f z a -> rnfF f `seq` rnfE z `seq` rnfA a
Fold1 f a -> rnfF f `seq` rnfA a
FoldSeg f z a s -> rnfF f `seq` rnfE z `seq` rnfA a `seq` rnfA s
Fold1Seg f a s -> rnfF f `seq` rnfA a `seq` rnfA s
Scanl f z a -> rnfF f `seq` rnfE z `seq` rnfA a
Scanl1 f a -> rnfF f `seq` rnfA a
Scanl' f z a -> rnfF f `seq` rnfE z `seq` rnfA a
Scanr f z a -> rnfF f `seq` rnfE z `seq` rnfA a
Scanr1 f a -> rnfF f `seq` rnfA a
Scanr' f z a -> rnfF f `seq` rnfE z `seq` rnfA a
Permute f d p a -> rnfF f `seq` rnfA d `seq` rnfF p `seq` rnfA a
Backpermute sh f a -> rnfE sh `seq` rnfF f `seq` rnfA a
Stencil f b a -> rnfF f `seq` rnfB a b `seq` rnfA a
Stencil2 f b1 a1 b2 a2 -> rnfF f `seq` rnfB a1 b1 `seq` rnfB a2 b2 `seq` rnfA a1 `seq` rnfA a2
rnfAtuple :: NFDataAcc acc -> Atuple (acc aenv) t -> ()
rnfAtuple _ NilAtup = ()
rnfAtuple rnfA (SnocAtup tup a) = rnfAtuple rnfA tup `seq` rnfA a
rnfArrays :: ArraysR arrs -> arrs -> ()
rnfArrays ArraysRunit () = ()
rnfArrays ArraysRarray arr = rnf arr
rnfArrays (ArraysRpair ar1 ar2) (a1,a2) = rnfArrays ar1 a1 `seq` rnfArrays ar2 a2
rnfBoundary :: TupleType t -> Boundary t -> ()
rnfBoundary _ Clamp = ()
rnfBoundary _ Mirror = ()
rnfBoundary _ Wrap = ()
rnfBoundary t (Constant c) = rnfConst t c
rnfPreOpenFun :: NFDataAcc acc -> PreOpenFun acc env aenv t -> ()
rnfPreOpenFun rnfA (Body b) = rnfPreOpenExp rnfA b
rnfPreOpenFun rnfA (Lam f) = rnfPreOpenFun rnfA f
rnfPreOpenExp :: forall acc env aenv t. NFDataAcc acc -> PreOpenExp acc env aenv t -> ()
rnfPreOpenExp rnfA topExp =
let
rnfF :: PreOpenFun acc env' aenv' t' -> ()
rnfF = rnfPreOpenFun rnfA
rnfE :: PreOpenExp acc env' aenv' t' -> ()
rnfE = rnfPreOpenExp rnfA
in
case topExp of
Let bnd body -> rnfE bnd `seq` rnfE body
Var ix -> rnfIdx ix
Foreign asm f x -> rnf (strForeign asm) `seq` rnfF f `seq` rnfE x
Const t -> rnfConst (eltType (undefined::t)) t
Tuple t -> rnfTuple rnfA t
Prj ix e -> rnfTupleIdx ix `seq` rnfE e
IndexNil -> ()
IndexCons sh sz -> rnfE sh `seq` rnfE sz
IndexHead sh -> rnfE sh
IndexTail sh -> rnfE sh
IndexAny -> ()
IndexSlice slice slix sh -> rnfSliceIndex slice `seq` rnfE slix `seq` rnfE sh
IndexFull slice slix sl -> rnfSliceIndex slice `seq` rnfE slix `seq` rnfE sl
ToIndex sh ix -> rnfE sh `seq` rnfE ix
FromIndex sh ix -> rnfE sh `seq` rnfE ix
Cond p e1 e2 -> rnfE p `seq` rnfE e1 `seq` rnfE e2
While p f x -> rnfF p `seq` rnfF f `seq` rnfE x
PrimConst c -> rnfPrimConst c
PrimApp f x -> rnfPrimFun f `seq` rnfE x
Index a ix -> rnfA a `seq` rnfE ix
LinearIndex a ix -> rnfA a `seq` rnfE ix
Shape a -> rnfA a
ShapeSize sh -> rnfE sh
Intersect sh1 sh2 -> rnfE sh1 `seq` rnfE sh2
Union sh1 sh2 -> rnfE sh1 `seq` rnfE sh2
rnfTuple :: NFDataAcc acc -> Tuple (PreOpenExp acc env aenv) t -> ()
rnfTuple _ NilTup = ()
rnfTuple rnfA (SnocTup t e) = rnfTuple rnfA t `seq` rnfPreOpenExp rnfA e
rnfConst :: TupleType t -> t -> ()
rnfConst UnitTuple () = ()
rnfConst (SingleTuple t) !_ = rnfScalarType t
rnfConst (PairTuple ta tb) (a,b) = rnfConst ta a `seq` rnfConst tb b
rnfPrimConst :: PrimConst c -> ()
rnfPrimConst (PrimMinBound t) = rnfBoundedType t
rnfPrimConst (PrimMaxBound t) = rnfBoundedType t
rnfPrimConst (PrimPi t) = rnfFloatingType t
rnfPrimFun :: PrimFun f -> ()
rnfPrimFun (PrimAdd t) = rnfNumType t
rnfPrimFun (PrimSub t) = rnfNumType t
rnfPrimFun (PrimMul t) = rnfNumType t
rnfPrimFun (PrimNeg t) = rnfNumType t
rnfPrimFun (PrimAbs t) = rnfNumType t
rnfPrimFun (PrimSig t) = rnfNumType t
rnfPrimFun (PrimQuot t) = rnfIntegralType t
rnfPrimFun (PrimRem t) = rnfIntegralType t
rnfPrimFun (PrimQuotRem t) = rnfIntegralType t
rnfPrimFun (PrimIDiv t) = rnfIntegralType t
rnfPrimFun (PrimMod t) = rnfIntegralType t
rnfPrimFun (PrimDivMod t) = rnfIntegralType t
rnfPrimFun (PrimBAnd t) = rnfIntegralType t
rnfPrimFun (PrimBOr t) = rnfIntegralType t
rnfPrimFun (PrimBXor t) = rnfIntegralType t
rnfPrimFun (PrimBNot t) = rnfIntegralType t
rnfPrimFun (PrimBShiftL t) = rnfIntegralType t
rnfPrimFun (PrimBShiftR t) = rnfIntegralType t
rnfPrimFun (PrimBRotateL t) = rnfIntegralType t
rnfPrimFun (PrimBRotateR t) = rnfIntegralType t
rnfPrimFun (PrimPopCount t) = rnfIntegralType t
rnfPrimFun (PrimCountLeadingZeros t) = rnfIntegralType t
rnfPrimFun (PrimCountTrailingZeros t) = rnfIntegralType t
rnfPrimFun (PrimFDiv t) = rnfFloatingType t
rnfPrimFun (PrimRecip t) = rnfFloatingType t
rnfPrimFun (PrimSin t) = rnfFloatingType t
rnfPrimFun (PrimCos t) = rnfFloatingType t
rnfPrimFun (PrimTan t) = rnfFloatingType t
rnfPrimFun (PrimAsin t) = rnfFloatingType t
rnfPrimFun (PrimAcos t) = rnfFloatingType t
rnfPrimFun (PrimAtan t) = rnfFloatingType t
rnfPrimFun (PrimSinh t) = rnfFloatingType t
rnfPrimFun (PrimCosh t) = rnfFloatingType t
rnfPrimFun (PrimTanh t) = rnfFloatingType t
rnfPrimFun (PrimAsinh t) = rnfFloatingType t
rnfPrimFun (PrimAcosh t) = rnfFloatingType t
rnfPrimFun (PrimAtanh t) = rnfFloatingType t
rnfPrimFun (PrimExpFloating t) = rnfFloatingType t
rnfPrimFun (PrimSqrt t) = rnfFloatingType t
rnfPrimFun (PrimLog t) = rnfFloatingType t
rnfPrimFun (PrimFPow t) = rnfFloatingType t
rnfPrimFun (PrimLogBase t) = rnfFloatingType t
rnfPrimFun (PrimTruncate f i) = rnfFloatingType f `seq` rnfIntegralType i
rnfPrimFun (PrimRound f i) = rnfFloatingType f `seq` rnfIntegralType i
rnfPrimFun (PrimFloor f i) = rnfFloatingType f `seq` rnfIntegralType i
rnfPrimFun (PrimCeiling f i) = rnfFloatingType f `seq` rnfIntegralType i
rnfPrimFun (PrimIsNaN t) = rnfFloatingType t
rnfPrimFun (PrimAtan2 t) = rnfFloatingType t
rnfPrimFun (PrimLt t) = rnfScalarType t
rnfPrimFun (PrimGt t) = rnfScalarType t
rnfPrimFun (PrimLtEq t) = rnfScalarType t
rnfPrimFun (PrimGtEq t) = rnfScalarType t
rnfPrimFun (PrimEq t) = rnfScalarType t
rnfPrimFun (PrimNEq t) = rnfScalarType t
rnfPrimFun (PrimMax t) = rnfScalarType t
rnfPrimFun (PrimMin t) = rnfScalarType t
rnfPrimFun PrimLAnd = ()
rnfPrimFun PrimLOr = ()
rnfPrimFun PrimLNot = ()
rnfPrimFun PrimOrd = ()
rnfPrimFun PrimChr = ()
rnfPrimFun PrimBoolToInt = ()
rnfPrimFun (PrimFromIntegral i n) = rnfIntegralType i `seq` rnfNumType n
rnfPrimFun (PrimToFloating n f) = rnfNumType n `seq` rnfFloatingType f
rnfPrimFun (PrimCoerce a b) = rnfScalarType a `seq` rnfScalarType b
rnfSliceIndex :: SliceIndex ix slice co sh -> ()
rnfSliceIndex SliceNil = ()
rnfSliceIndex (SliceAll sh) = rnfSliceIndex sh
rnfSliceIndex (SliceFixed sh) = rnfSliceIndex sh
rnfScalarType :: ScalarType t -> ()
rnfScalarType (NumScalarType t) = rnfNumType t
rnfScalarType (NonNumScalarType t) = rnfNonNumType t
rnfBoundedType :: BoundedType t -> ()
rnfBoundedType (IntegralBoundedType t) = rnfIntegralType t
rnfBoundedType (NonNumBoundedType t) = rnfNonNumType t
rnfNumType :: NumType t -> ()
rnfNumType (IntegralNumType t) = rnfIntegralType t
rnfNumType (FloatingNumType t) = rnfFloatingType t
rnfNonNumType :: NonNumType t -> ()
rnfNonNumType (TypeBool NonNumDict) = ()
rnfNonNumType (TypeChar NonNumDict) = ()
rnfNonNumType (TypeCChar NonNumDict) = ()
rnfNonNumType (TypeCSChar NonNumDict) = ()
rnfNonNumType (TypeCUChar NonNumDict) = ()
rnfIntegralType :: IntegralType t -> ()
rnfIntegralType (TypeInt IntegralDict) = ()
rnfIntegralType (TypeInt8 IntegralDict) = ()
rnfIntegralType (TypeInt16 IntegralDict) = ()
rnfIntegralType (TypeInt32 IntegralDict) = ()
rnfIntegralType (TypeInt64 IntegralDict) = ()
rnfIntegralType (TypeWord IntegralDict) = ()
rnfIntegralType (TypeWord8 IntegralDict) = ()
rnfIntegralType (TypeWord16 IntegralDict) = ()
rnfIntegralType (TypeWord32 IntegralDict) = ()
rnfIntegralType (TypeWord64 IntegralDict) = ()
rnfIntegralType (TypeCShort IntegralDict) = ()
rnfIntegralType (TypeCUShort IntegralDict) = ()
rnfIntegralType (TypeCInt IntegralDict) = ()
rnfIntegralType (TypeCUInt IntegralDict) = ()
rnfIntegralType (TypeCLong IntegralDict) = ()
rnfIntegralType (TypeCULong IntegralDict) = ()
rnfIntegralType (TypeCLLong IntegralDict) = ()
rnfIntegralType (TypeCULLong IntegralDict) = ()
rnfFloatingType :: FloatingType t -> ()
rnfFloatingType (TypeFloat FloatingDict) = ()
rnfFloatingType (TypeDouble FloatingDict) = ()
rnfFloatingType (TypeCFloat FloatingDict) = ()
rnfFloatingType (TypeCDouble FloatingDict) = ()
showPreAccOp :: forall acc aenv arrs. PreOpenAcc acc aenv arrs -> String
showPreAccOp Alet{} = "Alet"
showPreAccOp (Avar ix) = "Avar a" ++ show (idxToInt ix)
showPreAccOp (Use a) = "Use " ++ showArrays (toArr a :: arrs)
showPreAccOp Apply{} = "Apply"
showPreAccOp Aforeign{} = "Aforeign"
showPreAccOp Acond{} = "Acond"
showPreAccOp Awhile{} = "Awhile"
showPreAccOp Atuple{} = "Atuple"
showPreAccOp Aprj{} = "Aprj"
showPreAccOp Unit{} = "Unit"
showPreAccOp Generate{} = "Generate"
showPreAccOp Transform{} = "Transform"
showPreAccOp Reshape{} = "Reshape"
showPreAccOp Replicate{} = "Replicate"
showPreAccOp Slice{} = "Slice"
showPreAccOp Map{} = "Map"
showPreAccOp ZipWith{} = "ZipWith"
showPreAccOp Fold{} = "Fold"
showPreAccOp Fold1{} = "Fold1"
showPreAccOp FoldSeg{} = "FoldSeg"
showPreAccOp Fold1Seg{} = "Fold1Seg"
showPreAccOp Scanl{} = "Scanl"
showPreAccOp Scanl'{} = "Scanl'"
showPreAccOp Scanl1{} = "Scanl1"
showPreAccOp Scanr{} = "Scanr"
showPreAccOp Scanr'{} = "Scanr'"
showPreAccOp Scanr1{} = "Scanr1"
showPreAccOp Permute{} = "Permute"
showPreAccOp Backpermute{} = "Backpermute"
showPreAccOp Stencil{} = "Stencil"
showPreAccOp Stencil2{} = "Stencil2"
showArrays :: forall arrs. Arrays arrs => arrs -> String
showArrays = display . collect (arrays (undefined::arrs)) . fromArr
where
collect :: ArraysR a -> a -> [String]
collect ArraysRunit _ = []
collect ArraysRarray arr = [showShortendArr arr]
collect (ArraysRpair r1 r2) (a1, a2) = collect r1 a1 ++ collect r2 a2
display [] = []
display [x] = x
display xs = "(" ++ intercalate ", " xs ++ ")"
showShortendArr :: Elt e => Array sh e -> String
showShortendArr arr
= show (take cutoff l) ++ if length l > cutoff then ".." else ""
where
l = Sugar.toList arr
cutoff = 5
showPreExpOp :: forall acc env aenv t. PreOpenExp acc env aenv t -> String
showPreExpOp Let{} = "Let"
showPreExpOp (Var ix) = "Var x" ++ show (idxToInt ix)
showPreExpOp (Const c) = "Const " ++ show (toElt c :: t)
showPreExpOp Foreign{} = "Foreign"
showPreExpOp Tuple{} = "Tuple"
showPreExpOp Prj{} = "Prj"
showPreExpOp IndexNil = "IndexNil"
showPreExpOp IndexCons{} = "IndexCons"
showPreExpOp IndexHead{} = "IndexHead"
showPreExpOp IndexTail{} = "IndexTail"
showPreExpOp IndexAny = "IndexAny"
showPreExpOp IndexSlice{} = "IndexSlice"
showPreExpOp IndexFull{} = "IndexFull"
showPreExpOp ToIndex{} = "ToIndex"
showPreExpOp FromIndex{} = "FromIndex"
showPreExpOp Cond{} = "Cond"
showPreExpOp While{} = "While"
showPreExpOp PrimConst{} = "PrimConst"
showPreExpOp PrimApp{} = "PrimApp"
showPreExpOp Index{} = "Index"
showPreExpOp LinearIndex{} = "LinearIndex"
showPreExpOp Shape{} = "Shape"
showPreExpOp ShapeSize{} = "ShapeSize"
showPreExpOp Intersect{} = "Intersect"
showPreExpOp Union{} = "Union"