packages feed

meta-par-accelerate-0.3.2: Control/Monad/Par/Meta/AccSMP.hs

{-# LANGUAGE GeneralizedNewtypeDeriving, ConstraintKinds, FlexibleContexts, MultiParamTypeClasses #-}
{-# LANGUAGE ConstraintKinds, TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}

-- | A meta-par /scheduler/ for programming with shared memory
--   multicore CPUs plus GPU parallelism.
-- 
-- This provides a full implementation of the
-- 'Control.Monad.Par.Par'-monad programming abstraction
-- (specifically, the 'Control.Monad.Par.ParIVar' class).
--
module Control.Monad.Par.Meta.AccSMP 
 (
    -- | A `Par` monad supporting only SMP and GPU resources.
    Par, 

    -- | The IVar type for use with the `Par` newtype in this module.
    Meta.IVar,

    -- | Running `Par` computations on CPU and GPU.
    runPar, 

    -- | Same as `runPar` but don't hide the IO.
    runParIO,
 
    -- * Par-monad operations, including GPU operations    
    ParAccelerate(..), 
    -- unsafeHybridVector, unsafeHybridIArray,
--    module AC,     
--    module OC, 
    module PC    
 ) where

-- import Data.Array.Accelerate (Acc,Arrays)
-- import Data.Array.Accelerate.CUDA (Async)
import Data.Monoid
import Control.Monad.Par.Class as PC
import Control.Monad.Par.Accelerate as AC
-- import qualified Control.Monad.Par.OffChip    as OC
import qualified Control.Monad.Par.Meta as Meta 
import qualified Control.Monad.Par.Meta.Resources.Accelerate as Rsrc
import qualified Control.Monad.Par.Meta.Resources.SMP as SMP
import GHC.Conc (numCapabilities)

--------------------------------------------------------------------------------

tries :: Int
tries = numCapabilities

newtype Par a = AccSMPPar (Meta.Par a)
 deriving (Monad, Functor, 
           PC.ParFuture     Meta.IVar,
           PC.ParIVar       Meta.IVar,
           AC.ParAccelerate Meta.IVar 
          ) -- NOT MonadIO  

resource :: Meta.Resource
resource = SMP.mkResource tries `mappend` Rsrc.mkResource

-- <boilerplate>
{-
instance OC.ParOffChip Acc Meta.IVar Par where 
  type OffChipConstraint a = Arrays a 
  runOffChip   r x = AccSMPPar$ Rsrc.runAcc   r x
  spawnOffChip r x = AccSMPPar$ Rsrc.spawnAcc r x
  unsafeHybrid r cvt (AccSMPPar p,a) = AccSMPPar$ Rsrc.unsafeHybrid r cvt (p,a)  
-}

-- run1Async :: (Arrays a, Arrays b) => (Acc a -> Acc b) -> a -> Async b


{-
instance OC.ParOffChip Async Meta.IVar Par where 
  type OffChipConstraint a = Arrays a 
  runOffChip   r x = AccSMPPar$ Rsrc.runAcc   r x
  spawnOffChip r x = AccSMPPar$ Rsrc.spawnAcc r x
  unsafeHybrid r cvt (AccSMPPar p,a) = AccSMPPar$ Rsrc.unsafeHybrid r cvt (p,a)  
-}

runPar   :: Par a -> a
runPar (AccSMPPar p) = Meta.runMetaPar resource p

runParIO :: Par a -> IO a
runParIO (AccSMPPar p) = Meta.runMetaParIO resource p