knuthBendix算法不能通过Control.Parallel并行化?

H. *_*ell 3 parallel-processing multithreading haskell knuth

我正在尝试将knuthBendix应用于大量的重写规则.因此,我尝试让它在不同的集合上并行工作.

例如,我尝试运行:

import Control.Parallel
import Control.Parallel.Strategies
import Math.Algebra.Group.StringRewriting

knuthBendixOptimized rs = as' `par` bs' `pseq` as' ++ bs' where
    (as, bs) = splitAt 3000 rs
    as' = knuthBendix as
    bs' = knuthBendix bs
Run Code Online (Sandbox Code Playgroud)

我编译使用ghc -threaded,我执行通过+RTS -N.如果我并行运行其他算法,它就可以工作.但对于knuthBendix,它没有.

有人知道解决方案吗?

谢谢,弗兰兹

Pet*_*lák 5

我相信问题在于你在打电话as' `pseq`.这评估as'为WHNF,这意味着它只确定列表是否为空.但是您希望对列表进行全面评估:

import Control.Parallel.Strategies    

forceList :: [a] -> [a]
forceList = withStrategy (evalList rseq)
-- or use rdeepseq to force the evaluation of everything

knuthBendixOptimized rs =        forceList as'
                          `par`  forceList bs'
                          `pseq` as' ++ bs'
  where
    (as, bs) = splitAt 3000 rs
    as' = knuthBendix as
    bs' = knuthBendix bs
Run Code Online (Sandbox Code Playgroud)

请注意,Haskell通常的术语是并行性.而并发用于在明确工作IO与线程和他们沟通.请参阅GHC手册.