Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
A representation with flat parallelism via GPU-oriented kernels.
Synopsis
- data GPU
- module Futhark.IR.Prop
- module Futhark.IR.Traversals
- module Futhark.IR.Pretty
- module Futhark.IR.Syntax
- module Futhark.IR.GPU.Op
- module Futhark.IR.GPU.Sizes
- data Scan rep = Scan {
- scanLambda :: Lambda rep
- scanNeutral :: [SubExp]
- data SOAC rep
- data Reduce rep = Reduce {
- redComm :: Commutativity
- redLambda :: Lambda rep
- redNeutral :: [SubExp]
- data ScremaForm rep = ScremaForm {
- scremaScans :: [Scan rep]
- scremaReduces :: [Reduce rep]
- scremaLambda :: Lambda rep
- type ScatterSpec v = [(Shape, Int, v)]
- data SOACMapper frep trep m = SOACMapper {
- mapOnSOACSubExp :: SubExp -> m SubExp
- mapOnSOACLambda :: Lambda frep -> m (Lambda trep)
- mapOnSOACVName :: VName -> m VName
- scremaType :: SubExp -> ScremaForm rep -> [Type]
- scanResults :: [Scan rep] -> Int
- singleScan :: Buildable rep => [Scan rep] -> Scan rep
- redResults :: [Reduce rep] -> Int
- singleReduce :: Buildable rep => [Reduce rep] -> Reduce rep
- soacType :: Typed (LParamInfo rep) => SOAC rep -> [Type]
- typeCheckSOAC :: Checkable rep => SOAC (Aliases rep) -> TypeM rep ()
- mkIdentityLambda :: (Buildable rep, MonadFreshNames m) => [Type] -> m (Lambda rep)
- isIdentityLambda :: Lambda rep -> Bool
- nilFn :: Buildable rep => Lambda rep
- scanomapSOAC :: [Scan rep] -> Lambda rep -> ScremaForm rep
- redomapSOAC :: [Reduce rep] -> Lambda rep -> ScremaForm rep
- scanSOAC :: (Buildable rep, MonadFreshNames m) => [Scan rep] -> m (ScremaForm rep)
- reduceSOAC :: (Buildable rep, MonadFreshNames m) => [Reduce rep] -> m (ScremaForm rep)
- mapSOAC :: Lambda rep -> ScremaForm rep
- isScanomapSOAC :: ScremaForm rep -> Maybe ([Scan rep], Lambda rep)
- isRedomapSOAC :: ScremaForm rep -> Maybe ([Reduce rep], Lambda rep)
- isScanSOAC :: ScremaForm rep -> Maybe [Scan rep]
- isReduceSOAC :: ScremaForm rep -> Maybe [Reduce rep]
- isMapSOAC :: ScremaForm rep -> Maybe (Lambda rep)
- ppScrema :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> ScremaForm rep -> Doc ann
- ppHist :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [HistOp rep] -> Lambda rep -> Doc ann
- ppStream :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [SubExp] -> Lambda rep -> Doc ann
- ppScatter :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [(Shape, Int, VName)] -> Lambda rep -> Doc ann
- groupScatterResults :: ScatterSpec array -> [a] -> [(Shape, array, [([a], a)])]
- groupScatterResults' :: [(Shape, Int, array)] -> [a] -> [([a], a)]
- splitScatterResults :: [(Shape, Int, array)] -> [a] -> ([a], [a])
- identitySOACMapper :: forall rep m. Monad m => SOACMapper rep rep m
- mapSOACM :: Monad m => SOACMapper frep trep m -> SOAC frep -> m (SOAC trep)
- traverseSOACStms :: Monad m => OpStmsTraverser m (SOAC rep) rep
Documentation
The phantom data type for the kernels representation.
Instances
Module re-exports
module Futhark.IR.Prop
module Futhark.IR.Traversals
module Futhark.IR.Pretty
module Futhark.IR.Syntax
module Futhark.IR.GPU.Op
module Futhark.IR.GPU.Sizes
How to compute a single scan result.
Scan | |
|
A second-order array combinator (SOAC).
Stream SubExp [VName] [SubExp] (Lambda rep) | |
Scatter SubExp [VName] (ScatterSpec VName) (Lambda rep) | Scatter length inputs lambda spec Scatter maps values from a set of input arrays to indices and values of a set of output arrays. It is able to write multiple values to multiple outputs each of which may have multiple dimensions. inputs is a list of input arrays, all having size length, elements of which are applied to the lambda function. For instance, if there are two arrays, lambda will get two values as input, one from each array. spec specifies the result of the lambda and which arrays to write to. lambda is a function that takes inputs from inputs and returns values according to spec. It returns values in the following manner:
For each output in spec, lambda returns i * j index values and j output values, where i is the number of dimensions (rank) of the given output, and j is the number of output values written to the given output. For example, given the following scatter specification:
lambda will produce 6 (3 * 2) index values and 2 output values for
arr1, and 2 (2 * 1) index values and 1 output value for
arr2. Additionally, the results are grouped, so the first 6 index values
will correspond to the first two output values, and so on. For this
example, lambda should return a total of 11 values, 8 index values and
3 output values. See also |
Hist SubExp [VName] [HistOp rep] (Lambda rep) | Hist length arrays dest-arrays-and-ops fun The final lambda produces indexes and values for the |
JVP (Lambda rep) [SubExp] [SubExp] | |
VJP (Lambda rep) [SubExp] [SubExp] | |
Screma SubExp [VName] (ScremaForm rep) | A combination of scan, reduction, and map. The first
|
Instances
CanBeAliased SOAC Source # | |
Defined in Futhark.IR.SOACS.SOAC addOpAliases :: AliasableRep rep => AliasTable -> SOAC rep -> SOAC (Aliases rep) Source # | |
IsOp SOAC Source # | |
AliasedOp SOAC Source # | |
TypedOp SOAC Source # | |
RephraseOp SOAC Source # | |
Defined in Futhark.IR.SOACS.SOAC | |
CanBeWise SOAC Source # | |
Defined in Futhark.IR.SOACS.SOAC | |
RepTypes rep => Show (SOAC rep) Source # | |
OpMetrics (Op rep) => OpMetrics (SOAC rep) Source # | |
RepTypes rep => IndexOp (SOAC rep) Source # | |
ASTRep rep => FreeIn (SOAC rep) Source # | |
(AliasableRep rep, CSEInOp (Op (Aliases rep))) => CSEInOp (SOAC (Aliases rep)) Source # | |
ASTRep rep => Rename (SOAC rep) Source # | |
ASTRep rep => Substitute (SOAC rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC | |
RepTypes rep => Eq (SOAC rep) Source # | |
RepTypes rep => Ord (SOAC rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC | |
PrettyRep rep => Pretty (SOAC rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC |
How to compute a single reduction result.
Reduce | |
|
Instances
RepTypes rep => Show (Reduce rep) Source # | |
ASTRep rep => FreeIn (Reduce rep) Source # | |
RepTypes rep => Eq (Reduce rep) Source # | |
RepTypes rep => Ord (Reduce rep) Source # | |
PrettyRep rep => Pretty (Reduce rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC |
data ScremaForm rep Source #
The essential parts of a Screma
factored out (everything
except the input arrays).
ScremaForm | |
|
Instances
RepTypes rep => Show (ScremaForm rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC showsPrec :: Int -> ScremaForm rep -> ShowS # show :: ScremaForm rep -> String # showList :: [ScremaForm rep] -> ShowS # | |
ASTRep rep => FreeIn (ScremaForm rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC freeIn' :: ScremaForm rep -> FV Source # | |
RepTypes rep => Eq (ScremaForm rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC (==) :: ScremaForm rep -> ScremaForm rep -> Bool # (/=) :: ScremaForm rep -> ScremaForm rep -> Bool # | |
RepTypes rep => Ord (ScremaForm rep) Source # | |
Defined in Futhark.IR.SOACS.SOAC compare :: ScremaForm rep -> ScremaForm rep -> Ordering # (<) :: ScremaForm rep -> ScremaForm rep -> Bool # (<=) :: ScremaForm rep -> ScremaForm rep -> Bool # (>) :: ScremaForm rep -> ScremaForm rep -> Bool # (>=) :: ScremaForm rep -> ScremaForm rep -> Bool # max :: ScremaForm rep -> ScremaForm rep -> ScremaForm rep # min :: ScremaForm rep -> ScremaForm rep -> ScremaForm rep # |
type ScatterSpec v = [(Shape, Int, v)] Source #
How the results of a scatter operation should be written. Each
element of the list consists of a v
(often a VName
) specifying
which array to scatter to, a ShapeBase
describing the shape of that
array, and an Int
describing how many elements should be written
to that array for each invocation of the scatter.
data SOACMapper frep trep m Source #
SOACMapper | |
|
scremaType :: SubExp -> ScremaForm rep -> [Type] Source #
The types produced by a single Screma
, given the size of the
input array.
singleScan :: Buildable rep => [Scan rep] -> Scan rep Source #
Combine multiple scan operators to a single operator.
singleReduce :: Buildable rep => [Reduce rep] -> Reduce rep Source #
Combine multiple reduction operators to a single operator.
mkIdentityLambda :: (Buildable rep, MonadFreshNames m) => [Type] -> m (Lambda rep) Source #
Construct a lambda that takes parameters of the given types and simply returns them unchanged.
isIdentityLambda :: Lambda rep -> Bool Source #
Is the given lambda an identity lambda?
scanomapSOAC :: [Scan rep] -> Lambda rep -> ScremaForm rep Source #
Construct a Screma with possibly multiple scans, and the given map function.
redomapSOAC :: [Reduce rep] -> Lambda rep -> ScremaForm rep Source #
Construct a Screma with possibly multiple reductions, and the given map function.
scanSOAC :: (Buildable rep, MonadFreshNames m) => [Scan rep] -> m (ScremaForm rep) Source #
Construct a Screma with possibly multiple scans, and identity map function.
reduceSOAC :: (Buildable rep, MonadFreshNames m) => [Reduce rep] -> m (ScremaForm rep) Source #
Construct a Screma with possibly multiple reductions, and identity map function.
mapSOAC :: Lambda rep -> ScremaForm rep Source #
Construct a Screma corresponding to a map.
isScanomapSOAC :: ScremaForm rep -> Maybe ([Scan rep], Lambda rep) Source #
Does this Screma correspond to a scan-map composition?
isRedomapSOAC :: ScremaForm rep -> Maybe ([Reduce rep], Lambda rep) Source #
Does this Screma correspond to a reduce-map composition?
isScanSOAC :: ScremaForm rep -> Maybe [Scan rep] Source #
Does this Screma correspond to pure scan?
isReduceSOAC :: ScremaForm rep -> Maybe [Reduce rep] Source #
Does this Screma correspond to a pure reduce?
isMapSOAC :: ScremaForm rep -> Maybe (Lambda rep) Source #
Does this Screma correspond to a simple map, without any reduction or scan results?
ppScrema :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> ScremaForm rep -> Doc ann Source #
Prettyprint the given Screma.
ppHist :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [HistOp rep] -> Lambda rep -> Doc ann Source #
Prettyprint the given histogram operation.
ppStream :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [SubExp] -> Lambda rep -> Doc ann Source #
Prettyprint the given Stream.
ppScatter :: (PrettyRep rep, Pretty inp) => SubExp -> [inp] -> [(Shape, Int, VName)] -> Lambda rep -> Doc ann Source #
Prettyprint the given Scatter.
groupScatterResults :: ScatterSpec array -> [a] -> [(Shape, array, [([a], a)])] Source #
groupScatterResults specification results
Blocks the index values and result values of results according to the specification.
This function is used for extracting and grouping the results of a
scatter. In the SOACS representation, the lambda inside a Scatter
returns
all indices and values as one big list. This function groups each value with
its corresponding indices (as determined by the Shape
of the output array).
The elements of the resulting list correspond to the shape and name of the output parameters, in addition to a list of values written to that output parameter, along with the array indices marking where to write them to.
See Scatter
for more information.
groupScatterResults' :: [(Shape, Int, array)] -> [a] -> [([a], a)] Source #
groupScatterResults' specification results
Blocks the index values and result values of results according to
the specification. This is the simpler version of
groupScatterResults
, which doesn't return any information about
shapes or output arrays.
See groupScatterResults
for more information,
splitScatterResults :: [(Shape, Int, array)] -> [a] -> ([a], [a]) Source #
splitScatterResults specification results
Splits the results array into indices and values according to the specification.
See groupScatterResults
for more information.
identitySOACMapper :: forall rep m. Monad m => SOACMapper rep rep m Source #
A mapper that simply returns the SOAC verbatim.
mapSOACM :: Monad m => SOACMapper frep trep m -> SOAC frep -> m (SOAC trep) Source #
Map a monadic action across the immediate children of a SOAC. The mapping does not descend recursively into subexpressions and is done left-to-right.
traverseSOACStms :: Monad m => OpStmsTraverser m (SOAC rep) rep Source #
A helper for defining TraverseOpStms
.