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