module CUDA (hasCUDA, loadCUDAArray, synchronizeCUDA, getCudaArchitecture) where import Data.Int import Foreign.Ptr #ifdef DEX_CUDA import Foreign.C #else #endif hasCUDA :: Bool #ifdef DEX_CUDA hasCUDA = True foreign import ccall "dex_cuMemcpyDtoH" cuMemcpyDToH :: Int64 -> Ptr () -> Ptr () -> IO () foreign import ccall "dex_synchronizeCUDA" synchronizeCUDA :: IO () foreign import ccall "dex_ensure_has_cuda_context" ensureHasCUDAContext :: IO () foreign import ccall "dex_get_cuda_architecture" dex_getCudaArchitecture :: Int -> CString -> IO () getCudaArchitecture :: Int -> IO String getCudaArchitecture dev = withCString "sm_00" $ \cs -> dex_getCudaArchitecture dev cs >> peekCString cs #else hasCUDA = False cuMemcpyDToH :: Int64 -> Ptr () -> Ptr () -> IO () cuMemcpyDToH = error "Dex built without CUDA support" synchronizeCUDA :: IO () synchronizeCUDA = return () {-# SCC synchronizeCUDA #-} ensureHasCUDAContext :: IO () ensureHasCUDAContext = return () {-# SCC ensureHasCUDAContext #-} getCudaArchitecture :: Int -> IO String getCudaArchitecture _ = error "Dex built without CUDA support" #endif loadCUDAArray :: Ptr () -> Ptr () -> Int -> IO () loadCUDAArray hostPtr devicePtr bytes = do ensureHasCUDAContext cuMemcpyDToH (fromIntegral bytes) devicePtr hostPtr {-# SCC loadCUDAArray #-}