dph-examples-0.6.0.1: examples/spectral/QuickSort/dph/Vectorised.hs
{-# LANGUAGE ParallelArrays #-}
{-# OPTIONS -fvectorise #-}
{-# OPTIONS -fno-spec-constr-count #-}
module Vectorised (quicksortPA) where
import Data.Array.Parallel
import Data.Array.Parallel.Prelude.Double as D
import qualified Data.Array.Parallel.Prelude.Int as I
import qualified Prelude
{-# NOINLINE quicksortPA #-}
quicksortPA:: PArray Double -> PArray Double
quicksortPA xs = toPArrayP (qsortVect' (fromPArrayP xs))
qsortVect':: [: Double :] -> [: Double :]
qsortVect' xs | lengthP xs I.<= 1 = xs
| otherwise =
let p = xs !: (lengthP xs `I.div` 2)
ls = [:x | x <- xs, x D.< p:]
gs = [:x | x <- xs, x D.> p:]
ss = mapP qsortVect' [:ls, gs:]
in
(ss !: 0) +:+ [:x | x <- xs, x D.== p:] +:+ (ss !: 1)