futhark-0.25.16: src/Futhark/Optimise/ArrayLayout.hs
module Futhark.Optimise.ArrayLayout
( optimiseArrayLayoutGPU,
optimiseArrayLayoutMC,
)
where
import Control.Monad.State.Strict
import Futhark.Analysis.AccessPattern (Analyse, analyseDimAccesses)
import Futhark.Analysis.PrimExp.Table (primExpTable)
import Futhark.Builder
import Futhark.IR.GPU (GPU)
import Futhark.IR.MC (MC)
import Futhark.Optimise.ArrayLayout.Layout (layoutTableFromIndexTable)
import Futhark.Optimise.ArrayLayout.Transform (Transform, transformStms)
import Futhark.Pass
optimiseArrayLayout :: (Analyse rep, Transform rep, BuilderOps rep) => String -> Pass rep rep
optimiseArrayLayout s =
Pass
("optimise array layout " <> s)
"Transform array layout for locality optimisations."
$ \prog -> do
-- Analyse the program
let index_table = analyseDimAccesses prog
-- Compute primExps for all variables
let table = primExpTable prog
-- Compute permutations to acheive coalescence for all arrays
let permutation_table = layoutTableFromIndexTable table index_table
-- Insert permutations in the AST
intraproceduralTransformation (onStms permutation_table) prog
where
onStms layout_table scope stms = do
let m = transformStms layout_table mempty stms
fmap fst $ modifyNameSource $ runState $ runBuilderT m scope
-- | The optimisation performed on the GPU representation.
optimiseArrayLayoutGPU :: Pass GPU GPU
optimiseArrayLayoutGPU = optimiseArrayLayout "gpu"
-- | The optimisation performed on the MC representation.
optimiseArrayLayoutMC :: Pass MC MC
optimiseArrayLayoutMC = optimiseArrayLayout "mc"