packages feed

dph-examples-0.6.0.1: examples/smoke/sharing/Indices/Vectorised.hs

{-# LANGUAGE ParallelArrays #-}
{-# OPTIONS -fvectorise #-}
module Vectorised (indicesPA, indices) where
import Data.Array.Parallel
import Data.Array.Parallel.Prelude.Int  as I
import Data.Array.Parallel.Prelude.Bool
import qualified Prelude as P


{-# NOINLINE indicesPA #-}
indicesPA :: PArray Int -> PArray Int -> PArray Int
indicesPA arr ixs
        = toPArrayP (indices (fromPArrayP arr) (fromPArrayP ixs))

indices :: [:Int:] -> [:Int:] -> [:Int:]
indices arr ixs
 = treeLookup arr ixs

{-# NOINLINE treeLookup #-}
treeLookup :: [:Int:] -> [:Int:] -> [:Int:]
treeLookup table xx
 | lengthP xx I.== 1
 = [: table !: (xx !: 0) :]
        
 | otherwise
 = let   len     = lengthP xx
         half    = len `div` 2
         s1      = sliceP 0    half xx
         s2      = sliceP half half  xx           
   in    concatP (mapP (treeLookup table) [: s1, s2 :])