나는 리프에 일련의 값을 저장하는 간단한 트리와 테스트를 용이하게하는 몇 가지 간단한 함수를 가지고있다.어떻게 하스켈에서이 트리를 병렬로 줄일 수 있습니까?
제한된 수의 프로세서가 있고 트리 균형이 잡히면 대수 결합 연산 (+, *, min, lcm)을 대수적으로 사용하여 트리를 줄일 수 있어야합니다.
Tree를 Foldable의 인스턴스로 만들면 기본 제공 함수를 사용하여 트리를 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 순차적으로 줄일 수 있지만 선형 시간이 걸립니다.
하스켈을 사용하여 이와 같은 트리를 병렬로 줄이려면 어떻게해야합니까?
parCata fLeaf fNode = go where
go (Leaf z) = fLeaf z
go (Node l r) = gol `par` gor `pseq` fNode gol gor where
gol = go l
gor = go r
그러나 심지어 cata
의 관점에서 기록 될 수있다 :
cata fLeaf fNode = go where
go (Leaf z) = fLeaf z
go (Node l r) = fNode (go l) (go r)
내가 평행 한 꽤 간단하게 적용 할 것입니다 가정 :
{-# LANGUAGE DeriveFoldable #-}
data Tree a = Leaf a | Node (Tree a) (Tree a)
deriving (Show, Foldable)
toList :: Tree a -> [a]
toList = foldr (:) []
range :: Int -> Int -> Tree Int
range x y
| x < y = Node (range x y') (range x' y)
| otherwise = Leaf x
where
y' = quot (x + y) 2
x' = y' + 1
'Foldable'의 구현을 병렬로 맞춤 설정할 수 없습니까? – Xodarap
여러 개의 프로세서로 이진 트리 순회 속도가 빨라진다 [Haskell (병렬)] (http : // stackoverflow.co.kr/questions/27091624/speeding-up-binary-tree-traversal-multiple-processors-haskell-parallel) – jberryman
@Xodarap 어떻게 그럴 수 있습니까? –