Tôi đang plaing với các chức năng Haskell song song par
và pseq
và tôi đã khám phá điều gì đó thú vị.Hiệu suất tính toán danh sách song song Haskell
ví dụ của tôi dựa trên các ví dụ từ cuốn sách Real World Haskell 's (Parallel programming in Haskell):
mã chung:
import Control.Parallel (par, pseq)
-- <<sorting code goes here>>
force :: [a] ->()
force xs = go xs `pseq`()
where go (_:xs) = go xs
go [] = 1
main = do
print $ take 10 $ parSort [0..1000000]
Mã Phân loại 1 (lấy từ cuốn sách):
parSort :: (Ord a) => [a] -> [a]
parSort (x:xs) = force greater `par` (force lesser `pseq`
(lesser ++ x:greater))
where lesser = parSort [y | y <- xs, y < x]
greater = parSort [y | y <- xs, y >= x]
parSort _ = []
mã phân loại 2 (biến thể của tôi tùy chỉnh):
parSort :: (Ord a) => [a] -> [a]
parSort (x:xs) = force greater `par` (lesser ++ x:greater)
where lesser = parSort [y | y <- xs, y < x]
greater = parSort [y | y <- xs, y >= x]
parSort _ = []
Compile & chạy với: ghc -O2 -threaded --make Main.hs && time ./Main +RTS -N8
là gì thú vị, biến thể của tôi là một chút nhanh hơn so với những cuốn sách một:
sorting code 1 - avg. 16 seconds
sorting code 2 - avg. 14 seconds
Tôi muốn hỏi bạn tại sao chúng ta có thể quan sát hành vi như vậy và nếu giải pháp của cuốn sách mang lại bất kỳ lợi ích nào cho tôi. Tôi rất muốn hiểu sâu sắc tại sao giải pháp này có thể hoạt động tốt hơn.