accelerate-llvm-native-1.0.0.0: Data/Array/Accelerate/LLVM/Native/CodeGen/Generate.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- |
-- Module : Data.Array.Accelerate.LLVM.Native.CodeGen.Generate
-- Copyright : [2014..2017] Trevor L. McDonell
-- [2014..2014] Vinod Grover (NVIDIA Corporation)
-- License : BSD3
--
-- Maintainer : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
--
module Data.Array.Accelerate.LLVM.Native.CodeGen.Generate
where
-- accelerate
import Data.Array.Accelerate.Array.Sugar ( Array, Shape, Elt )
import Data.Array.Accelerate.LLVM.CodeGen.Array
import Data.Array.Accelerate.LLVM.CodeGen.Base
import Data.Array.Accelerate.LLVM.CodeGen.Environment
import Data.Array.Accelerate.LLVM.CodeGen.Exp
import Data.Array.Accelerate.LLVM.CodeGen.Monad
import Data.Array.Accelerate.LLVM.CodeGen.Sugar
import Data.Array.Accelerate.LLVM.Native.Target ( Native )
import Data.Array.Accelerate.LLVM.Native.CodeGen.Base
import Data.Array.Accelerate.LLVM.Native.CodeGen.Loop
-- Construct a new array by applying a function to each index. Each thread
-- processes multiple adjacent elements.
--
mkGenerate
:: forall aenv sh e. (Shape sh, Elt e)
=> Gamma aenv
-> IRFun1 Native aenv (sh -> e)
-> CodeGen (IROpenAcc Native aenv (Array sh e))
mkGenerate aenv apply =
let
(start, end, paramGang) = gangParam
(arrOut, paramOut) = mutableArray ("out" :: Name (Array sh e))
paramEnv = envParam aenv
in
makeOpenAcc "generate" (paramGang ++ paramOut ++ paramEnv) $ do
imapFromTo start end $ \i -> do
ix <- indexOfInt (irArrayShape arrOut) i -- convert to multidimensional index
r <- app1 apply ix -- apply generator function
writeArray arrOut i r -- store result
return_