Slide 1

Slide 1 text

ekmett/speculation Mitsutoshi Aoe @ma0e 13೥3݄31೔೔༵೔

Slide 2

Slide 2 text

ekmett/speculation Safe Programmable Speculative Parallelism, PLDI 2010 http://hackage.haskell.org/package/speculation/ https://github.com/ekmett/speculation 13೥3݄31೔೔༵೔

Slide 3

Slide 3 text

Motivating examples Inherently sequential algorithms Lexing Huffman decoding 13೥3݄31೔೔༵೔

Slide 4

Slide 4 text

Timeline - the best-case a f g spec g f a g == a spec :: Eq a 㱺 a → (a → b) → a → b) 13೥3݄31೔೔༵೔

Slide 5

Slide 5 text

Timeline - the worst-case a f g spec g f a g /= a spec :: Eq a 㱺 a → (a → b) → a → b) f a 13೥3݄31೔೔༵೔

Slide 6

Slide 6 text

Timeline - under high load a spec g f a g == a spec :: Eq a 㱺 a → (a → b) → a → b) f a f $! a 13೥3݄31೔೔༵೔

Slide 7

Slide 7 text

Speculation in Haskell spec :: Eq a 㱺 a ! (a ! b) ! a ! b spec guess f a = speculation `par` if guess == a then speculation else f a where speculation = f guess 13೥3݄31೔೔༵೔

Slide 8

Slide 8 text

Speculation in Haskell spec :: Eq a 㱺 a ! (a ! b) ! a ! b spec guess f a = | unsafeIsEvaluated a = f a | otherwise = speculation `par` if guess == a then speculation else f a where speculation = f guess 13೥3݄31೔೔༵೔

Slide 9

Slide 9 text

Speculation in Haskell spec :: Eq a 㱺 a ! (a ! b) ! a ! b spec guess f a = | unsafeIsEvaluated a = f a | numCapabilities == 1 = f $! a | otherwise = speculation `par` if guess == a then speculation else f a where speculation = f guess 13೥3݄31೔೔༵೔

Slide 10

Slide 10 text

Speculating STM specSTM :: Eq a 㱺 STM a ! (a ! STM b) ! a ! STM b specSTM mguess f a = a `par` do guess ← mguess result ← f guess unless (guess == a) retry return result `orElse` f a 13೥3݄31೔೔༵೔

Slide 11

Slide 11 text

Speculating STM specSTM :: Eq a 㱺 STM a ! (a ! STM b) ! a ! STM b specSTM mguess f a = do sparks ← unsafeIOToSTM numSparks if sparks < numCapabilities then a `par` do guess ← mguess result ← f guess unless (guess == a) retry return result `orElse` f a else f $! a 13೥3݄31೔೔༵೔

Slide 12

Slide 12 text

C.C.Speculation.Foldable foldr :: (Foldable f, Eq b) 㱺 (Int ! b) ! (a ! b ! b) ! b ! f a ! b foldr g f z = extractAcc . F.foldr mf (Acc 0 z) where mf a (Acc n b) = Acc (n + 1) (spec (g n) (f a) b) data Acc a = Acc {-# UNPACK #-} !Int a extractAcc (Acc _ a) = a 13೥3݄31೔೔༵೔

Slide 13

Slide 13 text

C.C.Speculation.Traversable traverse :: (Traversable t, Applicative f, Eq a) 㱺 (Int ! a) ! (a ! f b) ! t a ! f (t b) traverse g f xs = runAccT (T.traverse go xs) 0 where go a = AccT $ λi# ! acc (i# +# 1#) (spec (g (I# i)) f a) newtype AccT m a = AccT { runAccT :: Int# ! Acc (m a) } 13೥3݄31೔೔༵೔

Slide 14

Slide 14 text

C.C.Speculation.List scanr :: Eq b 㱺 (Int ! b) ! (a ! b ! b) ! b ! [a] ! [b] scanr g f z = map extractAcc . L.scanr mf (Acc 0 z) where mf a (Acc n b) = let n’ = n + 1 in Acc n’ (spec (g n’) (f a) b) 13೥3݄31೔೔༵೔

Slide 15

Slide 15 text

C.C.Speculation.Class class MonadSpec m where specByM :: (a ! a ! Bool) ! a ! a ! m b specByM’ :: (a ! a ! Bool) ! a ! a ! m b specM :: (MonadSpec m, Eq a) 㱺 a ! a ! m a 13೥3݄31೔೔༵೔

Slide 16

Slide 16 text

Speed optimizations unsafeIsEvaluated :: a ! Bool ekmett/tag-bits numSparks# :: State# s ! (# State# s, Int# #) since GHC 7 (#4167) 13೥3݄31೔೔༵೔

Slide 17

Slide 17 text

Demo Speculative lexing from “Parallelizing the Web Browser” https://gist.github.com/maoe/5279239 13೥3݄31೔೔༵೔