module Futhark.CodeGen.ImpCode.OpenCL
( Program (..)
, Function
, FunctionT (Function)
, Code
, KernelName
, KernelArg (..)
, OpenCL (..)
, Safety(..)
, numFailureParams
, KernelTarget (..)
, FailureMsg(..)
, module Futhark.CodeGen.ImpCode
, module Futhark.Representation.Kernels.Sizes
)
where
import qualified Data.Map as M
import Futhark.CodeGen.ImpCode hiding (Function, Code)
import Futhark.Representation.Kernels.Sizes
import qualified Futhark.CodeGen.ImpCode as Imp
import Futhark.Util.Pretty
data Program = Program { Program -> String
openClProgram :: String
, Program -> String
openClPrelude :: String
, Program -> Map String Safety
openClKernelNames :: M.Map KernelName Safety
, Program -> [PrimType]
openClUsedTypes :: [PrimType]
, Program -> Map Name SizeClass
openClSizes :: M.Map Name SizeClass
, Program -> [FailureMsg]
openClFailures :: [FailureMsg]
, Program -> Definitions OpenCL
hostDefinitions :: Definitions OpenCL
}
data FailureMsg = FailureMsg { FailureMsg -> ErrorMsg Exp
failureError :: ErrorMsg Exp
, FailureMsg -> String
failureBacktrace :: String
}
type Function = Imp.Function OpenCL
type Code = Imp.Code OpenCL
type KernelName = String
data KernelArg = ValueKArg Exp PrimType
| MemKArg VName
| SharedMemoryKArg (Count Bytes Exp)
deriving (Int -> KernelArg -> ShowS
[KernelArg] -> ShowS
KernelArg -> String
(Int -> KernelArg -> ShowS)
-> (KernelArg -> String)
-> ([KernelArg] -> ShowS)
-> Show KernelArg
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KernelArg] -> ShowS
$cshowList :: [KernelArg] -> ShowS
show :: KernelArg -> String
$cshow :: KernelArg -> String
showsPrec :: Int -> KernelArg -> ShowS
$cshowsPrec :: Int -> KernelArg -> ShowS
Show)
data MayFail = MayFail | CannotFail
deriving (Int -> MayFail -> ShowS
[MayFail] -> ShowS
MayFail -> String
(Int -> MayFail -> ShowS)
-> (MayFail -> String) -> ([MayFail] -> ShowS) -> Show MayFail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MayFail] -> ShowS
$cshowList :: [MayFail] -> ShowS
show :: MayFail -> String
$cshow :: MayFail -> String
showsPrec :: Int -> MayFail -> ShowS
$cshowsPrec :: Int -> MayFail -> ShowS
Show)
data Safety
= SafetyNone
| SafetyCheap
| SafetyFull
deriving (Safety -> Safety -> Bool
(Safety -> Safety -> Bool)
-> (Safety -> Safety -> Bool) -> Eq Safety
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Safety -> Safety -> Bool
$c/= :: Safety -> Safety -> Bool
== :: Safety -> Safety -> Bool
$c== :: Safety -> Safety -> Bool
Eq, Eq Safety
Eq Safety
-> (Safety -> Safety -> Ordering)
-> (Safety -> Safety -> Bool)
-> (Safety -> Safety -> Bool)
-> (Safety -> Safety -> Bool)
-> (Safety -> Safety -> Bool)
-> (Safety -> Safety -> Safety)
-> (Safety -> Safety -> Safety)
-> Ord Safety
Safety -> Safety -> Bool
Safety -> Safety -> Ordering
Safety -> Safety -> Safety
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Safety -> Safety -> Safety
$cmin :: Safety -> Safety -> Safety
max :: Safety -> Safety -> Safety
$cmax :: Safety -> Safety -> Safety
>= :: Safety -> Safety -> Bool
$c>= :: Safety -> Safety -> Bool
> :: Safety -> Safety -> Bool
$c> :: Safety -> Safety -> Bool
<= :: Safety -> Safety -> Bool
$c<= :: Safety -> Safety -> Bool
< :: Safety -> Safety -> Bool
$c< :: Safety -> Safety -> Bool
compare :: Safety -> Safety -> Ordering
$ccompare :: Safety -> Safety -> Ordering
$cp1Ord :: Eq Safety
Ord, Int -> Safety -> ShowS
[Safety] -> ShowS
Safety -> String
(Int -> Safety -> ShowS)
-> (Safety -> String) -> ([Safety] -> ShowS) -> Show Safety
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Safety] -> ShowS
$cshowList :: [Safety] -> ShowS
show :: Safety -> String
$cshow :: Safety -> String
showsPrec :: Int -> Safety -> ShowS
$cshowsPrec :: Int -> Safety -> ShowS
Show)
numFailureParams :: Safety -> Int
numFailureParams :: Safety -> Int
numFailureParams Safety
SafetyNone = Int
0
numFailureParams Safety
SafetyCheap = Int
1
numFailureParams Safety
SafetyFull = Int
3
data OpenCL = LaunchKernel Safety KernelName [KernelArg] [Exp] [Exp]
| GetSize VName Name
| CmpSizeLe VName Name Exp
| GetSizeMax VName SizeClass
deriving (Int -> OpenCL -> ShowS
[OpenCL] -> ShowS
OpenCL -> String
(Int -> OpenCL -> ShowS)
-> (OpenCL -> String) -> ([OpenCL] -> ShowS) -> Show OpenCL
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OpenCL] -> ShowS
$cshowList :: [OpenCL] -> ShowS
show :: OpenCL -> String
$cshow :: OpenCL -> String
showsPrec :: Int -> OpenCL -> ShowS
$cshowsPrec :: Int -> OpenCL -> ShowS
Show)
data KernelTarget = TargetOpenCL
| TargetCUDA
deriving (KernelTarget -> KernelTarget -> Bool
(KernelTarget -> KernelTarget -> Bool)
-> (KernelTarget -> KernelTarget -> Bool) -> Eq KernelTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KernelTarget -> KernelTarget -> Bool
$c/= :: KernelTarget -> KernelTarget -> Bool
== :: KernelTarget -> KernelTarget -> Bool
$c== :: KernelTarget -> KernelTarget -> Bool
Eq)
instance Pretty OpenCL where
ppr :: OpenCL -> Doc
ppr = String -> Doc
text (String -> Doc) -> (OpenCL -> String) -> OpenCL -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OpenCL -> String
forall a. Show a => a -> String
show