{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Module      : Data.Array.Accelerate.LLVM.PTX.CodeGen
-- Copyright   : [2014..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.LLVM.PTX.CodeGen (

  KernelMetadata(..),

) where

-- accelerate
import Data.Array.Accelerate.LLVM.CodeGen

import Data.Array.Accelerate.LLVM.PTX.CodeGen.Base
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Fold
import Data.Array.Accelerate.LLVM.PTX.CodeGen.FoldSeg
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Generate
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Intrinsic ()
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Map
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Permute
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Scan
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Stencil
import Data.Array.Accelerate.LLVM.PTX.CodeGen.Transform
import Data.Array.Accelerate.LLVM.PTX.Target


instance Skeleton PTX where
  map :: UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
map UID
_       = Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
forall aenv sh a b.
Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
mkMap
  generate :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 PTX aenv (sh -> e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
generate UID
_  = Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 PTX aenv (sh -> e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
forall aenv sh e.
Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 PTX aenv (sh -> e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
mkGenerate
  transform :: UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 PTX aenv (sh' -> sh)
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' b))
transform UID
_ = Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 PTX aenv (sh' -> sh)
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' b))
forall aenv sh a sh' b.
Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 PTX aenv (sh' -> sh)
-> IRFun1 PTX aenv (a -> b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' b))
mkTransform
  fold :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
fold UID
_      = Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
forall aenv sh e.
Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh e))
mkFold
  foldSeg :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> MIRDelayed PTX aenv (Segments i)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
foldSeg UID
_   = Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> MIRDelayed PTX aenv (Segments i)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
forall aenv sh i e.
Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> MIRDelayed PTX aenv (Segments i)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
mkFoldSeg
  scan :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
scan UID
_      = Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
forall aenv sh e.
Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> Maybe (IRExp PTX aenv e)
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e))
mkScan
  scan' :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> IRExp PTX aenv e
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e, Array sh e))
scan' UID
_     = Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> IRExp PTX aenv e
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e, Array sh e))
forall aenv sh e.
Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 PTX aenv (e -> e -> e)
-> IRExp PTX aenv e
-> MIRDelayed PTX aenv (Array (sh, Int) e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array (sh, Int) e, Array sh e))
mkScan'
  permute :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun PTX aenv (e -> e -> e)
-> IRFun1 PTX aenv (sh -> PrimMaybe sh')
-> MIRDelayed PTX aenv (Array sh e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' e))
permute UID
_   = Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun PTX aenv (e -> e -> e)
-> IRFun1 PTX aenv (sh -> PrimMaybe sh')
-> MIRDelayed PTX aenv (Array sh e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' e))
forall aenv sh e sh'.
HasCallStack =>
Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun PTX aenv (e -> e -> e)
-> IRFun1 PTX aenv (sh -> PrimMaybe sh')
-> MIRDelayed PTX aenv (Array sh e)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh' e))
mkPermute
  stencil1 :: UID
-> Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 PTX aenv (stencil -> b)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
stencil1 UID
_  = Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 PTX aenv (stencil -> b)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
forall aenv sh a stencil b.
Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 PTX aenv (stencil -> b)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh b))
mkStencil1
  stencil2 :: UID
-> Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 PTX aenv (stencil1 -> stencil2 -> c)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> IRBoundary PTX aenv (Array sh b)
-> MIRDelayed PTX aenv (Array sh b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh c))
stencil2 UID
_  = Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 PTX aenv (stencil1 -> stencil2 -> c)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> IRBoundary PTX aenv (Array sh b)
-> MIRDelayed PTX aenv (Array sh b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh c))
forall aenv sh a stencil1 b stencil2 c.
Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 PTX aenv (stencil1 -> stencil2 -> c)
-> IRBoundary PTX aenv (Array sh a)
-> MIRDelayed PTX aenv (Array sh a)
-> IRBoundary PTX aenv (Array sh b)
-> MIRDelayed PTX aenv (Array sh b)
-> CodeGen PTX (IROpenAcc PTX aenv (Array sh c))
mkStencil2