Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data KernelConstants = KernelConstants {
- kernelOuterVTable :: VTable ExplicitMemory
- kernelGlobalThreadId :: Exp
- kernelLocalThreadId :: Exp
- kernelGroupId :: Exp
- kernelGlobalThreadIdVar :: VName
- kernelLocalThreadIdVar :: VName
- kernelGroupIdVar :: VName
- kernelGroupSize :: Exp
- kernelNumGroups :: Exp
- kernelNumThreads :: Exp
- kernelWaveSize :: Exp
- kernelDimensions :: [(VName, Exp)]
- kernelThreadActive :: Exp
- kernelStreamed :: [(VName, DimSize)]
- inKernelOperations :: KernelConstants -> Operations InKernel KernelOp
- keyWithEntryPoint :: Name -> Name -> Name
- type CallKernelGen = ImpM ExplicitMemory HostOp
- type InKernelGen = ImpM InKernel KernelOp
- computeThreadChunkSize :: SplitOrdering -> Exp -> Count Elements -> Count Elements -> VName -> ImpM lore op ()
- simpleKernelConstants :: Exp -> String -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ())
- kernelInitialisation :: KernelSpace -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ())
- kernelInitialisationSimple :: Exp -> Exp -> Maybe (VName, VName, VName) -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ())
- kernelInitialisationSetSpace :: KernelSpace -> InKernelGen () -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ())
- setSpaceIndices :: Exp -> KernelSpace -> InKernelGen ()
- makeAllMemoryGlobal :: CallKernelGen a -> CallKernelGen a
- allThreads :: KernelConstants -> InKernelGen () -> InKernelGen ()
- compileKernelStms :: KernelConstants -> Stms InKernel -> InKernelGen a -> InKernelGen a
- groupReduce :: ExplicitMemorish lore => KernelConstants -> Exp -> Lambda lore -> [VName] -> ImpM lore KernelOp ()
- groupScan :: KernelConstants -> Maybe (Exp -> Exp -> Exp) -> Exp -> Lambda InKernel -> [VName] -> ImpM InKernel KernelOp ()
- isActive :: [(VName, SubExp)] -> Exp
- sKernel :: KernelConstants -> String -> ImpM InKernel KernelOp a -> CallKernelGen ()
- sReplicate :: VName -> Shape -> SubExp -> CallKernelGen ()
- sIota :: VName -> Exp -> Exp -> Exp -> IntType -> CallKernelGen ()
- sCopy :: PrimType -> MemLocation -> MemLocation -> Count Elements -> CallKernelGen ()
- compileKernelResult :: KernelConstants -> PatElem InKernel -> KernelResult -> InKernelGen ()
- virtualiseGroups :: KernelConstants -> Exp -> (VName -> InKernelGen ()) -> InKernelGen ()
- atomicUpdate :: ExplicitMemorish lore => Space -> [VName] -> [Exp] -> Lambda lore -> Locking -> ImpM lore KernelOp ()
- atomicUpdateLocking :: ExplicitMemorish lore => Lambda lore -> Either (AtomicUpdate lore) (Locking -> AtomicUpdate lore)
- data Locking = Locking {
- lockingArray :: VName
- lockingIsUnlocked :: Exp
- lockingToLock :: Exp
- lockingToUnlock :: Exp
- lockingMapping :: [Exp] -> Exp
- type AtomicUpdate lore = Space -> [VName] -> [Exp] -> ImpM lore KernelOp ()
Documentation
data KernelConstants Source #
KernelConstants | |
|
type CallKernelGen = ImpM ExplicitMemory HostOp Source #
computeThreadChunkSize :: SplitOrdering -> Exp -> Count Elements -> Count Elements -> VName -> ImpM lore op () Source #
simpleKernelConstants :: Exp -> String -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ()) Source #
kernelInitialisation :: KernelSpace -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ()) Source #
kernelInitialisationSimple :: Exp -> Exp -> Maybe (VName, VName, VName) -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ()) Source #
kernelInitialisationSetSpace :: KernelSpace -> InKernelGen () -> CallKernelGen (KernelConstants, ImpM InKernel KernelOp ()) Source #
setSpaceIndices :: Exp -> KernelSpace -> InKernelGen () Source #
makeAllMemoryGlobal :: CallKernelGen a -> CallKernelGen a Source #
Change every memory block to be in the global address space, except those who are in the local memory space. This only affects generated code - we still need to make sure that the memory is actually present on the device (and dared as variables in the kernel).
allThreads :: KernelConstants -> InKernelGen () -> InKernelGen () Source #
compileKernelStms :: KernelConstants -> Stms InKernel -> InKernelGen a -> InKernelGen a Source #
groupReduce :: ExplicitMemorish lore => KernelConstants -> Exp -> Lambda lore -> [VName] -> ImpM lore KernelOp () Source #
groupScan :: KernelConstants -> Maybe (Exp -> Exp -> Exp) -> Exp -> Lambda InKernel -> [VName] -> ImpM InKernel KernelOp () Source #
sKernel :: KernelConstants -> String -> ImpM InKernel KernelOp a -> CallKernelGen () Source #
sReplicate :: VName -> Shape -> SubExp -> CallKernelGen () Source #
Perform a Replicate with a kernel.
sIota :: VName -> Exp -> Exp -> Exp -> IntType -> CallKernelGen () Source #
Perform an Iota with a kernel.
sCopy :: PrimType -> MemLocation -> MemLocation -> Count Elements -> CallKernelGen () Source #
compileKernelResult :: KernelConstants -> PatElem InKernel -> KernelResult -> InKernelGen () Source #
virtualiseGroups :: KernelConstants -> Exp -> (VName -> InKernelGen ()) -> InKernelGen () Source #
For many kernels, we may not have enough physical groups to cover the logical iteration space. Some groups thus have to perform double duty; we put an outer loop to accomplish this. The advantage over just launching a bazillion threads is that the cost of memory expansion should be proportional to the number of *physical* threads (hardware parallelism), not the amount of application parallelism.
atomicUpdate :: ExplicitMemorish lore => Space -> [VName] -> [Exp] -> Lambda lore -> Locking -> ImpM lore KernelOp () Source #
atomicUpdateLocking :: ExplicitMemorish lore => Lambda lore -> Either (AtomicUpdate lore) (Locking -> AtomicUpdate lore) Source #
atomicUpdate
, but where it is explicitly visible whether a
locking strategy is necessary.
Locking strategy used for an atomic update.
Locking | |
|