{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_HADDOCK hide #-}
module Data.Array.Accelerate.LLVM.Execute.Async
where
import Data.Array.Accelerate.LLVM.State ( LLVM )
import Data.Array.Accelerate.Representation.Array
import Data.Array.Accelerate.Representation.Type
import GHC.Stack
class Monad (Par arch) => Async arch where
data Par arch :: * -> *
type FutureR arch :: * -> *
new :: HasCallStack => Par arch (FutureR arch a)
put :: HasCallStack => FutureR arch a -> a -> Par arch ()
get :: HasCallStack => FutureR arch a -> Par arch a
fork :: HasCallStack => Par arch () -> Par arch ()
liftPar :: HasCallStack => LLVM arch a -> Par arch a
{-# INLINEABLE block #-}
block :: HasCallStack => FutureR arch a -> Par arch a
block = FutureR arch a -> Par arch a
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> Par arch a
get
{-# INLINEABLE spawn #-}
spawn :: HasCallStack => Par arch a -> Par arch a
spawn Par arch a
m = do
FutureR arch a
r <- Par arch (FutureR arch a)
forall arch a.
(Async arch, HasCallStack) =>
Par arch (FutureR arch a)
new
Par arch () -> Par arch ()
forall arch.
(Async arch, HasCallStack) =>
Par arch () -> Par arch ()
fork (Par arch () -> Par arch ()) -> Par arch () -> Par arch ()
forall a b. (a -> b) -> a -> b
$ FutureR arch a -> a -> Par arch ()
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> a -> Par arch ()
put FutureR arch a
r (a -> Par arch ()) -> Par arch a -> Par arch ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Par arch a
m
FutureR arch a -> Par arch a
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> Par arch a
get FutureR arch a
r
{-# INLINEABLE newFull #-}
newFull :: HasCallStack => a -> Par arch (FutureR arch a)
newFull a
a = do
FutureR arch a
r <- Par arch (FutureR arch a)
forall arch a.
(Async arch, HasCallStack) =>
Par arch (FutureR arch a)
new
FutureR arch a -> a -> Par arch ()
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> a -> Par arch ()
put FutureR arch a
r a
a
FutureR arch a -> Par arch (FutureR arch a)
forall (m :: * -> *) a. Monad m => a -> m a
return FutureR arch a
r
type family FutureArraysR arch arrs where
FutureArraysR arch () = ()
FutureArraysR arch (a, b) = (FutureArraysR arch a, FutureArraysR arch b)
FutureArraysR arch (Array sh e) = FutureR arch (Array sh e)
getArrays :: Async arch => ArraysR a -> FutureArraysR arch a -> Par arch a
getArrays :: ArraysR a -> FutureArraysR arch a -> Par arch a
getArrays (TupRsingle ArrayR{}) FutureArraysR arch a
a = FutureR arch a -> Par arch a
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> Par arch a
get FutureArraysR arch a
FutureR arch a
a
getArrays ArraysR a
TupRunit FutureArraysR arch a
_ = () -> Par arch ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
getArrays (TupRpair TupR ArrayR a1
r1 TupR ArrayR b
r2) (a1, a2) = (,) (a1 -> b -> (a1, b)) -> Par arch a1 -> Par arch (b -> (a1, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TupR ArrayR a1 -> FutureArraysR arch a1 -> Par arch a1
forall arch a.
Async arch =>
ArraysR a -> FutureArraysR arch a -> Par arch a
getArrays TupR ArrayR a1
r1 FutureArraysR arch a1
a1 Par arch (b -> (a1, b)) -> Par arch b -> Par arch (a1, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TupR ArrayR b -> FutureArraysR arch b -> Par arch b
forall arch a.
Async arch =>
ArraysR a -> FutureArraysR arch a -> Par arch a
getArrays TupR ArrayR b
r2 FutureArraysR arch b
a2
blockArrays :: Async arch => ArraysR a -> FutureArraysR arch a -> Par arch a
blockArrays :: ArraysR a -> FutureArraysR arch a -> Par arch a
blockArrays (TupRsingle ArrayR{}) FutureArraysR arch a
a = FutureR arch a -> Par arch a
forall arch a.
(Async arch, HasCallStack) =>
FutureR arch a -> Par arch a
block FutureArraysR arch a
FutureR arch a
a
blockArrays ArraysR a
TupRunit FutureArraysR arch a
_ = () -> Par arch ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
blockArrays (TupRpair TupR ArrayR a1
r1 TupR ArrayR b
r2) (a1, a2) = (,) (a1 -> b -> (a1, b)) -> Par arch a1 -> Par arch (b -> (a1, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TupR ArrayR a1 -> FutureArraysR arch a1 -> Par arch a1
forall arch a.
Async arch =>
ArraysR a -> FutureArraysR arch a -> Par arch a
blockArrays TupR ArrayR a1
r1 FutureArraysR arch a1
a1 Par arch (b -> (a1, b)) -> Par arch b -> Par arch (a1, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TupR ArrayR b -> FutureArraysR arch b -> Par arch b
forall arch a.
Async arch =>
ArraysR a -> FutureArraysR arch a -> Par arch a
blockArrays TupR ArrayR b
r2 FutureArraysR arch b
a2
newArrays :: Async arch => ArraysR a -> Par arch (FutureArraysR arch a)
newArrays :: ArraysR a -> Par arch (FutureArraysR arch a)
newArrays ArraysR a
TupRunit = () -> Par arch ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
newArrays (TupRsingle ArrayR{}) = Par arch (FutureArraysR arch a)
forall arch a.
(Async arch, HasCallStack) =>
Par arch (FutureR arch a)
new
newArrays (TupRpair TupR ArrayR a1
repr1 TupR ArrayR b
repr2) = (,) (FutureArraysR arch a1
-> FutureArraysR arch b
-> (FutureArraysR arch a1, FutureArraysR arch b))
-> Par arch (FutureArraysR arch a1)
-> Par
arch
(FutureArraysR arch b
-> (FutureArraysR arch a1, FutureArraysR arch b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TupR ArrayR a1 -> Par arch (FutureArraysR arch a1)
forall arch a.
Async arch =>
ArraysR a -> Par arch (FutureArraysR arch a)
newArrays TupR ArrayR a1
repr1 Par
arch
(FutureArraysR arch b
-> (FutureArraysR arch a1, FutureArraysR arch b))
-> Par arch (FutureArraysR arch b)
-> Par arch (FutureArraysR arch a1, FutureArraysR arch b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TupR ArrayR b -> Par arch (FutureArraysR arch b)
forall arch a.
Async arch =>
ArraysR a -> Par arch (FutureArraysR arch a)
newArrays TupR ArrayR b
repr2