Conway'in Yaşam Oyununun bir uygulamasına sahibim. Paralelizm kullanarak mümkünse hızlandırmak istiyorum. Ben paralel bir şekilde eşleyerek farkedilir bir hızlanma beklenen küçük iken böylece profilleme içindeHaskell parMap ve paralellik
life :: [(Int, Int)] -> [(Int, Int)]
life cells = map snd . filter rules . freq $ concatMap neighbours cells
where rules (n, c) = n == 3 || (n == 2 && c `elem` cells)
freq = map (length &&& head) . group . sort
parLife :: [(Int, Int)] -> [(Int, Int)]
parLife cells = parMap rseq snd . filter rules . freq . concat $ parMap rseq neighbours cells
where rules (n, c) = n == 3 || (n == 2 && c `elem` cells)
freq = map (length &&& head) . group . sort
neigbours :: (Int, Int) -> [(Int, Int)]
neighbours (x, y) = [(x + dx, y + dy) | dx <- [-1..1], dy <- [-1..1], dx /= 0 || dy /= 0]
, komşular, harcanan zamanın% 6.3 oluşturuyor.
ben basit işlevi
main = print $ last $ take 200 $ iterate life fPent
where fPent = [(1, 2), (2, 2), (2, 1), (2, 3), (3, 3)]
ile test edilmiş ve
ghc --make -O2 -threaded life.hs
gibi paralel sürümü derlenmiş ve
./life +RTS -N3
paralel versiyonu daha yavaş olduğu ortaya çıktı olarak ran . ParMap'i yanlış mı kullanıyorum? Bu, paralelliğin kullanılabileceği bir durum mu?
Öncelikle, bilgisayarınızda en az 3 çekirdek var mı? İkinci olarak, paralellik her zaman bazı yüklerle birlikte gelir, bu yüzden her bir iş parçacığı tarafından yapılan iş çok küçükse, ekstra yük herhangi bir hız artışından ağır basacaktır. – huon
i bir i5-2500K var, yani parallelising gelen daha algoritma geliştirilmesi dan çok daha büyük kat hızlanma alabilirsiniz – cdk
Not avaliable kesinlikle 4 çekirdeğe kadar yoktur. Zamanın büyük kısmı "sort" ve "elem" de harcanır. Hücre listesinin sıralandığı (ve fPent'in değiştirildiği şekilde değiştirildiği) gerçeğini kullanarak, bu süreyi kabaca yarıya düşürebilirsiniz. –