packages feed

cusparse-0.1.0.0: Foreign/CUDA/BLAS/Sparse/Analysis.chs

{-# LANGUAGE CPP                      #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LANGUAGE ForeignFunctionInterface #-}
-- |
-- Module      : Foreign.CUDA.BLAS.Sparse.Analysis
-- Copyright   : [2017] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Foreign.CUDA.BLAS.Sparse.Analysis (

  Info(..), createInfo, destroyInfo,
  Info_csrsv2(..), createInfo_csrsv2, destroyInfo_csrsv2,
  Info_csric02(..), createInfo_csric02, destroyInfo_csric02,
  Info_csrilu02(..), createInfo_csrilu02, destroyInfo_csrilu02,
  Info_bsrsv2(..), createInfo_bsrsv2, destroyInfo_bsrsv2,
  Info_bsrsm2(..), createInfo_bsrsm2, destroyInfo_bsrsm2,
  Info_bsric02(..), createInfo_bsric02, destroyInfo_bsric02,
  Info_bsrilu02(..), createInfo_bsrilu02, destroyInfo_bsrilu02,
  Info_csrgemm2(..), createInfo_csrgemm2, destroyInfo_csrgemm2,
  Info_color(..), createInfo_color, destroyInfo_color,
  Info_csru2csr(..), createInfo_csru2csr, destroyInfo_csru2csr,

) where

-- Friends
import Foreign.CUDA.BLAS.Sparse.Error
import Foreign.CUDA.BLAS.Sparse.Internal.C2HS

-- System
import Foreign
import Foreign.C
import Control.Monad                                      ( liftM )

#include "cbits/stubs.h"
{# context lib="cusparse" #}


-- | An opaque structure holding the information collected in the analysis phase
-- of the solution of the sparse triangular linear system.
--
-- <http://docs.nvidia.com/cuda/cusparse/index.html#cusparsesolveanalysisinfot>
--
newtype Info = Info { useInfo :: {# type cusparseSolveAnalysisInfo_t #}}

-- | Create and initialise the solve and analysis structure to default values.
--
-- <http://docs.nvidia.com/cuda/cusparse/index.html#cusparsecreatesolveanalysisinfo>
--
{-# INLINEABLE createInfo #-}
{# fun unsafe cusparseCreateSolveAnalysisInfo as createInfo
  { alloca- `Info' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info . peek

-- | Release memory associated with a matrix solver structure.
--
-- <http://docs.nvidia.com/cuda/cusparse/index.html#cusparsedestroysolveanalysisinfo>
--
{-# INLINEABLE destroyInfo #-}
{# fun unsafe cusparseDestroySolveAnalysisInfo as destroyInfo
  { useInfo `Info' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#csrsv2infot>
--
newtype Info_csrsv2 = Info_csrsv2 { useInfo_csrsv2 :: {# type csrsv2Info_t #}}

{-# INLINEABLE createInfo_csrsv2 #-}
{# fun unsafe cusparseCreateCsrsv2Info as createInfo_csrsv2
  { alloca- `Info_csrsv2' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_csrsv2 . peek

{-# INLINEABLE destroyInfo_csrsv2 #-}
{# fun unsafe cusparseDestroyCsrsv2Info as destroyInfo_csrsv2
  { useInfo_csrsv2 `Info_csrsv2' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#csric02infot>
--
newtype Info_csric02 = Info_csric02 { useInfo_csric02 :: {# type csric02Info_t #}}

{-# INLINEABLE createInfo_csric02 #-}
{# fun unsafe cusparseCreateCsric02Info as createInfo_csric02
  { alloca- `Info_csric02' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_csric02 . peek

{-# INLINEABLE destroyInfo_csric02 #-}
{# fun unsafe cusparseDestroyCsric02Info as destroyInfo_csric02
  { useInfo_csric02 `Info_csric02' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#csrilu02infot>
--
newtype Info_csrilu02 = Info_csrilu02 { useInfo_csrilu02 :: {# type csrilu02Info_t #}}

{-# INLINEABLE createInfo_csrilu02 #-}
{# fun unsafe cusparseCreateCsrilu02Info as createInfo_csrilu02
  { alloca- `Info_csrilu02' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_csrilu02 . peek

{-# INLINEABLE destroyInfo_csrilu02 #-}
{# fun unsafe cusparseDestroyCsrilu02Info as destroyInfo_csrilu02
  { useInfo_csrilu02 `Info_csrilu02' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#bsrsv2infot>
--
newtype Info_bsrsv2 = Info_bsrsv2 { useInfo_bsrsv2 :: {# type bsrsv2Info_t #}}

{-# INLINEABLE createInfo_bsrsv2 #-}
{# fun unsafe cusparseCreateBsrsv2Info as createInfo_bsrsv2
  { alloca- `Info_bsrsv2' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_bsrsv2 . peek

{-# INLINEABLE destroyInfo_bsrsv2 #-}
{# fun unsafe cusparseDestroyBsrsv2Info as destroyInfo_bsrsv2
  { useInfo_bsrsv2 `Info_bsrsv2' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#bsrsvminfot>
--
newtype Info_bsrsm2 = Info_bsrsm2 { useInfo_bsrsm2 :: {# type bsrsm2Info_t #}}

{-# INLINEABLE createInfo_bsrsm2 #-}
{# fun unsafe cusparseCreateBsrsm2Info as createInfo_bsrsm2
  { alloca- `Info_bsrsm2' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_bsrsm2 . peek

{-# INLINEABLE destroyInfo_bsrsm2 #-}
{# fun unsafe cusparseDestroyBsrsm2Info as destroyInfo_bsrsm2
  { useInfo_bsrsm2 `Info_bsrsm2' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#bsric02infot>
--
newtype Info_bsric02 = Info_bsric02 { useInfo_bsric02 :: {# type bsric02Info_t #}}

{-# INLINEABLE createInfo_bsric02 #-}
{# fun unsafe cusparseCreateBsric02Info as createInfo_bsric02
  { alloca- `Info_bsric02' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_bsric02 . peek

{-# INLINEABLE destroyInfo_bsric02 #-}
{# fun unsafe cusparseDestroyBsric02Info as destroyInfo_bsric02
  { useInfo_bsric02 `Info_bsric02' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#bsrilu02infot>
--
newtype Info_bsrilu02 = Info_bsrilu02 { useInfo_bsrilu02 :: {# type bsrilu02Info_t #}}

{-# INLINEABLE createInfo_bsrilu02 #-}
{# fun unsafe cusparseCreateBsrilu02Info as createInfo_bsrilu02
  { alloca- `Info_bsrilu02' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_bsrilu02 . peek

{-# INLINEABLE destroyInfo_bsrilu02 #-}
{# fun unsafe cusparseDestroyBsrilu02Info as destroyInfo_bsrilu02
  { useInfo_bsrilu02 `Info_bsrilu02' } -> `()' checkStatus* #}


-- | <http://docs.nvidia.com/cuda/cusparse/index.html#csrgemm2infot>
--
#if CUDA_VERSION >= 7000
newtype Info_csrgemm2 = Info_csrgemm2 { useInfo_csrgemm2 :: {# type csrgemm2Info_t #}}

{-# INLINEABLE createInfo_csrgemm2 #-}
{# fun unsafe cusparseCreateCsrgemm2Info as createInfo_csrgemm2
  { alloca- `Info_csrgemm2' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_csrgemm2 . peek

{-# INLINEABLE destroyInfo_csrgemm2 #-}
{# fun unsafe cusparseDestroyCsrgemm2Info as destroyInfo_csrgemm2
  { useInfo_csrgemm2 `Info_csrgemm2' } -> `()' checkStatus* #}

#else
data Info_csrgemm2

createInfo_csrgemm2 :: IO Info_csrgemm2
createInfo_csrgemm2 = cusparseError "'createInfo_csrgemm2' requires at least cuda-7.0"

destroyInfo_csrgemm2 :: Info_csrgemm2 -> IO ()
destroyInfo_csrgemm2 _ = cusparseError "'destroyInfo_csrgemm2' requires at least cuda-7.0"

#endif


-- /undocumented/
--
#if CUDA_VERSION >= 7000
newtype Info_color = Info_color { useInfo_color :: {# type cusparseColorInfo_t #}}

{-# INLINEABLE createInfo_color #-}
{# fun unsafe cusparseCreateColorInfo as createInfo_color
  { alloca- `Info_color' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_color . peek

{-# INLINEABLE destroyInfo_color #-}
{# fun unsafe cusparseDestroyColorInfo as destroyInfo_color
  { useInfo_color `Info_color' } -> `()' checkStatus* #}

#else
data Info_color

createInfo_color :: IO Info_color
createInfo_color = cusparseError "'createInfo_color' requires at least cuda-7.0"

destroyInfo_color :: Info_color -> IO ()
destroyInfo_color _ = cusparseError "'destroyInfo_color' requires at least cuda-7.0"

#endif


-- /undocumented/
--
#if CUDA_VERSION >= 7000
newtype Info_csru2csr = Info_csru2csr { useInfo_csru2csr :: {# type csru2csrInfo_t #}}

{-# INLINEABLE createInfo_csru2csr #-}
{# fun unsafe cusparseCreateCsru2csrInfo as createInfo_csru2csr
  { alloca- `Info_csru2csr' peekI* } -> `()' checkStatus*- #}
  where
    peekI = liftM Info_csru2csr . peek

{-# INLINEABLE destroyInfo_csru2csr #-}
{# fun unsafe cusparseDestroyCsru2csrInfo as destroyInfo_csru2csr
  { useInfo_csru2csr `Info_csru2csr' } -> `()' checkStatus* #}

#else
data Info_csru2csr

createInfo_csru2csr :: IO Info_csru2csr
createInfo_csru2csr = cusparseError "'createInfo_csru2csr' requires at least cuda-7.0"

destroyInfo_csru2csr :: Info_csru2csr -> IO ()
destroyInfo_csru2csr _ = cusparseError "'destroyInfo_csru2csr' requires at least cuda-7.0"

#endif