dph-lifted-copy-0.6.0.1: Data/Array/Parallel/PArray/Base.hs
{-# LANGUAGE CPP, FlexibleContexts #-}
#include "fusion-phases.h"
-- | Definition of the PArray type, and functions that work on it. The PArray
-- type is a PData with an array length. The functions we export from this
-- module are just wrappers for the PD functions from Data.Array.Parallel.PArray.PRepr.
--
-- TODO: Check inconsistent use of INLINE pragmas.
-- Most have INLINE_PA, but bpermutePD and nfPD have plain INLINE
--
module Data.Array.Parallel.PArray.Base (
PArray(..),
lengthPA#,
dataPA#,
-- These functions have corresponding members in the PR class
-- from Data.Array.Parallel.PArray.PData.
emptyPA,
replicatePA#,
replicatelPA#,
repeatPA#,
indexPA#,
extractPA#,
bpermutePA#,
appPA#,
applPA#,
packByTagPA#,
combine2PA#,
updatePA#,
fromListPA#, fromListPA,
nfPA,
)
where
import Data.Array.Parallel.Lifted.Unboxed (elementsSegd#)
import Data.Array.Parallel.PArray.PData
import Data.Array.Parallel.PArray.PRepr
import Data.Array.Parallel.Base (Tag)
import qualified Data.Array.Parallel.Unlifted as U
import GHC.Exts (Int#, Int(..), (+#), (*#))
import SpecConstr
-- | Lifted\/bulk parallel arrays
-- This contains the array length, along with the element data.
--
{-# ANN type PArray NoSpecConstr #-}
data PArray a = PArray Int# (PData a)
-- | Take the length field of a PArray.
lengthPA# :: PArray a -> Int#
{-# INLINE_PA lengthPA# #-}
lengthPA# (PArray n# _) = n#
-- | Take the data field of a PArray.
dataPA# :: PArray a -> PData a
{-# INLINE_PA dataPA# #-}
dataPA# (PArray _ d) = d
-- PA Wrappers ----------------------------------------------------------------
-- These wrappers work on PArrays. As the PArray contains a PData, we can
-- can just pass this to the corresponding PD function from
-- Data.Array.Parallel.PArray.PRepr. However, as a PData doesn't contain
-- the array length, we need to do the length calculations here.
--
-- Note: There are some more operator# functions that work on PArrays in
-- "Data.Array.Parallel.PArray.DataInstances". The ones there have
-- a similar shape but need to know about the underlying representation
-- constructors.
--
emptyPA :: PA a => PArray a
{-# INLINE_PA emptyPA #-}
emptyPA
= PArray 0# emptyPD
replicatePA# :: PA a => Int# -> a -> PArray a
{-# INLINE_PA replicatePA# #-}
replicatePA# n# x
= PArray n# (replicatePD n# x)
replicatelPA# :: PA a => U.Segd -> PArray a -> PArray a
{-# INLINE_PA replicatelPA# #-}
replicatelPA# segd (PArray _ xs)
= PArray (elementsSegd# segd) (replicatelPD segd xs)
repeatPA# :: PA a => Int# -> PArray a -> PArray a
{-# INLINE_PA repeatPA# #-}
repeatPA# m# (PArray n# xs)
= PArray (m# *# n#) (repeatPD m# n# xs)
indexPA# :: PA a => PArray a -> Int# -> a
{-# INLINE_PA indexPA# #-}
indexPA# (PArray _ xs) i#
= indexPD xs i#
extractPA# :: PA a => PArray a -> Int# -> Int# -> PArray a
{-# INLINE_PA extractPA# #-}
extractPA# (PArray _ xs) i# n#
= PArray n# (extractPD xs i# n#)
bpermutePA# :: PA a => PArray a -> Int# -> U.Array Int -> PArray a
{-# INLINE bpermutePA# #-}
bpermutePA# (PArray _ xs) n# is
= PArray n# (bpermutePD xs n# is)
appPA# :: PA a => PArray a -> PArray a -> PArray a
{-# INLINE_PA appPA# #-}
appPA# (PArray m# xs) (PArray n# ys)
= PArray (m# +# n#) (appPD xs ys)
applPA# :: PA a => U.Segd -> U.Segd -> PArray a -> U.Segd -> PArray a -> PArray a
{-# INLINE_PA applPA# #-}
applPA# segd is (PArray m# xs) js (PArray n# ys)
= PArray (m# +# n#) (applPD segd is xs js ys)
packByTagPA# :: PA a => PArray a -> Int# -> U.Array Tag -> Int# -> PArray a
{-# INLINE_PA packByTagPA# #-}
packByTagPA# (PArray _ xs) n# tags t#
= PArray n# (packByTagPD xs n# tags t#)
combine2PA# :: PA a => Int# -> U.Sel2 -> PArray a -> PArray a -> PArray a
{-# INLINE_PA combine2PA# #-}
combine2PA# n# sel (PArray _ as) (PArray _ bs)
= PArray n# (combine2PD n# sel as bs)
updatePA# :: PA a => PArray a -> U.Array Int -> PArray a -> PArray a
{-# INLINE_PA updatePA# #-}
updatePA# (PArray n# xs) is (PArray _ ys)
= PArray n# (updatePD xs is ys)
fromListPA# :: PA a => Int# -> [a] -> PArray a
{-# INLINE_PA fromListPA# #-}
fromListPA# n# xs
= PArray n# (fromListPD n# xs)
fromListPA :: PA a => [a] -> PArray a
{-# INLINE fromListPA #-}
fromListPA xs
= case length xs of
I# n# -> fromListPA# n# xs
nfPA :: PA a => PArray a -> ()
{-# INLINE nfPA #-}
nfPA (PArray _ xs)
= nfPD xs