module Data.Repa.Eval.Generic.Par.Interleaved
(fillInterleaved)
where
import Data.Repa.Eval.Gang
import GHC.Exts
fillInterleaved
:: Gang
-> (Int# -> a -> IO ())
-> (Int# -> a)
-> Int#
-> IO ()
fillInterleaved :: forall a.
Gang -> (Int# -> a -> IO ()) -> (Int# -> a) -> Int# -> IO ()
fillInterleaved Gang
gang Int# -> a -> IO ()
write Int# -> a
getElem Int#
len
= Gang -> (Int# -> IO ()) -> IO ()
gangIO Gang
gang
((Int# -> IO ()) -> IO ()) -> (Int# -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Int#
thread ->
let !step :: Int#
step = Int#
threads
!start :: Int#
start = Int#
thread
!count :: Int#
count = Int# -> Int#
elemsForThread Int#
thread
in Int# -> Int# -> Int# -> IO ()
fill Int#
step Int#
start Int#
count
where
!threads :: Int#
threads = Gang -> Int#
gangSize Gang
gang
!chunkLenBase :: Int#
chunkLenBase = Int#
len Int# -> Int# -> Int#
`quotInt#` Int#
threads
!chunkLenSlack :: Int#
chunkLenSlack = Int#
len Int# -> Int# -> Int#
`remInt#` Int#
threads
elemsForThread :: Int# -> Int#
elemsForThread Int#
thread
| Int#
1# <- Int#
thread Int# -> Int# -> Int#
<# Int#
chunkLenSlack = Int#
chunkLenBase Int# -> Int# -> Int#
+# Int#
1#
| Bool
otherwise = Int#
chunkLenBase
{-# INLINE elemsForThread #-}
fill :: Int# -> Int# -> Int# -> IO ()
fill !Int#
step !Int#
ix0 !Int#
count0
= Int# -> Int# -> IO ()
go Int#
ix0 Int#
count0
where
go :: Int# -> Int# -> IO ()
go !Int#
ix !Int#
count
| Int#
1# <- Int#
count Int# -> Int# -> Int#
<=# Int#
0# = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise
= do Int# -> a -> IO ()
write Int#
ix (Int# -> a
getElem Int#
ix)
Int# -> Int# -> IO ()
go (Int#
ix Int# -> Int# -> Int#
+# Int#
step) (Int#
count Int# -> Int# -> Int#
-# Int#
1#)
{-# INLINE fill #-}
{-# INLINE [0] fillInterleaved #-}