-- GENERATED by C->Haskell Compiler, version 0.25.2 Snowboundest, 31 Oct 2014 (Haskell) -- Edit the ORIGNAL .chs file instead! {-# LINE 1 "./Foreign/CUDA/Driver/Context/Peer.chs" #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE EmptyCase #-} -------------------------------------------------------------------------------- -- | -- Module : Foreign.CUDA.Driver.Context.Peer -- Copyright : [2009..2015] Trevor L. McDonell -- License : BSD -- -- Direct peer context access functions for the low-level driver interface. -- -- Since: CUDA-4.0 -- -------------------------------------------------------------------------------- module Foreign.CUDA.Driver.Context.Peer ( -- * Peer Access PeerFlag, accessible, add, remove, ) where {-# LINE 30 "./Foreign/CUDA/Driver/Context/Peer.chs" #-} -- Friends import Foreign.CUDA.Driver.Context.Base ( Context(..) ) import Foreign.CUDA.Driver.Device ( Device(..) ) import Foreign.CUDA.Driver.Error import Foreign.CUDA.Internal.C2HS -- System import Foreign import Foreign.C -------------------------------------------------------------------------------- -- Data Types -------------------------------------------------------------------------------- -- | -- Possible option values for direct peer memory access -- data PeerFlag instance Enum PeerFlag where toEnum x = case x of {} fromEnum x = case x of {} -------------------------------------------------------------------------------- -- Peer access -------------------------------------------------------------------------------- -- | -- Queries if the first device can directly access the memory of the second. If -- direct access is possible, it can then be enabled with 'add'. -- -- Requires CUDA-4.0. -- -- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__PEER__ACCESS.html#group__CUDA__PEER__ACCESS_1g496bdaae1f632ebfb695b99d2c40f19e> -- {-# INLINEABLE accessible #-} accessible :: Device -> Device -> IO Bool accessible !dev !peer = resultIfOk =<< cuDeviceCanAccessPeer dev peer {-# INLINE cuDeviceCanAccessPeer #-} cuDeviceCanAccessPeer :: (Device) -> (Device) -> IO ((Status), (Bool)) cuDeviceCanAccessPeer a2 a3 = alloca $ \a1' -> let {a2' = useDevice a2} in let {a3' = useDevice a3} in cuDeviceCanAccessPeer'_ a1' a2' a3' >>= \res -> let {res' = cToEnum res} in peekBool a1'>>= \a1'' -> return (res', a1'') {-# LINE 82 "./Foreign/CUDA/Driver/Context/Peer.chs" #-} -- | -- If the devices of both the current and supplied contexts support unified -- addressing, then enable allocations in the supplied context to be accessible -- by the current context. -- -- Note that access is unidirectional, and in order to access memory in the -- current context from the peer context, a separate symmetric call to -- 'add' is required. -- -- Requires CUDA-4.0. -- -- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__PEER__ACCESS.html#group__CUDA__PEER__ACCESS_1g0889ec6728e61c05ed359551d67b3f5a> -- {-# INLINEABLE add #-} add :: Context -> [PeerFlag] -> IO () add !ctx !flags = nothingIfOk =<< cuCtxEnablePeerAccess ctx flags {-# INLINE cuCtxEnablePeerAccess #-} cuCtxEnablePeerAccess :: (Context) -> ([PeerFlag]) -> IO ((Status)) cuCtxEnablePeerAccess a1 a2 = let {a1' = useContext a1} in let {a2' = combineBitMasks a2} in cuCtxEnablePeerAccess'_ a1' a2' >>= \res -> let {res' = cToEnum res} in return (res') {-# LINE 109 "./Foreign/CUDA/Driver/Context/Peer.chs" #-} -- | -- Disable direct memory access from the current context to the supplied -- peer context, and unregisters any registered allocations. -- -- Requires CUDA-4.0. -- -- <http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__PEER__ACCESS.html#group__CUDA__PEER__ACCESS_1g5b4b6936ea868d4954ce4d841a3b4810> -- {-# INLINEABLE remove #-} remove :: Context -> IO () remove !ctx = nothingIfOk =<< cuCtxDisablePeerAccess ctx {-# INLINE cuCtxDisablePeerAccess #-} cuCtxDisablePeerAccess :: (Context) -> IO ((Status)) cuCtxDisablePeerAccess a1 = let {a1' = useContext a1} in cuCtxDisablePeerAccess'_ a1' >>= \res -> let {res' = cToEnum res} in return (res') {-# LINE 130 "./Foreign/CUDA/Driver/Context/Peer.chs" #-} foreign import ccall unsafe "Foreign/CUDA/Driver/Context/Peer.chs.h cuDeviceCanAccessPeer" cuDeviceCanAccessPeer'_ :: ((Ptr CInt) -> (CInt -> (CInt -> (IO CInt)))) foreign import ccall unsafe "Foreign/CUDA/Driver/Context/Peer.chs.h cuCtxEnablePeerAccess" cuCtxEnablePeerAccess'_ :: ((Ptr ()) -> (CUInt -> (IO CInt))) foreign import ccall unsafe "Foreign/CUDA/Driver/Context/Peer.chs.h cuCtxDisablePeerAccess" cuCtxDisablePeerAccess'_ :: ((Ptr ()) -> (IO CInt))