module Futhark.CodeGen.ImpCode.GPU
( Program,
HostCode,
KernelCode,
KernelConst (..),
KernelConstExp,
HostOp (..),
KernelOp (..),
Fence (..),
AtomicOp (..),
GroupDim,
Kernel (..),
KernelUse (..),
module Futhark.CodeGen.ImpCode,
module Futhark.IR.GPU.Sizes,
)
where
import Futhark.CodeGen.ImpCode
import Futhark.IR.GPU.Sizes
import Futhark.IR.Pretty ()
import Futhark.Util.Pretty
type Program = Definitions HostOp
type HostCode = Code HostOp
type KernelCode = Code KernelOp
data KernelConst
= SizeConst Name
| SizeMaxConst SizeClass
deriving (KernelConst -> KernelConst -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KernelConst -> KernelConst -> Bool
$c/= :: KernelConst -> KernelConst -> Bool
== :: KernelConst -> KernelConst -> Bool
$c== :: KernelConst -> KernelConst -> Bool
Eq, Eq KernelConst
KernelConst -> KernelConst -> Bool
KernelConst -> KernelConst -> Ordering
KernelConst -> KernelConst -> KernelConst
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KernelConst -> KernelConst -> KernelConst
$cmin :: KernelConst -> KernelConst -> KernelConst
max :: KernelConst -> KernelConst -> KernelConst
$cmax :: KernelConst -> KernelConst -> KernelConst
>= :: KernelConst -> KernelConst -> Bool
$c>= :: KernelConst -> KernelConst -> Bool
> :: KernelConst -> KernelConst -> Bool
$c> :: KernelConst -> KernelConst -> Bool
<= :: KernelConst -> KernelConst -> Bool
$c<= :: KernelConst -> KernelConst -> Bool
< :: KernelConst -> KernelConst -> Bool
$c< :: KernelConst -> KernelConst -> Bool
compare :: KernelConst -> KernelConst -> Ordering
$ccompare :: KernelConst -> KernelConst -> Ordering
Ord, Int -> KernelConst -> ShowS
[KernelConst] -> ShowS
KernelConst -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KernelConst] -> ShowS
$cshowList :: [KernelConst] -> ShowS
show :: KernelConst -> String
$cshow :: KernelConst -> String
showsPrec :: Int -> KernelConst -> ShowS
$cshowsPrec :: Int -> KernelConst -> ShowS
Show)
type KernelConstExp = PrimExp KernelConst
data HostOp
= CallKernel Kernel
| GetSize VName Name SizeClass
| CmpSizeLe VName Name SizeClass Exp
| GetSizeMax VName SizeClass
deriving (Int -> HostOp -> ShowS
[HostOp] -> ShowS
HostOp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HostOp] -> ShowS
$cshowList :: [HostOp] -> ShowS
show :: HostOp -> String
$cshow :: HostOp -> String
showsPrec :: Int -> HostOp -> ShowS
$cshowsPrec :: Int -> HostOp -> ShowS
Show)
type GroupDim = Either Exp KernelConst
data Kernel = Kernel
{ Kernel -> Code KernelOp
kernelBody :: Code KernelOp,
Kernel -> [KernelUse]
kernelUses :: [KernelUse],
Kernel -> [Exp]
kernelNumGroups :: [Exp],
Kernel -> [GroupDim]
kernelGroupSize :: [GroupDim],
Kernel -> Name
kernelName :: Name,
Kernel -> Bool
kernelFailureTolerant :: Bool,
Kernel -> Bool
kernelCheckLocalMemory :: Bool
}
deriving (Int -> Kernel -> ShowS
[Kernel] -> ShowS
Kernel -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Kernel] -> ShowS
$cshowList :: [Kernel] -> ShowS
show :: Kernel -> String
$cshow :: Kernel -> String
showsPrec :: Int -> Kernel -> ShowS
$cshowsPrec :: Int -> Kernel -> ShowS
Show)
data KernelUse
= ScalarUse VName PrimType
| MemoryUse VName
| ConstUse VName KernelConstExp
deriving (KernelUse -> KernelUse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KernelUse -> KernelUse -> Bool
$c/= :: KernelUse -> KernelUse -> Bool
== :: KernelUse -> KernelUse -> Bool
$c== :: KernelUse -> KernelUse -> Bool
Eq, Eq KernelUse
KernelUse -> KernelUse -> Bool
KernelUse -> KernelUse -> Ordering
KernelUse -> KernelUse -> KernelUse
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KernelUse -> KernelUse -> KernelUse
$cmin :: KernelUse -> KernelUse -> KernelUse
max :: KernelUse -> KernelUse -> KernelUse
$cmax :: KernelUse -> KernelUse -> KernelUse
>= :: KernelUse -> KernelUse -> Bool
$c>= :: KernelUse -> KernelUse -> Bool
> :: KernelUse -> KernelUse -> Bool
$c> :: KernelUse -> KernelUse -> Bool
<= :: KernelUse -> KernelUse -> Bool
$c<= :: KernelUse -> KernelUse -> Bool
< :: KernelUse -> KernelUse -> Bool
$c< :: KernelUse -> KernelUse -> Bool
compare :: KernelUse -> KernelUse -> Ordering
$ccompare :: KernelUse -> KernelUse -> Ordering
Ord, Int -> KernelUse -> ShowS
[KernelUse] -> ShowS
KernelUse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KernelUse] -> ShowS
$cshowList :: [KernelUse] -> ShowS
show :: KernelUse -> String
$cshow :: KernelUse -> String
showsPrec :: Int -> KernelUse -> ShowS
$cshowsPrec :: Int -> KernelUse -> ShowS
Show)
instance Pretty KernelConst where
pretty :: forall ann. KernelConst -> Doc ann
pretty (SizeConst Name
key) = Doc ann
"get_size" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Name
key)
pretty (SizeMaxConst SizeClass
size_class) = Doc ann
"get_max_size" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty SizeClass
size_class)
instance FreeIn KernelConst where
freeIn' :: KernelConst -> FV
freeIn' (SizeConst Name
_) = forall a. Monoid a => a
mempty
freeIn' (SizeMaxConst SizeClass
_) = forall a. Monoid a => a
mempty
instance Pretty KernelUse where
pretty :: forall ann. KernelUse -> Doc ann
pretty (ScalarUse VName
name PrimType
t) =
forall ann. Doc ann -> Doc ann
oneLine forall a b. (a -> b) -> a -> b
$ Doc ann
"scalar_copy" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
name, forall a ann. Pretty a => a -> Doc ann
pretty PrimType
t])
pretty (MemoryUse VName
name) =
forall ann. Doc ann -> Doc ann
oneLine forall a b. (a -> b) -> a -> b
$ Doc ann
"mem_copy" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
name])
pretty (ConstUse VName
name KernelConstExp
e) =
forall ann. Doc ann -> Doc ann
oneLine forall a b. (a -> b) -> a -> b
$ Doc ann
"const" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
name, forall a ann. Pretty a => a -> Doc ann
pretty KernelConstExp
e])
instance Pretty HostOp where
pretty :: forall ann. HostOp -> Doc ann
pretty (GetSize VName
dest Name
key SizeClass
size_class) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_size" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty Name
key, forall a ann. Pretty a => a -> Doc ann
pretty SizeClass
size_class])
pretty (GetSizeMax VName
dest SizeClass
size_class) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-" forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_size_max" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty SizeClass
size_class)
pretty (CmpSizeLe VName
dest Name
name SizeClass
size_class Exp
x) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_size" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty Name
name, forall a ann. Pretty a => a -> Doc ann
pretty SizeClass
size_class])
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall a ann. Pretty a => a -> Doc ann
pretty Exp
x
pretty (CallKernel Kernel
c) =
forall a ann. Pretty a => a -> Doc ann
pretty Kernel
c
instance FreeIn HostOp where
freeIn' :: HostOp -> FV
freeIn' (CallKernel Kernel
c) =
forall a. FreeIn a => a -> FV
freeIn' Kernel
c
freeIn' (CmpSizeLe VName
dest Name
_ SizeClass
_ Exp
x) =
forall a. FreeIn a => a -> FV
freeIn' VName
dest forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (GetSizeMax VName
dest SizeClass
_) =
forall a. FreeIn a => a -> FV
freeIn' VName
dest
freeIn' (GetSize VName
dest Name
_ SizeClass
_) =
forall a. FreeIn a => a -> FV
freeIn' VName
dest
instance FreeIn Kernel where
freeIn' :: Kernel -> FV
freeIn' Kernel
kernel =
forall a. FreeIn a => a -> FV
freeIn'
( Kernel -> Code KernelOp
kernelBody Kernel
kernel,
Kernel -> [Exp]
kernelNumGroups Kernel
kernel,
Kernel -> [GroupDim]
kernelGroupSize Kernel
kernel
)
instance Pretty Kernel where
pretty :: forall ann. Kernel -> Doc ann
pretty Kernel
kernel =
Doc ann
"kernel"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace
( Doc ann
"groups"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Kernel -> [Exp]
kernelNumGroups Kernel
kernel)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"group_size"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a. [Doc a] -> Doc a
list forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall a ann. Pretty a => a -> Doc ann
pretty forall a ann. Pretty a => a -> Doc ann
pretty) forall a b. (a -> b) -> a -> b
$ Kernel -> [GroupDim]
kernelGroupSize Kernel
kernel)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"uses"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a. [Doc a] -> Doc a
commasep forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Kernel -> [KernelUse]
kernelUses Kernel
kernel)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"failure_tolerant"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Kernel -> Bool
kernelFailureTolerant Kernel
kernel)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"check_local_memory"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Kernel -> Bool
kernelCheckLocalMemory Kernel
kernel)
forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc ann
"body"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann -> Doc ann
brace (forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ Kernel -> Code KernelOp
kernelBody Kernel
kernel)
)
data Fence = FenceLocal | FenceGlobal
deriving (Int -> Fence -> ShowS
[Fence] -> ShowS
Fence -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Fence] -> ShowS
$cshowList :: [Fence] -> ShowS
show :: Fence -> String
$cshow :: Fence -> String
showsPrec :: Int -> Fence -> ShowS
$cshowsPrec :: Int -> Fence -> ShowS
Show, Fence -> Fence -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Fence -> Fence -> Bool
$c/= :: Fence -> Fence -> Bool
== :: Fence -> Fence -> Bool
$c== :: Fence -> Fence -> Bool
Eq, Eq Fence
Fence -> Fence -> Bool
Fence -> Fence -> Ordering
Fence -> Fence -> Fence
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Fence -> Fence -> Fence
$cmin :: Fence -> Fence -> Fence
max :: Fence -> Fence -> Fence
$cmax :: Fence -> Fence -> Fence
>= :: Fence -> Fence -> Bool
$c>= :: Fence -> Fence -> Bool
> :: Fence -> Fence -> Bool
$c> :: Fence -> Fence -> Bool
<= :: Fence -> Fence -> Bool
$c<= :: Fence -> Fence -> Bool
< :: Fence -> Fence -> Bool
$c< :: Fence -> Fence -> Bool
compare :: Fence -> Fence -> Ordering
$ccompare :: Fence -> Fence -> Ordering
Ord)
data KernelOp
= GetGroupId VName Int
| GetLocalId VName Int
| GetLocalSize VName Int
| GetLockstepWidth VName
| Atomic Space AtomicOp
| Barrier Fence
| MemFence Fence
| LocalAlloc VName (Count Bytes (TExp Int64))
|
ErrorSync Fence
deriving (Int -> KernelOp -> ShowS
[KernelOp] -> ShowS
KernelOp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KernelOp] -> ShowS
$cshowList :: [KernelOp] -> ShowS
show :: KernelOp -> String
$cshow :: KernelOp -> String
showsPrec :: Int -> KernelOp -> ShowS
$cshowsPrec :: Int -> KernelOp -> ShowS
Show)
data AtomicOp
= AtomicAdd IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicFAdd FloatType VName VName (Count Elements (TExp Int64)) Exp
| AtomicSMax IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicSMin IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicUMax IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicUMin IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicAnd IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicOr IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicXor IntType VName VName (Count Elements (TExp Int64)) Exp
| AtomicCmpXchg PrimType VName VName (Count Elements (TExp Int64)) Exp Exp
| AtomicXchg PrimType VName VName (Count Elements (TExp Int64)) Exp
deriving (Int -> AtomicOp -> ShowS
[AtomicOp] -> ShowS
AtomicOp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AtomicOp] -> ShowS
$cshowList :: [AtomicOp] -> ShowS
show :: AtomicOp -> String
$cshow :: AtomicOp -> String
showsPrec :: Int -> AtomicOp -> ShowS
$cshowsPrec :: Int -> AtomicOp -> ShowS
Show)
instance FreeIn AtomicOp where
freeIn' :: AtomicOp -> FV
freeIn' (AtomicAdd IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicFAdd FloatType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicSMax IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicSMin IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicUMax IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicUMin IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicAnd IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicOr IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicXor IntType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
freeIn' (AtomicCmpXchg PrimType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x Exp
y) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
y
freeIn' (AtomicXchg PrimType
_ VName
_ VName
arr Count Elements (TExp Int64)
i Exp
x) = forall a. FreeIn a => a -> FV
freeIn' VName
arr forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Count Elements (TExp Int64)
i forall a. Semigroup a => a -> a -> a
<> forall a. FreeIn a => a -> FV
freeIn' Exp
x
instance Pretty KernelOp where
pretty :: forall ann. KernelOp -> Doc ann
pretty (GetGroupId VName
dest Int
i) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_group_id" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Int
i)
pretty (GetLocalId VName
dest Int
i) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_local_id" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Int
i)
pretty (GetLocalSize VName
dest Int
i) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_local_size" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Int
i)
pretty (GetLockstepWidth VName
dest) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
dest
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"get_lockstep_width()"
pretty (Barrier Fence
FenceLocal) =
Doc ann
"local_barrier()"
pretty (Barrier Fence
FenceGlobal) =
Doc ann
"global_barrier()"
pretty (MemFence Fence
FenceLocal) =
Doc ann
"mem_fence_local()"
pretty (MemFence Fence
FenceGlobal) =
Doc ann
"mem_fence_global()"
pretty (LocalAlloc VName
name Count Bytes (TExp Int64)
size) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
name forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. Doc ann
equals forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"local_alloc" forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a ann. Pretty a => a -> Doc ann
pretty Count Bytes (TExp Int64)
size)
pretty (ErrorSync Fence
FenceLocal) =
Doc ann
"error_sync_local()"
pretty (ErrorSync Fence
FenceGlobal) =
Doc ann
"error_sync_global()"
pretty (Atomic Space
_ (AtomicAdd IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_add_"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicFAdd FloatType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_fadd_"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty FloatType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicSMax IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_smax"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicSMin IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_smin"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicUMax IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_umax"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicUMin IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_umin"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicAnd IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_and"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicOr IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_or"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicXor IntType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_xor"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty IntType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
pretty (Atomic Space
_ (AtomicCmpXchg PrimType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x Exp
y)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_cmp_xchg"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty PrimType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x, forall a ann. Pretty a => a -> Doc ann
pretty Exp
y])
pretty (Atomic Space
_ (AtomicXchg PrimType
t VName
old VName
arr Count Elements (TExp Int64)
ind Exp
x)) =
forall a ann. Pretty a => a -> Doc ann
pretty VName
old
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"<-"
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"atomic_xchg"
forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty PrimType
t
forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
parens (forall a. [Doc a] -> Doc a
commasep [forall a ann. Pretty a => a -> Doc ann
pretty VName
arr forall a. Semigroup a => a -> a -> a
<> forall ann. Doc ann -> Doc ann
brackets (forall a ann. Pretty a => a -> Doc ann
pretty Count Elements (TExp Int64)
ind), forall a ann. Pretty a => a -> Doc ann
pretty Exp
x])
instance FreeIn KernelOp where
freeIn' :: KernelOp -> FV
freeIn' (Atomic Space
_ AtomicOp
op) = forall a. FreeIn a => a -> FV
freeIn' AtomicOp
op
freeIn' KernelOp
_ = forall a. Monoid a => a
mempty
brace :: Doc a -> Doc a
brace :: forall ann. Doc ann -> Doc ann
brace Doc a
body = Doc a
" {" forall ann. Doc ann -> Doc ann -> Doc ann
</> forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc a
body forall ann. Doc ann -> Doc ann -> Doc ann
</> Doc a
"}"