{-# LINE 1 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE TemplateHaskell #-}
module Foreign.CUDA.Driver.Stream (
Stream(..), StreamPriority, StreamCallback,
StreamFlag(..), StreamWriteFlag(..), StreamWaitFlag(..), StreamCallbackFlag,
create, createWithPriority, destroy, finished, block, callback,
getFlags, getPriority, getContext,
write, wait,
defaultStream,
defaultStreamLegacy,
defaultStreamPerThread,
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
{-# LINE 36 "src/Foreign/CUDA/Driver/Stream.chs" #-}
import Foreign.CUDA.Ptr
import Foreign.CUDA.Driver.Error
import Foreign.CUDA.Driver.Context.Base ( Context(..) )
import Foreign.CUDA.Internal.C2HS
import Control.Exception ( throwIO )
import Control.Monad ( liftM )
import Foreign
import Foreign.C
import Unsafe.Coerce
import GHC.Base
import GHC.Ptr
import GHC.Word
newtype Stream = Stream { Stream -> Ptr ()
useStream :: ((C2HSImp.Ptr ()))}
deriving (Stream -> Stream -> Bool
(Stream -> Stream -> Bool)
-> (Stream -> Stream -> Bool) -> Eq Stream
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Stream -> Stream -> Bool
$c/= :: Stream -> Stream -> Bool
== :: Stream -> Stream -> Bool
$c== :: Stream -> Stream -> Bool
Eq, Int -> Stream -> ShowS
[Stream] -> ShowS
Stream -> String
(Int -> Stream -> ShowS)
-> (Stream -> String) -> ([Stream] -> ShowS) -> Show Stream
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Stream] -> ShowS
$cshowList :: [Stream] -> ShowS
show :: Stream -> String
$cshow :: Stream -> String
showsPrec :: Int -> Stream -> ShowS
$cshowsPrec :: Int -> Stream -> ShowS
Show)
type StreamPriority = Int
data StreamFlag = Default
| NonBlocking
deriving (StreamFlag -> StreamFlag -> Bool
(StreamFlag -> StreamFlag -> Bool)
-> (StreamFlag -> StreamFlag -> Bool) -> Eq StreamFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StreamFlag -> StreamFlag -> Bool
$c/= :: StreamFlag -> StreamFlag -> Bool
== :: StreamFlag -> StreamFlag -> Bool
$c== :: StreamFlag -> StreamFlag -> Bool
Eq,Int -> StreamFlag -> ShowS
[StreamFlag] -> ShowS
StreamFlag -> String
(Int -> StreamFlag -> ShowS)
-> (StreamFlag -> String)
-> ([StreamFlag] -> ShowS)
-> Show StreamFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StreamFlag] -> ShowS
$cshowList :: [StreamFlag] -> ShowS
show :: StreamFlag -> String
$cshow :: StreamFlag -> String
showsPrec :: Int -> StreamFlag -> ShowS
$cshowsPrec :: Int -> StreamFlag -> ShowS
Show,StreamFlag
StreamFlag -> StreamFlag -> Bounded StreamFlag
forall a. a -> a -> Bounded a
maxBound :: StreamFlag
$cmaxBound :: StreamFlag
minBound :: StreamFlag
$cminBound :: StreamFlag
Bounded)
instance Enum StreamFlag where
succ :: StreamFlag -> StreamFlag
succ StreamFlag
Default = StreamFlag
NonBlocking
succ StreamFlag
NonBlocking = String -> StreamFlag
forall a. HasCallStack => String -> a
error String
"StreamFlag.succ: NonBlocking has no successor"
pred :: StreamFlag -> StreamFlag
pred StreamFlag
NonBlocking = StreamFlag
Default
pred StreamFlag
Default = String -> StreamFlag
forall a. HasCallStack => String -> a
error String
"StreamFlag.pred: Default has no predecessor"
enumFromTo :: StreamFlag -> StreamFlag -> [StreamFlag]
enumFromTo StreamFlag
from StreamFlag
to = StreamFlag -> [StreamFlag]
forall t. Enum t => t -> [t]
go StreamFlag
from
where
end :: Int
end = StreamFlag -> Int
forall a. Enum a => a -> Int
fromEnum StreamFlag
to
go :: t -> [t]
go t
v = case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (t -> Int
forall a. Enum a => a -> Int
fromEnum t
v) Int
end of
Ordering
LT -> t
v t -> [t] -> [t]
forall a. a -> [a] -> [a]
: t -> [t]
go (t -> t
forall a. Enum a => a -> a
succ t
v)
Ordering
EQ -> [t
v]
Ordering
GT -> []
enumFrom :: StreamFlag -> [StreamFlag]
enumFrom StreamFlag
from = StreamFlag -> StreamFlag -> [StreamFlag]
forall a. Enum a => a -> a -> [a]
enumFromTo StreamFlag
from StreamFlag
NonBlocking
fromEnum :: StreamFlag -> Int
fromEnum StreamFlag
Default = Int
0
fromEnum StreamFlag
NonBlocking = Int
1
toEnum :: Int -> StreamFlag
toEnum Int
0 = StreamFlag
Default
toEnum Int
1 = StreamFlag
NonBlocking
toEnum Int
unmatched = String -> StreamFlag
forall a. HasCallStack => String -> a
error (String
"StreamFlag.toEnum: Cannot match " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
unmatched)
{-# LINE 106 "src/Foreign/CUDA/Driver/Stream.chs" #-}
data StreamWriteFlag = WriteValueDefault
| WriteValueNoMemoryBarrier
deriving (StreamWriteFlag -> StreamWriteFlag -> Bool
(StreamWriteFlag -> StreamWriteFlag -> Bool)
-> (StreamWriteFlag -> StreamWriteFlag -> Bool)
-> Eq StreamWriteFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StreamWriteFlag -> StreamWriteFlag -> Bool
$c/= :: StreamWriteFlag -> StreamWriteFlag -> Bool
== :: StreamWriteFlag -> StreamWriteFlag -> Bool
$c== :: StreamWriteFlag -> StreamWriteFlag -> Bool
Eq,Int -> StreamWriteFlag -> ShowS
[StreamWriteFlag] -> ShowS
StreamWriteFlag -> String
(Int -> StreamWriteFlag -> ShowS)
-> (StreamWriteFlag -> String)
-> ([StreamWriteFlag] -> ShowS)
-> Show StreamWriteFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StreamWriteFlag] -> ShowS
$cshowList :: [StreamWriteFlag] -> ShowS
show :: StreamWriteFlag -> String
$cshow :: StreamWriteFlag -> String
showsPrec :: Int -> StreamWriteFlag -> ShowS
$cshowsPrec :: Int -> StreamWriteFlag -> ShowS
Show,StreamWriteFlag
StreamWriteFlag -> StreamWriteFlag -> Bounded StreamWriteFlag
forall a. a -> a -> Bounded a
maxBound :: StreamWriteFlag
$cmaxBound :: StreamWriteFlag
minBound :: StreamWriteFlag
$cminBound :: StreamWriteFlag
Bounded)
instance Enum StreamWriteFlag where
succ WriteValueDefault = WriteValueNoMemoryBarrier
succ WriteValueNoMemoryBarrier = error "StreamWriteFlag.succ: WriteValueNoMemoryBarrier has no successor"
pred WriteValueNoMemoryBarrier = WriteValueDefault
pred WriteValueDefault = error "StreamWriteFlag.pred: WriteValueDefault has no predecessor"
enumFromTo :: StreamWriteFlag -> StreamWriteFlag -> [StreamWriteFlag]
enumFromTo StreamWriteFlag
from StreamWriteFlag
to = StreamWriteFlag -> [StreamWriteFlag]
forall t. Enum t => t -> [t]
go StreamWriteFlag
from
where
end = fromEnum to
go v = case compare (fromEnum v) end of
LT -> v : go (succ v)
EQ -> [v]
GT -> []
enumFrom from = enumFromTo from WriteValueNoMemoryBarrier
fromEnum WriteValueDefault = 0
fromEnum WriteValueNoMemoryBarrier = 1
toEnum :: Int -> StreamWriteFlag
toEnum Int
0 = StreamWriteFlag
WriteValueDefault
toEnum Int
1 = StreamWriteFlag
WriteValueNoMemoryBarrier
toEnum Int
unmatched = String -> StreamWriteFlag
forall a. HasCallStack => String -> a
error (String
"StreamWriteFlag.toEnum: Cannot match " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
unmatched)
{-# LINE 110 "src/Foreign/CUDA/Driver/Stream.chs" #-}
data StreamWaitFlag = WaitValueGeq
| WaitValueEq
| WaitValueAnd
| WaitValueNor
| WaitValueFlush
deriving (Eq,Show,Bounded)
instance Enum StreamWaitFlag where
succ WaitValueGeq = WaitValueEq
succ WaitValueEq = WaitValueAnd
succ WaitValueAnd = WaitValueNor
succ WaitValueNor = WaitValueFlush
succ WaitValueFlush = error "StreamWaitFlag.succ: WaitValueFlush has no successor"
pred WaitValueEq = WaitValueGeq
pred WaitValueAnd = WaitValueEq
pred WaitValueNor = WaitValueAnd
pred WaitValueFlush = WaitValueNor
pred WaitValueGeq = error "StreamWaitFlag.pred: WaitValueGeq has no predecessor"
enumFromTo from to = go from
where
end = fromEnum to
go v = case compare (fromEnum v) end of
LT -> v : go (succ v)
EQ -> [v]
GT -> []
enumFrom :: StreamWaitFlag -> [StreamWaitFlag]
enumFrom StreamWaitFlag
from = StreamWaitFlag -> StreamWaitFlag -> [StreamWaitFlag]
forall a. Enum a => a -> a -> [a]
enumFromTo StreamWaitFlag
from StreamWaitFlag
WaitValueFlush
fromEnum WaitValueGeq = 0
fromEnum WaitValueEq = 1
fromEnum WaitValueAnd = 2
fromEnum WaitValueNor = 3
fromEnum WaitValueFlush = 1073741824
toEnum 0 = WaitValueGeq
toEnum 1 = WaitValueEq
toEnum 2 = WaitValueAnd
toEnum 3 = WaitValueNor
toEnum 1073741824 = WaitValueFlush
toEnum unmatched = error ("StreamWaitFlag.toEnum: Cannot match " ++ show unmatched)
{-# LINE 115 "src/Foreign/CUDA/Driver/Stream.chs" #-}
type StreamCallback = ((C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr ()) -> (IO ()))))))
{-# LINE 124 "src/Foreign/CUDA/Driver/Stream.chs" #-}
data StreamCallbackFlag
instance Enum StreamCallbackFlag where
{-# INLINEABLE create #-}
create :: [StreamFlag] -> IO Stream
create !flags = resultIfOk =<< cuStreamCreate flags
{-# INLINE cuStreamCreate #-}
cuStreamCreate :: ([StreamFlag]) -> IO ((Status), (Stream))
cuStreamCreate a2 =
alloca $ \a1' ->
let {a2' = combineBitMasks a2} in
cuStreamCreate'_ a1' a2' >>= \res ->
let {res' = cToEnum res} in
peekStream a1'>>= \a1'' ->
return (res', a1'')
{-# LINE 150 "src/Foreign/CUDA/Driver/Stream.chs" #-}
where
peekStream = liftM Stream . peek
{-# INLINEABLE createWithPriority #-}
createWithPriority :: StreamPriority -> [StreamFlag] -> IO Stream
createWithPriority :: Int -> [StreamFlag] -> IO Stream
createWithPriority !Int
priority ![StreamFlag]
flags = (Status, Stream) -> IO Stream
forall a. (Status, a) -> IO a
resultIfOk ((Status, Stream) -> IO Stream) -> IO (Status, Stream) -> IO Stream
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [StreamFlag] -> Int -> IO (Status, Stream)
cuStreamCreateWithPriority [StreamFlag]
flags Int
priority
{-# INLINE cuStreamCreateWithPriority #-}
cuStreamCreateWithPriority :: ([StreamFlag]) -> (StreamPriority) -> IO ((Status), (Stream))
cuStreamCreateWithPriority :: [StreamFlag] -> Int -> IO (Status, Stream)
cuStreamCreateWithPriority [StreamFlag]
a2 Int
a3 =
(Ptr (Ptr ()) -> IO (Status, Stream)) -> IO (Status, Stream)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO (Status, Stream)) -> IO (Status, Stream))
-> (Ptr (Ptr ()) -> IO (Status, Stream)) -> IO (Status, Stream)
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' ->
let {a2' :: CUInt
a2' = [StreamFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamFlag]
a2} in
let {a3' :: CInt
a3' = Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a3} in
Ptr (Ptr ()) -> CUInt -> CInt -> IO CInt
cuStreamCreateWithPriority'_ Ptr (Ptr ())
a1' CUInt
a2' CInt
a3' IO CInt -> (CInt -> IO (Status, Stream)) -> IO (Status, Stream)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Ptr (Ptr ()) -> IO Stream
peekStream Ptr (Ptr ())
a1'IO Stream -> (Stream -> IO (Status, Stream)) -> IO (Status, Stream)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Stream
a1'' ->
(Status, Stream) -> IO (Status, Stream)
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Stream
a1'')
{-# LINE 184 "src/Foreign/CUDA/Driver/Stream.chs" #-}
where
peekStream = liftM Stream . peek
{-# INLINEABLE destroy #-}
destroy :: Stream -> IO ()
destroy :: Stream -> IO ()
destroy !Stream
st = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream -> IO Status
cuStreamDestroy Stream
st
{-# INLINE cuStreamDestroy #-}
cuStreamDestroy :: (Stream) -> IO ((Status))
cuStreamDestroy :: Stream -> IO Status
cuStreamDestroy Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
Ptr () -> IO CInt
cuStreamDestroy'_ Ptr ()
a1' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 204 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE finished #-}
finished :: Stream -> IO Bool
finished :: Stream -> IO Bool
finished !Stream
st =
Stream -> IO Status
cuStreamQuery Stream
st IO Status -> (Status -> IO Bool) -> IO Bool
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Status
rv ->
case Status
rv of
Status
Success -> Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
Status
NotReady -> Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
Status
_ -> CUDAException -> IO Bool
forall e a. Exception e => e -> IO a
throwIO (Status -> CUDAException
ExitCode Status
rv)
{-# INLINE cuStreamQuery #-}
cuStreamQuery :: (Stream) -> IO ((Status))
cuStreamQuery :: Stream -> IO Status
cuStreamQuery Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
Ptr () -> IO CInt
cuStreamQuery'_ Ptr ()
a1' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 223 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE block #-}
block :: Stream -> IO ()
block :: Stream -> IO ()
block !Stream
st = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream -> IO Status
cuStreamSynchronize Stream
st
{-# INLINE cuStreamSynchronize #-}
cuStreamSynchronize :: (Stream) -> IO ((Status))
cuStreamSynchronize :: Stream -> IO Status
cuStreamSynchronize Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
Ptr () -> IO CInt
cuStreamSynchronize'_ Ptr ()
a1' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 237 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE getPriority #-}
getPriority :: Stream -> IO StreamPriority
getPriority :: Stream -> IO Int
getPriority !Stream
st = (Status, Int) -> IO Int
forall a. (Status, a) -> IO a
resultIfOk ((Status, Int) -> IO Int) -> IO (Status, Int) -> IO Int
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream -> IO (Status, Int)
cuStreamGetPriority Stream
st
{-# INLINE cuStreamGetPriority #-}
cuStreamGetPriority :: (Stream) -> IO ((Status), (StreamPriority))
cuStreamGetPriority :: Stream -> IO (Status, Int)
cuStreamGetPriority Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
(Ptr CInt -> IO (Status, Int)) -> IO (Status, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO (Status, Int)) -> IO (Status, Int))
-> (Ptr CInt -> IO (Status, Int)) -> IO (Status, Int)
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a2' ->
Ptr () -> Ptr CInt -> IO CInt
cuStreamGetPriority'_ Ptr ()
a1' Ptr CInt
a2' IO CInt -> (CInt -> IO (Status, Int)) -> IO (Status, Int)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Ptr CInt -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CInt
a2'IO Int -> (Int -> IO (Status, Int)) -> IO (Status, Int)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Int
a2'' ->
(Status, Int) -> IO (Status, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Int
a2'')
{-# LINE 260 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE getFlags #-}
getFlags :: (Stream) -> IO (([StreamFlag]))
getFlags :: Stream -> IO [StreamFlag]
getFlags Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
(Ptr CUInt -> IO [StreamFlag]) -> IO [StreamFlag]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CUInt -> IO [StreamFlag]) -> IO [StreamFlag])
-> (Ptr CUInt -> IO [StreamFlag]) -> IO [StreamFlag]
forall a b. (a -> b) -> a -> b
$ \Ptr CUInt
a2' ->
Ptr () -> Ptr CUInt -> IO CInt
getFlags'_ Ptr ()
a1' Ptr CUInt
a2' IO CInt -> (CInt -> IO [StreamFlag]) -> IO [StreamFlag]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
CInt -> IO ()
checkStatus CInt
res IO () -> IO [StreamFlag] -> IO [StreamFlag]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
Ptr CUInt -> IO [StreamFlag]
forall a b.
(Num a, Bits a, Enum b, Bounded b, Storable a) =>
Ptr a -> IO [b]
extract Ptr CUInt
a2'IO [StreamFlag]
-> ([StreamFlag] -> IO [StreamFlag]) -> IO [StreamFlag]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \[StreamFlag]
a2'' ->
[StreamFlag] -> IO [StreamFlag]
forall (m :: * -> *) a. Monad m => a -> m a
return ([StreamFlag]
a2'')
{-# LINE 274 "src/Foreign/CUDA/Driver/Stream.chs" #-}
where
extract p = extractBitMasks `fmap` peek p
{-# INLINEABLE getContext #-}
getContext :: Stream -> IO Context
getContext :: Stream -> IO Context
getContext !Stream
st = (Status, Context) -> IO Context
forall a. (Status, a) -> IO a
resultIfOk ((Status, Context) -> IO Context)
-> IO (Status, Context) -> IO Context
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream -> IO (Status, Context)
cuStreamGetCtx Stream
st
{-# INLINE cuStreamGetCtx #-}
cuStreamGetCtx :: (Stream) -> IO ((Status), (Context))
cuStreamGetCtx :: Stream -> IO (Status, Context)
cuStreamGetCtx Stream
a1 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
(Ptr (Ptr ()) -> IO (Status, Context)) -> IO (Status, Context)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO (Status, Context)) -> IO (Status, Context))
-> (Ptr (Ptr ()) -> IO (Status, Context)) -> IO (Status, Context)
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a2' ->
Ptr () -> Ptr (Ptr ()) -> IO CInt
cuStreamGetCtx'_ Ptr ()
a1' Ptr (Ptr ())
a2' IO CInt -> (CInt -> IO (Status, Context)) -> IO (Status, Context)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Ptr (Ptr ()) -> IO Context
peekCtx Ptr (Ptr ())
a2'IO Context
-> (Context -> IO (Status, Context)) -> IO (Status, Context)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Context
a2'' ->
(Status, Context) -> IO (Status, Context)
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res', Context
a2'')
{-# LINE 302 "src/Foreign/CUDA/Driver/Stream.chs" #-}
where
peekCtx :: Ptr (Ptr ()) -> IO Context
peekCtx = (Ptr () -> Context) -> IO (Ptr ()) -> IO Context
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Ptr () -> Context
Context (IO (Ptr ()) -> IO Context)
-> (Ptr (Ptr ()) -> IO (Ptr ())) -> Ptr (Ptr ()) -> IO Context
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (Ptr ()) -> IO (Ptr ())
forall a. Storable a => Ptr a -> IO a
peek
{-# INLINEABLE write #-}
write :: Storable a => DevicePtr a -> a -> Stream -> [StreamWriteFlag] -> IO ()
write :: DevicePtr a -> a -> Stream -> [StreamWriteFlag] -> IO ()
write DevicePtr a
ptr a
val Stream
stream [StreamWriteFlag]
flags =
case a -> Int
forall a. Storable a => a -> Int
sizeOf a
val of
Int
4 -> DevicePtr Word32 -> Word32 -> Stream -> [StreamWriteFlag] -> IO ()
write32 (DevicePtr a -> DevicePtr Word32
forall a b. DevicePtr a -> DevicePtr b
castDevPtr DevicePtr a
ptr) (a -> Word32
forall a b. a -> b
unsafeCoerce a
val) Stream
stream [StreamWriteFlag]
flags
Int
8 -> DevicePtr Word64 -> Word64 -> Stream -> [StreamWriteFlag] -> IO ()
write64 (DevicePtr a -> DevicePtr Word64
forall a b. DevicePtr a -> DevicePtr b
castDevPtr DevicePtr a
ptr) (a -> Word64
forall a b. a -> b
unsafeCoerce a
val) Stream
stream [StreamWriteFlag]
flags
Int
_ -> String -> IO ()
forall a. String -> IO a
cudaErrorIO String
"Stream.write: can only write 32- and 64-bit values"
{-# INLINE write32 #-}
write32 :: DevicePtr Word32 -> Word32 -> Stream -> [StreamWriteFlag] -> IO ()
write32 :: DevicePtr Word32 -> Word32 -> Stream -> [StreamWriteFlag] -> IO ()
write32 DevicePtr Word32
ptr Word32
val Stream
stream [StreamWriteFlag]
flags = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream
-> DevicePtr Word32 -> Word32 -> [StreamWriteFlag] -> IO Status
cuStreamWriteValue32 Stream
stream DevicePtr Word32
ptr Word32
val [StreamWriteFlag]
flags
{-# INLINE cuStreamWriteValue32 #-}
cuStreamWriteValue32 :: (Stream) -> (DevicePtr Word32) -> (Word32) -> ([StreamWriteFlag]) -> IO ((Status))
cuStreamWriteValue32 :: Stream
-> DevicePtr Word32 -> Word32 -> [StreamWriteFlag] -> IO Status
cuStreamWriteValue32 Stream
a1 DevicePtr Word32
a2 Word32
a3 [StreamWriteFlag]
a4 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
let {a2' :: CULLong
a2' = DevicePtr Word32 -> CULLong
forall a. DevicePtr a -> CULLong
useDeviceHandle DevicePtr Word32
a2} in
let {a3' :: CUInt
a3' = Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
a3} in
let {a4' :: CUInt
a4' = [StreamWriteFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamWriteFlag]
a4} in
Ptr () -> CULLong -> CUInt -> CUInt -> IO CInt
cuStreamWriteValue32'_ Ptr ()
a1' CULLong
a2' CUInt
a3' CUInt
a4' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 343 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINE write64 #-}
write64 :: DevicePtr Word64 -> Word64 -> Stream -> [StreamWriteFlag] -> IO ()
write64 :: DevicePtr Word64 -> Word64 -> Stream -> [StreamWriteFlag] -> IO ()
write64 DevicePtr Word64
ptr Word64
val Stream
stream [StreamWriteFlag]
flags = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream
-> DevicePtr Word64 -> Word64 -> [StreamWriteFlag] -> IO Status
cuStreamWriteValue64 Stream
stream DevicePtr Word64
ptr Word64
val [StreamWriteFlag]
flags
{-# INLINE cuStreamWriteValue64 #-}
cuStreamWriteValue64 :: (Stream) -> (DevicePtr Word64) -> (Word64) -> ([StreamWriteFlag]) -> IO ((Status))
cuStreamWriteValue64 :: Stream
-> DevicePtr Word64 -> Word64 -> [StreamWriteFlag] -> IO Status
cuStreamWriteValue64 Stream
a1 DevicePtr Word64
a2 Word64
a3 [StreamWriteFlag]
a4 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
let {a2' :: CULLong
a2' = DevicePtr Word64 -> CULLong
forall a. DevicePtr a -> CULLong
useDeviceHandle DevicePtr Word64
a2} in
let {a3' :: CULLong
a3' = Word64 -> CULLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
a3} in
let {a4' :: CUInt
a4' = [StreamWriteFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamWriteFlag]
a4} in
Ptr () -> CULLong -> CULLong -> CUInt -> IO CInt
cuStreamWriteValue64'_ Ptr ()
a1' CULLong
a2' CULLong
a3' CUInt
a4' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 360 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE wait #-}
wait :: Storable a => DevicePtr a -> a -> Stream -> [StreamWaitFlag] -> IO ()
wait :: DevicePtr a -> a -> Stream -> [StreamWaitFlag] -> IO ()
wait DevicePtr a
ptr a
val Stream
stream [StreamWaitFlag]
flags =
case a -> Int
forall a. Storable a => a -> Int
sizeOf a
val of
Int
4 -> DevicePtr Word32 -> Word32 -> Stream -> [StreamWaitFlag] -> IO ()
wait32 (DevicePtr a -> DevicePtr Word32
forall a b. DevicePtr a -> DevicePtr b
castDevPtr DevicePtr a
ptr) (a -> Word32
forall a b. a -> b
unsafeCoerce a
val) Stream
stream [StreamWaitFlag]
flags
Int
8 -> DevicePtr Word64 -> Word64 -> Stream -> [StreamWaitFlag] -> IO ()
wait64 (DevicePtr a -> DevicePtr Word64
forall a b. DevicePtr a -> DevicePtr b
castDevPtr DevicePtr a
ptr) (a -> Word64
forall a b. a -> b
unsafeCoerce a
val) Stream
stream [StreamWaitFlag]
flags
Int
_ -> String -> IO ()
forall a. String -> IO a
cudaErrorIO String
"Stream.wait: can only wait on 32- and 64-bit values"
{-# INLINE wait32 #-}
wait32 :: DevicePtr Word32 -> Word32 -> Stream -> [StreamWaitFlag] -> IO ()
wait32 :: DevicePtr Word32 -> Word32 -> Stream -> [StreamWaitFlag] -> IO ()
wait32 DevicePtr Word32
ptr Word32
val Stream
stream [StreamWaitFlag]
flags = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream
-> DevicePtr Word32 -> Word32 -> [StreamWaitFlag] -> IO Status
cuStreamWaitValue32 Stream
stream DevicePtr Word32
ptr Word32
val [StreamWaitFlag]
flags
{-# INLINE cuStreamWaitValue32 #-}
cuStreamWaitValue32 :: (Stream) -> (DevicePtr Word32) -> (Word32) -> ([StreamWaitFlag]) -> IO ((Status))
cuStreamWaitValue32 :: Stream
-> DevicePtr Word32 -> Word32 -> [StreamWaitFlag] -> IO Status
cuStreamWaitValue32 Stream
a1 DevicePtr Word32
a2 Word32
a3 [StreamWaitFlag]
a4 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
let {a2' :: CULLong
a2' = DevicePtr Word32 -> CULLong
forall a. DevicePtr a -> CULLong
useDeviceHandle DevicePtr Word32
a2} in
let {a3' :: CUInt
a3' = Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
a3} in
let {a4' :: CUInt
a4' = [StreamWaitFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamWaitFlag]
a4} in
Ptr () -> CULLong -> CUInt -> CUInt -> IO CInt
cuStreamWaitValue32'_ Ptr ()
a1' CULLong
a2' CUInt
a3' CUInt
a4' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 396 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINE wait64 #-}
wait64 :: DevicePtr Word64 -> Word64 -> Stream -> [StreamWaitFlag] -> IO ()
wait64 :: DevicePtr Word64 -> Word64 -> Stream -> [StreamWaitFlag] -> IO ()
wait64 DevicePtr Word64
ptr Word64
val Stream
stream [StreamWaitFlag]
flags = Status -> IO ()
nothingIfOk (Status -> IO ()) -> IO Status -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Stream
-> DevicePtr Word64 -> Word64 -> [StreamWaitFlag] -> IO Status
cuStreamWaitValue64 Stream
stream DevicePtr Word64
ptr Word64
val [StreamWaitFlag]
flags
{-# INLINE cuStreamWaitValue64 #-}
cuStreamWaitValue64 :: (Stream) -> (DevicePtr Word64) -> (Word64) -> ([StreamWaitFlag]) -> IO ((Status))
cuStreamWaitValue64 :: Stream
-> DevicePtr Word64 -> Word64 -> [StreamWaitFlag] -> IO Status
cuStreamWaitValue64 Stream
a1 DevicePtr Word64
a2 Word64
a3 [StreamWaitFlag]
a4 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
let {a2' :: CULLong
a2' = DevicePtr Word64 -> CULLong
forall a. DevicePtr a -> CULLong
useDeviceHandle DevicePtr Word64
a2} in
let {a3' :: CULLong
a3' = Word64 -> CULLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
a3} in
let {a4' :: CUInt
a4' = [StreamWaitFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamWaitFlag]
a4} in
Ptr () -> CULLong -> CULLong -> CUInt -> IO CInt
cuStreamWaitValue64'_ Ptr ()
a1' CULLong
a2' CULLong
a3' CUInt
a4' IO CInt -> (CInt -> IO Status) -> IO Status
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
let {res' :: Status
res' = CInt -> Status
forall i e. (Integral i, Enum e) => i -> e
cToEnum CInt
res} in
Status -> IO Status
forall (m :: * -> *) a. Monad m => a -> m a
return (Status
res')
{-# LINE 412 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINEABLE callback #-}
callback :: (Stream) -> (StreamCallback) -> (Ptr ()) -> ([StreamCallbackFlag]) -> IO ()
callback :: Stream -> StreamCallback -> Ptr () -> [StreamCallbackFlag] -> IO ()
callback Stream
a1 StreamCallback
a2 Ptr ()
a3 [StreamCallbackFlag]
a4 =
let {a1' :: Ptr ()
a1' = Stream -> Ptr ()
useStream Stream
a1} in
let {a2' :: StreamCallback
a2' = StreamCallback -> StreamCallback
forall a. a -> a
id StreamCallback
a2} in
let {a3' :: Ptr ()
a3' = Ptr () -> Ptr ()
forall a. a -> a
id Ptr ()
a3} in
let {a4' :: CUInt
a4' = [StreamCallbackFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [StreamCallbackFlag]
a4} in
Ptr () -> StreamCallback -> Ptr () -> CUInt -> IO CInt
callback'_ Ptr ()
a1' StreamCallback
a2' Ptr ()
a3' CUInt
a4' IO CInt -> (CInt -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
() -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# LINE 428 "src/Foreign/CUDA/Driver/Stream.chs" #-}
{-# INLINE defaultStream #-}
defaultStream :: Stream
defaultStream :: Stream
defaultStream = Ptr () -> Stream
Stream (Addr# -> Ptr ()
forall a. Addr# -> Ptr a
Ptr (Int# -> Addr#
int2Addr# Int#
0#))
{-# INLINE defaultStreamLegacy #-}
defaultStreamLegacy :: Stream
defaultStreamLegacy :: Stream
defaultStreamLegacy = Ptr () -> Stream
Stream (Addr# -> Ptr ()
forall a. Addr# -> Ptr a
Ptr (Int# -> Addr#
int2Addr# Int#
0x1#))
{-# INLINE defaultStreamPerThread #-}
defaultStreamPerThread :: Stream
defaultStreamPerThread :: Stream
defaultStreamPerThread = Ptr () -> Stream
Stream (Addr# -> Ptr ()
forall a. Addr# -> Ptr a
Ptr (Int# -> Addr#
int2Addr# Int#
0x2#))
{-# INLINE useDeviceHandle #-}
useDeviceHandle :: DevicePtr a -> (C2HSImp.CULLong)
{-# LINE 475 "src/Foreign/CUDA/Driver/Stream.chs" #-}
useDeviceHandle (DevicePtr (Ptr addr#)) =
CULLong (W64# (int2Word# (addr2Int# addr#)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamCreate"
cuStreamCreate'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamCreateWithPriority"
cuStreamCreateWithPriority'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CUInt -> (C2HSImp.CInt -> (IO C2HSImp.CInt))))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamDestroy"
cuStreamDestroy'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamQuery"
cuStreamQuery'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall safe "Foreign/CUDA/Driver/Stream.chs.h cuStreamSynchronize"
cuStreamSynchronize'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamGetPriority"
cuStreamGetPriority'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamGetFlags"
getFlags'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr C2HSImp.CUInt) -> (IO C2HSImp.CInt)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamGetCtx"
cuStreamGetCtx'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamWriteValue32"
cuStreamWriteValue32'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CULLong -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamWriteValue64"
cuStreamWriteValue64'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CULLong -> (C2HSImp.CULLong -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamWaitValue32"
cuStreamWaitValue32'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CULLong -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamWaitValue64"
cuStreamWaitValue64'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CULLong -> (C2HSImp.CULLong -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamAddCallback"
callback'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr ()) -> (IO ()))))) -> ((C2HSImp.Ptr ()) -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))))